1. 写数据机制
Hadoop写入数据的机制和流程如下图所示
简述:客户端与namenode创建连接,namenode返回可以存放副本的datanode列表。客户端与datanode建立连接,datanode之间建立pipeline通道。文件以packet形式向首个datanode传输,并通过pipline自动传送给其他节点。所有节点收到后,进行确认,从发送队列和确认队列中移除packet。
- 客户端首先通过Distributed FileSystem向NameNode发送上传文件请求,NameNode进行校验文件是否已经存在,是否有权限创建。校验通过记录文件,并返回FSDataOutputStream
- 客户端写数据,内部先将输出流数据切分成packet,拍成一个写出的data queue
- 客户端写出时,先从NameNode获取到应该上传的DataNode地址,将他们拍成一个链路通道,先传第一个节点,第一个节点又将数据通过通道传输到第二个节点。以此类推
- 客户端还保存一个确认数据队列,ack queue,同样又packet组成。当节点确认一个packet后,就移除ackqueue中对应的数据。
- 全部传输完成关闭FSDataOutputStream
- 等待最后一个ack信息,并标记文件为完成状态
注:如果通道中有节点异常,会执行以下同步操作(对客户端上层是无感的)
- 通道会停止该节点的传输
- 把ack packet的数据拷贝到dataqueue(放置丢包)
- 删除datanode生未完成的block,将剩余的数据发送到另外的节点
- 完成后datanode自动复制
2. 数据副本的机架感知
为了保证数据副本安全的同时提高数据传输效率,Hadoop会根据机架算法选择距离较近的机器。
根据数据中心、机架、节点,可以定义以下四种距离:
- Distance(同中心、同机架、同节点) = 0
- Distance(同中心、同机架、异节点) = 2
- Distance(同中心、异机架、 - ) = 4
- Distance(异中心、 - 、 - ) = 6
副本节点的选择如下
为了保证数据同步的高效,不存在不同中心的选择。以三个副本为例:
- 第一个副本 - 选择客户端所在的节点(客户端属于集群)或随机节点(客户端不属于集群-web)
- 第二个副本 - 与副本一同机架的随机节点
- 第三个副本 - 与副本一、二不同机架的随机节点
3. 读数据机制
简述:
客户端从namenode获取要下载的文件block块列表;
客户端按顺序从各个节点创建流,获取下载数据。完成当前节点,执行下一节点;
最终执行block的合并;
如果中间某个节点的数据出现错误,客户端会上报给namenode,并返回其他副本的地址,重新下载。