Data Block
在HDFS中大文件会被切分成数据块分布在不同的机器上,每个数据块是以单独的文件形式存储在各自的文件系统中。
比如下面一个6440MB的一个大文件会以101个64MB大小的Block的形式存储的。
数据块的分布策略
HDFS会通过冗余进行容灾,增加系统的高可用性。
默认布局规则: (假设复制因子=3)
• 第一份拷贝写入创建文件的节点 (快速写入)
• 第二份拷贝写入位于不同rack的节点 (应对交换机故障)
• 第三份拷贝写入和第二份副本同一个rack内的节点(减少跨rack的网络流量)
HDFS各个组件之间的交互
1.Data Node会定时发送心跳给Name Node, Name Node收到后会返回Ark。
2.Name Node负责负载均衡,以及副本分配。
3.Secondary Name Node负责帮Name Node 合并FsImage和EditLog。
4.Data Node直接对本地磁盘进行读写。
HDFS的读过程
- Client 向 Name Node请求数据,Name Node将文件和副本文件信息进行拓扑距离排序后返回给Client,
- Client根据文件元数据信息,去跟Data Node建立连接去流式读取数据。
- Data Node进行数据块的上传。
- Client 会对数据块进行校验。
拓扑距离
我们在部署机器时,按照范围从大到小会分为不同数据中心,同一数据中心不同机房,同一数据中心同一机房不同机架,同一数据中心同一机房同一机架。
Name Node在放置副本时和返回文件列表原信息会按照拓扑距离进行排序,也就是阿钊两个结点的公共祖先距离进行排序,距离越短说明通信成本越低,速度越快,反之通信成本越高,速度越慢。
HDFS的写过程
- Client向Namee Node请求写数据, Name Node会告诉客户端第一个Block存放的位置, node1, 3, 4。
- Client开启流式通道,流式将第一个Block写入node1,node1负责将Block1的副本写入node3,node3在将写请求转发给node4.
- Block的写入是流式的,比如一个Block的大小是64M,客户端会每次写入4kb的数据到node1,node1同样将这个写请求发送给node3,node3再发送给node4, 写入成功后node4会发送ark给node3,node3会发送ark给node1,node1会发送ark给客户端。
- 数据写入Data Node之后,Data Node会将本身的文件变动以report的形式发送给Name Node。
- 当第一个Block完全写完后,再去和Name Node请求,开始写入第二个Block。
- 循环往复,直到写完所有Block。
读写流程总结
读: Client告诉NN我要读什么文件,NN告诉Client文件位置在哪。
写: NN告诉Client要把数据写到什么位置,Client将数据写到DD。
HDFS的故障恢复
故障类型:
• 磁盘错误和故障
• DataNode故障
• 交换机/机架故障
• NameNode故障
• 数据中心故障
DataNode容灾
Name Node会检测DD的心跳,当DD故障时,会将宕机DD上的数据块自动复制到剩余节点,以满足复制银子。
Name Node容灾
Name Node容灾主要是依赖Secondary Name Node的冷备。
FsImage与EditLog的作用
NameNode的内存中有整个文件系统的元数据,例如目录树、块信息、权限信息等等。
在没有HA的情况下, NN会有单点问题,一旦故障,其内存中的所有元数据会全部丢失。
为了让重启的NameNode获得最新的宕机前的元数据,才有了FsImage和Editlog。
FsImage
• FsImage是整个NameNode内存中元数据在某一时刻的快照(Snapshot)。
• FsImage不能频繁的构建,生成FsImage需要花费大量的内存。
• 目前FsImage只在NameNode重启时才构建。
Editlog
• 而Editlog记录的是从这个快照开始到当前所有的元数据的改动。
• Editlog不能太多,否则重放Editlog会消耗大量时间。
• 这会导致启动NameNode花费数小时之久。
Secondary Name Node的第二个作用
Name Node作为master负责与Client的绝大多数交互,为了减小NN的压力,我们需要另外的一个进程来帮助我们减小Editlog的大小和构建新的fsimage,SNN就承担了这部分任务。
- SNN会将FsImage拷贝一份出来。
- SNN定时从NN查询Editlog,并将Editlog的改动更新到拷贝的FsImage。
- SNN将更新后的FsImage拷贝回NN。