【HDFS】Hadoop DISTRIBUTED FILE SYSTEM
THE CAST
CLIENT:人们都坐在客户端前,向客户端输入/输出数据
NAMENODE:服务端只有一个,负责协调HDFS存储系统,例如数据分配情况,备份策略,故障诊断等
DATANODE:用于存储数据的集合,结构为一个cluster包含诺干个racks,一个racks包含诺干个datanode,datanode也就相当于我们磁盘,而racks相当于磁盘阵列
HDFS系统write操作
一个人对client说:请帮我写入200M数据好吗?
Client speak:我很荣幸,但你没有忘记什么嘛?
一个人说:a划分块大小128M(用于存放数据) b复制一个块到三个地方
Client speak:一个合格的client要知道2件事
(1)块大小:一个大文件存储在若干个块中,每个块通常64M or 128 M
(2)多路复用:一个块要保存到多个地方,通常为3
uClient ask Namenode
第一步 client划分一个大文件的块大小,用于存储文件内容
第二步 client对Namenode说请帮助我分配一个128M的块(datanode上)并多路复用到3个地方
unamenode分配datanode
第一步 Namenode需要找到3个datanode
第二步 Namenode整理一下3个datanode地址,发送给client
uClient开始写数据
第一步 Client发送数据只到第一个datanode节点,当第一个datanode节点接收到数据的同时会同步到第二个datanode节点,第二个也会同步到第三个节点,以此类推直到最后一个节点为止
第二步 一旦所有的数据都写入磁盘后,所有的datanode就向Namenode发送完成信号
第三步 Namenode就会显示块已保存,并且已经复用
第四步 Client会用同样的步骤完成后续数据写入
u当写完所有块后
第一步 当写完所有块后,Client就会关闭文件,并告之Namenode停止传输
第二步 Namenode此时就会知道所有的数据信息都保存在磁盘中
uRecap重述
Client 用于划分保存文件的块
Namenode 用于提供保存块的datanode节点信息,包括所有的多路复用节点
Datanode 用于保存数据
HDFS 集群read操作
一个人对client说:请帮我读取相关文件
Client speak:Roger好的知道了!
u交互Namenode
Client -> Namenode:请给我关于这个文件的信息(传输filename到Namenode)
Namenode –> Client:回复存储这个文件所有的块信息给Client,按datanode到Client的距离进行排序,实际上就是知道块存储在哪个datanode上,先从最近的节点读取数据
例 Block1:at DN x1 y1 z1
Block2:at DN x2 y2 z2
Block3:at DN x3 y3 z3
Client:a.知道有多少个块(关于这个文件)需要下载
b.还知道每个块保存在哪些datanode上
因此Client会依次下载这些块到本地
u数据下载流程
Client:先从最近的datanode节点下载数据,它要跟datanode作一个交互,申请获取相关块信息,datanode返回块数据
可能你会问到,如果datanode硬件损坏啦,没有相关数据啦,数据本身造破坏不能恢复啦,这些不幸的事情时我们有没有好的办法呢,呵呵木要担心下面我们就会讲到故障容错的理念
HDFS故障容错第一部分故障类型与检测
1.三种典型故障
1)node failure节点故障(namenode服务器 datanode数据节点)节点硬件故障
2)communication failure通信故障
不能发送和接收数据,有可能datanode脱离了网络,找不到大家了
3)data corruption数据损坏,两种可能
当数据传输到网络中时损坏
当在磁盘存储时数据损坏
2.检测节点故障
1)如果Namenode服务器不可用了,那么整个分布式集群也就不可用了,namenode是单点故障
2)相对于Namenode服务器我们更专注于检测datanode数据节点
3)那么我们如何检测呢?方法如下
Datanode每三秒发送心跳给namedata,说明我们还存活着。如果在10分钟之内namenode还没有获取到心跳消息,就认为datanode不可用了。但有可能datanode还活着,只是网络故障造成的,但namenode还是认为datanode不可用。
3.检测网络故障
1)Client每当向datanode写数据时,datanode都会给一个确认ACK信号,表示接收无误
2)Client没有收到ACK信号,就假设datanode或网络故障
4.检测数据损坏故障
1)Client给datanode传输信息时,信息包括2部分,checksum校验和、真实数据
2)Datanode即存储数据也存储校验和 【Linux公社 】
检测损坏硬盘,由datanode定期发送块报告给namenode,这个块报告列出了所有的块信息。
注释:Datanode先检查checksum校验和是ok的,才发送块报告,因为块报告不包括坏块信息
举例:Datanode发送块报告时不包括坏块信息(假如发送4个块),Namenode在和原来“校验和”对比后认为原来应该有5个块,那么说明有一个块损坏了
5.重述心跳信息和块报告
1)Datanode每3秒钟向Namenode发送心跳信息,表示我还活着
2)datanode在发送块报告的时候会自动跳过坏块信息,只发送好块信息
3)namenode在接收到块报告后与原来的校验和进行对比,总块数-好块数=坏块数
HDFS故障容错第二部分处理读写故障
1.处理写错误
1)我们写入块的最小数据单位是包(通常64K),记住多路复用流水线
注意:此外datanode要给client端发送接收到包的ACK确认信息,以便确认datanode完全接收到了数据包。
2)如果client端从一些datanode节点上不能获得ACK确认信息,就认为这些datanode已不可用,因此client需要调整多路复用流水线,以跳过这个损坏的datanode节点,但不会影响其他的正常的datanode。
3)在调整多路复用之后namenode将会查看损坏的datanode
2.处理读错误
1)当client端询问一个块位置时,namenode将返回client端所有的datanode节点地址。
2)如果client发现一个datanode不可用了,将会从其他的datanode处获取数据
HDFS故障容错第三部分处理数据节点故障
1.首先,Namenode保存了2个重要的表
1)块信息表,包含块保存在哪些datanode节点上
2)节点信息表,包含datanode节点保存哪些块
2.再次,Namenode不间断更新这2个表
1)如果namenode在datanode上发现一个坏块,就会更新块信息表,在表里标识坏块在哪个datanode上
2)如果namenode发现datanode节点不可用了,就会更新2个表(块信息表,节点信息表),在2个表中同时标识不可用datanode节点信息