1、hdfs简介
1.1 什么是HDFS?
HDFS(Hadoop Distributed File System)是hadoop生态系统的一个重要组成部分,是hadoop中的的存储组件,是最基础的一部分,MapReduce等计算模型都要依赖于存储在HDFS中的数据。HDFS是一个分布式文件系统,以流式数据访问模式存储超大文件,将数据分块存储到一个商业硬件集群内的不同机器上。
1.2 HDFS的设计目标
- 存储超大文件 HDFS适合存储大文件,单个文件大小通常在百MB以上 HDFS适合存储海量文件,总存储量可达PB,EB级
- 流式数据访问 为数据批处理而设计,关注数据访问的高吞吐量
- 硬件容错 基于普通机器搭建,硬件错误是常态而不是异常,因此错误检测和快速、自 动的恢复是HDFS最核心的架构目标
- 简单的一致性模型 一次写入,多次读取 一个文件经过创建、写入和关闭之后就不需要改变
- 不支持低时间延迟的数据访问 hdfs关心的是高数据吞吐量,不适合那些要求低时间延迟数据访问的应用。
- 本地计算 将计算移动到数据附近
1.3 HDFS的构成
数据块
- 文件以块为单位进行切分存储,块通常设置的比较大(最小6M,默认 128M)
- 块越大,寻址越快,读取效率越高,但同时由于MapReduce任务也是以 块为最小单位来处理,所以太大的块不利于于对数据的并行处理
- 一个文件至少占用一个块(逻辑概念)
- 冗余备份 数据块非常适合用于数据备份,进而可以提供数据容错能力和提高可用性。每个块可以有多个备份(默认为三个),分别保存到相互独立的机器上去,这样就可以保证单点故障不会导致数据丢失。
Namenode
- namenode 负责维护整个文件系统的信息,包括:整个文件树,文件的块 分布信息,文件系统的元数据,数据复制策略等
Datanode
- datanode 存储文件内容,负责文件实际的读写操作,保持与namenode的 通信,同步文件块信息
Secondary NameNode
- Secondary NameNode是合并NameNode的edit logs到fsimage文件中。Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点,来帮助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的备份。这也是它在社区内被认为是检查点节点的原因。
1.4 HDFS支持的存储文件格式
HDFS 支持任意文件格式
常用的格式有如下几种:
1、sequencefile:k-v格式,比源文本格式占用磁盘更多
2、textfile:行式文本文件,生产中用得较多
3、rcfile:行列混合存储
4、orc:列式存储,生产用的较多
5、parquet:列式存储,生产中用得较多
6、avro:几乎不用,略
7、jsonfile:json格式,几乎不用,略
8、inputformat:几乎不用,略
大数据存储数据,99%以上的场景都是使用的是列式存储
1.5 HDFS小文件问题及解决方案
- 问题描述 大量大小小于块大小的文件
- 背景:每个文件的元数据对象约占150byte,所以如果有1千万个小文件, 每个文件占用一个block,则NameNode大约需要2G空间。如果存储1亿 个文件,则NameNode需要20G空间;数据以块为单位进行处理。
- 影响:占用资源,降低处理效率
- 解决方案:
•从源头减少小文件
•使用archive打包
•使用其他存储方式,如Hbase,ES等
2、hdfs常用命令
# 查看目录下的文件及目录列表
hdfs dfs -ls /
# 创建目录
hdfs dfs -mkdir -p /user/che/1021001
# 拷贝文件到hdfs文件系统中的
hdfs dfs -copyFromLocal /data/test.txt /user/che/1021001/
# 查看文件内容
hdfs dfs -tail /user/che/1021001/test.txt
hdfs dfs -cat /user/che/1021001/test.txt
# 删除文件
hdfs dfs -rm /user/che/1021001/test.txt
# 删除文件夹
hdfs dfs -rm -r /user/che