HDFS系统
1. 读数据流程
客户端开始读取,打开FS,首先从NameNode获取元数据(返回的元数据包括数据块的定义及位置,是否几个副本的位置也同时返回了?),然后根据元数据从各数据节点读取数据,其中数据节点的选择采取就近原则。
问题:读取过程中一个datanode挂掉了,会怎么样?
如果在与datanode通讯时遇到问题,则会寻找最邻近的一个datanode,同时会记住这个故障datanode,保证以后不会重复提取这个节点后续的块。
该机制中,namenode最关键,但其存储的数据量小、功能单一,相对稳定。
2. 网络拓扑规则
将两节点的带宽作为距离的衡量标准。
几个层面:同一机器之间:n1;不同机器之间 d1,不同机架之前:r1;不同数据中心之间d1
目前hadoop对不同数据中心的支持仍然不是很好。
网络拓扑,根据距离,按照树节点的层级关系进行选择节点。
3. 写数据流程
从namenode获取到分配的datanode,然后根据获取的列表,由数据队列和确认队列来逐个写数据。
第1个datanode发给第2个datanode,第2个datanode发给第3个datanode。。。
确认队列用于确认所有都正常写入后,从队列中清除数据。
如果写入过程中出现问题,则关闭管线,确认队列中所有的数据包都添加到队列的最前端,保证故障节点的下游datanode不会漏掉任何一个数据包。
确定一个新的datanode,并从管线中删除故障节点。
4. 复本存储规则
默认策略是:在客户端的节点放置第一个datanode,如果客户端在集群之外,则随机选择一个节点,不过系统会避免挑选存储太慢或者太忙的节点。
第2个副本会放在与第1个机架不同且随机选择一个节点(离架),第3个副本和第2个副本放在相同的机架上,且随机选择一个节点。
其他的副本放在集群中随机选择的节点上,不过系统尽量避免在相同的机架上放太多副本。
这种方法,提供稳定性(数据存储在两个机架上)并实现很好的负载均衡,包括写入带宽(写入操作只需要遍历一个交换机)、读取性能(可以从两个机架中选择读取)和集群中块的均匀分布(客户端只在本地机架写入一个块)
5. HDFS的其他工具
Distcp:批量复制
Archive:存档
-------------------------------------------------------------------------------------------------------------------
作者:CNZQS|JesseZhang 个人博客:CNZQS(http://www.cnzqs.com)
版权声明:除非注明,文章均为原创,可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
--------------------------------------------------------------------------------------------------------------------