HDFS秒懂
- HDFS定义
- HDFS优缺点
- HDFS组成架构
- NameNode工作机制
- [Secondary NameNode工作机制](#Secondary NameNode工作机制)
- DataNode工作机制
- 文件块大小
- 文件写入流程
- 机架感知
- 文件读取流程
- HDFS的shell操作
HDFS定义
HDFS(Hadoop Distributed File System)是一个分布式的文件系统,用户存储文件,通过目录树来定位文件,适合一次写入,多次读出的场景,不支持文件的修改
HDFS优缺点
优点
- 高容错性:数据保存在多个副本,某一个副本数据丢失后,可以自动恢复
- 适合处理大数据:数据规模可达到GB、TB级,能够处理百万规模的文件数量
- 可构建在廉价的机器上:通过多副本机制,提高可靠性
缺点
- 不适合低延时数据访问:毫秒级的存储是做不到的
- 无法高效的对大量小文件进行存储:小文件的寻址时间会超过读取时间
- 不支持并发写入和文件随机修改:一个文件只能一个写,不允许多个线程同时写;仅支持数据追加,不支持文件修改
HDFS组成架构
NameNode
NN,Master,它是一个主管、管理者
- 保存HDFS上所有文件的元数据
- 维护副本数
- 管理数据块(block)的映射信息
- 处理客户端请求
DataNode
DN,就是Slave,数据节点
- 存储数据块
- 执行对数据块的操作
Secondary NameNode
2NN,不是NN的热备
- 辅助NameNode分担工作量, 定期进行checkpoint
- 紧急情况下,可辅助恢复NameNode
Client
客户端
- 通过命令管理和访问HDFS
- 文件切分与合并
NameNode工作机制
元数据的存储
-
元数据存储在fsiamge文件和edits文件中
-
了解NameNode的文件
1、fsimage:NameNode内存中元数据序列化后形成的文件,元数据的快照文件
fsimage文件的产生:
1)第一次格式化NN时,此时会创建NN的工作目录,在目录中生成一个fsimage_000...000文件
2)当NN在启动时,NN会将所有的edits文件和fsiamge文件加载到内存合并得到最新的元数据,将元数据持久化到磁盘生成新的fsimage文件
3)如果启用了2NN,2NN也会辅助NN合并元数据,并将合并后的元数据发送给NN
查看faimage文件:
语法:hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
实例:hdfs oiv -p XML -i fsimage_0000000005067017090 -o /opt/fsimage.xml2、fsimage_xxx.md5:是对应文件的md5值文件,用来保证fsimage的一致性
3、edits:记录客户端更新元数据信息的每一步操作
txid:
每次更新元数据的写操作命令会被分解为若干步,每一步都会有一个id,这个id称为txid,也叫事务id
edits文件的产生:
NN在启动之后,每次更新元数据的操作,都会将命令记录到edits_inprogress文件中,当达到指定条件之后,会进行滚动生成edits_txid文件,
同时生成新的edits_inprogress文件来记录新的操作,等edits_inprogress文件再次满足条件后继续滚动,以此循环
edits_inprogress的滚动条件:
1)操作次数:默认txid达到100万次,会自动滚动生成edits文件,参数可配置
2)时间:默认每2分钟文件自动滚动生成edits文件,时间可配置
3)重启:当NN被重启的时候,也会自动触发edits_inprogress的滚动
4)手动执行滚动:通过命令hdfs dfsadmin -rollEdits强制滚动edits_inprogress
查看edits文件:
语法:hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
实例:hdfs oev -p XML -i edits_0000000005067128882-0000000005067142023 -o /opt/edits.xml4、edits_inprogress:正在使用的编辑日志文件
5、seen_txid:文件保存的是一个数字,是edits记录里txid的最后一个数字
6、VERSION:记录的是NameNode的集群信息
namespaceID : 文件系统的唯一标识符,管理一组blockpoolID
clusterID: 集群ID
cTime: NameNode存储系统的创建时间
storageType: 说明该存储目录包含的是NameNode的数据结构
blockpoolID: 针对每一个NamespaceID所对应的blockpool的ID
layoutVersion:HDFS永久性数据结构的版本信息
每次格式化NN,会产生一个VERSION文件,重新生成clusterID和blockpoolID,blockpoolID会被DN领取,生成一个同名的目录,每次DN启动时,
会将这个同名目录中的块上报给NN,DN在第一次启动时,如果没有VERSION信息,会向配置文件中配置的NN发起请求,生成VERSION,加入到集群
启动流程
-
加载fsimage
fsimage文件记录了自最后一次检查点之前HDFS文件系统中所有目录和文件的序列化信息
-
加载edits
edits文件记录了最后一次检查点之后所有针对HDFS文件系统的操作,加载了这两个文件后确保了数据的完整性和一致性
-
记录checkpoint
在NN启动时,edits_inprogress文件会回滚,也会再生成一个新的fsimage文件,这样在本次启动之前的所有数据都被保存,记录本次检查点,以便更新新的操作
-
安全模式
在加载完fsimage和edits文件后,NN开始监听DN请求,在这个过程期间,NN一直运行在安全模式,在安全模式下只能进行有限的读操作,不能对hdfs文件系统做任何修改,各个DN会向NN上报最新的块信息,在整个系统中99.9%的块满足至少有一个副本,NN会在30秒后退出安全模式
# 基本语法 hdfs dfsadmin -safenode get (功能描述:查看安全模式状态) hdfs dfsadmin -safenode enter (功能描述:进入安全模式状态) hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态) hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态,hdfs接收的命令会等待,待离开安全模式后依次执行)
工作流程
Secondary NameNode工作机制
checkpoint
checkpoint是一种HDFS元数据的备份机制,元数据信息依据触发条件被定期写入持久化存储
- checkpoint 默认触发条件
- 每隔1小时触发一次
- edits产生了100万次的操作记录
工作流程
DataNode工作机制
工作流程
- DataNode启动后向NameNode注册,通过后,每1小时向NameNode上报所有的块信息
- 每3秒一次心跳,心跳返回结果带有NameNode给该DataNode的命令
- 如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用
数据完整性
- 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
- 当DataNode读取Block的时候,它会计算CheckSum(校验和)
- 如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏
- Client会复制其他DataNode上的Block
- DataNode在其文件创建后周期验证CheckSum
文件块大小
- HDFS中的文件存储在物理上是分块存储(block),Hadoop1.x默认大小是64M,Hadoop2.x默认大小是128M
块的大小设置基于最佳传输损耗理论!在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输!目前硬件的发展条件,普通磁盘写的速率大概为100M/S, 寻址时间一般为10ms!一次传输时间就是1s,所以块的最佳大小为100M,块的大小最好为2的n次方,所以最接近的就是128M,如果磁盘的传输速率很快,例如是300M/S,那么块大小就可以调整到 256M,可以通过dfs.blocksize参数进行设置。
块太小的缺点
- 同样大小的文件在存储时,块太小会占用更多的NN的元数据空间
- 在进行读写操作时,DFS存储了大量的小文件,会消耗额外的寻址时间
块太大的缺点
- 块太大,在读取块内某一部分数据场景时,需要将整个块下载后再读取内容,会带来更多额外的网络消耗,不够灵活
- 在上传文件时,一旦发生故障,需要将整个块文件重新上传,那么之前上传文件的资源开销就会浪费
- 默认块大小为128M,128M指的是每个块最多存储128M的数据,如果当前块存储的数据不满128M,那么存了多少数据,就占用多少的磁盘空间!
- 一个块只属于一个文件!
文件写入流程
- 流程详细说明
流程5:客户端根据返回的DN节点,请求建立传输通道,客户端向最近的DN节点发起通道建立请求,由这个DN节点依次向通道中的距离当前节点距离最近的下一个节点发送建立通道请求,各个节点发送响应,通道建立成功
流程7:客户端每读取64K的数据会封装为一个packet(数据包),每个packet为64K,由若干个chunks组成,每个chunks是512B,还会包含一个checksum(校验和),封装成功的packet会放到一个叫做dataQuene的队列中,按顺序发送到通道里第一个DN节点,节点收到packet之后,再送到通道的下一个节点,发送过之后的packet会被放入到ackQuene队列里,当所有的DN节点返回了成功的ack确认消息,这个packet会在ackquene队列中删除。一旦发生错误,ackQuene队列里的小包会回滚到dataQuene,在原始通道里把坏的节点剔除掉,再重新建立一个新的通道继续传输。
ACK (Acknowledge Character)即是确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示发来的数据已确认接收无误。在 pipeline 管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全
流程8:第一个块传输完成后,DN向NN上报块的消息,只要有一个DN节点上报块信息,NN就认为这个块已经传输完成,通道关闭,开始下一个块的传输,重复3-8的流程
副本数如果暂时不满足条件,之后NN会自动检查,维护副本数
机架感知
机架感知是一种能够识别集群中各个节点所属机架,并在任务调度和数据块副本放置时利用这些信息来优化数据传输和任务执行效率
作用
- 提高数据传输效率
- 增强容错能力
- 优化任务调度
策略
- 第一个副本放在本地机架的一个DN节点
- 第二个副本放在本地机架的另一个DN节点(本地机架的网络拓扑距离最多为2,速度快)
- 第三个副本放在其他机架的一个DN节点(考虑安全性)
- 更多的副本,放置在相对空闲的其他DN节点上
文件读取流程
流程3:NN将文件所对应block的存储地址放入一个队列,客户端从队列中依次按每一个block对应地址来取出数据,也是按照packet进行读取,读取的时候可以多个DN一起读取
流程4:读取完一个block之后,会对这个block进行一次checksum验证,验证这个block的数据总量是否正确。如果不一致,说明这个block已损坏,客户端会通知NN,再从其他节点上读取该block,NN收到消息会重新备份一次,并发指令给这个DN将这个坏的block删掉
HDFS的shell操作
bash
bin/hadoop fs command
OR
bin/hdfs dfs command
# hadoop fs : 既可以对本地文件系统进行操作还可以操作分布式文件系统
# hdfs dfs : 只能操作分布式文件系统
- 常用命令实例
bash
# 查看文件目录
hadoop fs -ls
bash
# 创建目录
hadoop fs -mkdir
bash
# 删除文件或目录
hadoop fs -rm
bash
# 移动或更名文件
hadoop fs -mv