1.HDFS第一次亲密接触
答:那是在2012年的第一场雪,公司项目会议上中国联通总部运维部提出二期项目要使用“Hadoop HDFS 分布式集群储”,听到这个词的时候感觉有点云里雾罩,那是我第一次听到Hadoop HDFS,有了这个开头我慢慢的开始关注和学习HDFS,初次只是知道是一个“分布式存储文件系统”可以把数据分布在若干节点,均衡负载并行处理数据,提高数据处理效率,分布的存储在不同节点上思想,很创新,这是我以前没有从来没有遇到过的,后来了解到现在的各大电商,各大互联网公司都在逐步涉猎分布式系统,例如 新浪 已经开始着手研发mysql+hadoop 腾讯 也在开发自己的hadoop分布式系统。这对我们来说既是机遇也是挑战。
展示一下腾讯HDFS底层存储与上层应用

下面我把在网上看到的一篇《HADOOP DISTRIBUTED FILE SYSTEM》漫画版 理论与实践,其中的精髓部分跟大家一起分享一下,这里也写出了我的心得体会,下
面的文章会比较浅显易懂、生动幽默非常适合初学者和刚刚接触HDFS的朋友。
2.HADOOP DISTRIBUTED FILE SYSTEM 漫画版解读
【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
u Client ask Namenode
第一步 client划分一个大文件的块大小,用于存储文件内容
第二步 client对Namenode说请帮助我分配一个128M的块(datanode上)并多路复用到3个地方
u namenode分配datanode
第一步 Namenode需要找到3个datanode
第二步 Namenode整理一下3个datanode地址,发送给client
u Client 开始写数据
第一步 Client发送数据只到第一个datanode节点,当第一个datanode节点接收到数据的同时会同步到第二个datanode节点,第二个也会同步到第三个节点,以此类推直到最后一个节点为止
第二步 一旦所有的数据都写入磁盘后,所有的datanode就向Namenode发送完成信号
第三步 Namenode就会显示块已保存,并且已经复用
第四步 Client会用同样的步骤完成后续数据写入
u 当写完所有块后
第一步 当写完所有块后,Client就会关闭文件,并告之Namenode停止传输
第二步 Namenode此时就会知道所有的数据信息都保存在磁盘中
u Recap重述
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即存储数据也存储校验和
检测损坏硬盘,由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节点信息
3.块复制
1)Namenode定期扫描表,看看哪些数据块,没有成功备份,例如 每次写操作都要同步到其他2个节点上备份,强一致性,定期扫描就是检查有没有备份成功
4.块同步
1)对于所有备份块,Namenode询问其中一个datanode节点上备份是不是从其他二个datanode中同步来的。
2)像这样,Namenode对Datanode说你能从另一个datanode拷贝块吗?
Datanode对另一个Datanode 说我需要从你这里拷贝块,另一个说OK没问题给你!
提出一个问题:
写入的块至少有一个节点接收了就算成功嘛?
HDFS系统支持强一致性,也就是集群中所有节点状态同步一致才行!
HDFS 备份布局策略
Namenode说,记得我答应告诉你,我是怎么选择datanode位置存储备份块的
1.磁盘阵列与datanode关系
一个集群被划分成n个磁盘阵列,每个磁盘阵列又包含多个datanode
2.第一个备份位置选择
第一个备份位置简单,如果要写入的是一个集群节点,它就被选为第一个备份位置,另外随机选择其他datanode节点为第二个或第三个备份位置
3. 第二个或第三个备份位置选择附加条件
在第一个磁盘阵列中保存第一个备份,在另一个磁盘阵列中选择2个不同datanode保存接下来2个备份位置
4.以后备份位置
随机选择datanode,但必须满足2个条件
(1) 每个datanode里最多只有一个备份
(2) 每个磁盘阵列里最多有2个备份
提问:有时候不能满足如上2个条件怎么办呢
如果你知道一个更好的算法,HDFS允许你使用你自己分布式存储算法
组件简介
Namenode
我还可以做许多其他的事,同样做的很好,大家可以在互联网和书中找到关于namenode的信息
Client
我可以做安装和运行HDFS的工作
Datanode
我可以存储很多数据,我还能映射数据备份
小结:HDFS是一个新领域,刚刚接触,它可以用廉价的PC server搭建起大规模的分布式存储系统,这是一个非常实用大数据的分析与应用的架构,在处理海量数据环境下有得天独厚的优势,希望大家可以和我一起来学习Hadoop HDFS
Leonarding
2012.6.27
天津&summer
分享技术~收获快乐
Blog:http://space.itpub.net/26686207
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26686207/viewspace-733979/ ,如需转载,请注明出处,否则将追究法律责任。