文章目录
3. HDFS 数据流
3.1 HDFS 写数据流程
3.1.1 剖析文件写入
-
Client 向 NameNode 通信请求上传文件,NameNode 检查目标文件是否已经存在,父目录是否已经存在
-
NameNode 返回是否可以上传
-
Client 先对文件进行切分,请求第一个 block 该传输到哪些 DataNode 服务器上
-
NameNode 返回3个 DataNode 服务器 DataNode 1,DataNode 2,DataNode 3
-
Client 请求3台中的一台 DataNode 1(网络拓扑上的就近原则,如果都一样,则随机挑选一台DataNode)上传数据(本质上是一个RPC调用,建立pipeline),DataNode 1 收到请求会继续调用 DataNode 2,然后 DataNode 2 调用 DataNode 3,将整个 pipeline 建立完成,然后逐级返回客户端
-
Client 开始往 DataNode 1 上传第一个 block (先从磁盘读取数据放到一个本地内存缓存),以 packet 为单位。写入的时候 DataNode 会进行数据校验,它并不是通过一个 packet 进行一次校验而是以 chunk 为单位进行校验(512byte)。DataNode 1 收到一个 packet 就会传给 DataNode 2,DataNode 2 传给 DataNode 3,DataNode 1 每传一个 packet 会放入一个应答队列等待应答
-
当一个 block 传输完成之后,Client 再次请求 NameNode 上传第二个block的服务器
3.1.2 网络拓扑概念
在本地网络中,两个节点被称为“彼此近邻”是什么意思?
在海量数据处理中,其主要限制因素是节点之间数据的传输速率——带宽很稀缺
这里的想法是将两个节点间的带宽作为距离的衡量标准
节点距离:两个节点到达最近的共同祖先的距离总和
例如,假设有 数据中心d1 机架r1 中的节点 n1,该节点可以表示为/d1/r1/n1,利用这种标记,这里给出四种距离描述:
Distance(/d1/r1/n1, /d1/r1/n1)=0(同一节点上的进程)
Distance(/d1/r1/n1, /d1/r1/n2)=2(同一机架上的不同节点)
Distance(/d1/r1/n1, /d1/r3/n2)=4(同一数据中心不同机架上的节点)
Distance(/d1/r1/n1, /d2/r4/n2)=6(不同数据中心的节点)
3.1.3 机架感知(副本节点选择)
官方介绍:
http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/RackAwareness.html
http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
3.1.3.1 低版 本Hadoop 副本节点选择
第一个副本在 Client 所处的节点上,如果客户端在集群外,随机选一个
第二个副本和第一个副本位于不相同机架的随机节点上
第三个副本和第二个副本位于相同机架,节点随机
3.1.3.2 Hadoop 2.9.2 副本节点选择
第一个副本在 Client 所处的节点上,如果客户端在集群外,随机选一个。
第二个副本和第一个副本位于相同机架,随机节点
第三个副本位于不同机架,随机节点
3.2 HDFS 读数据流程
-
与 NameNode 通信查询元数据,找到文件块所在的 DataNode 服务器
-
挑选一台 DataNode(网络拓扑上的就近原则,如果都一样,则随机挑选一台 DataNode)服务器,请求建立 socket 流
-
DataNode 开始发送数据(从磁盘里面读取数据放入流, packet(一个 packet 为64kb)为单位来做校验)
-
客户端以 packet 为单位接收,先在本地缓存,然后写入目标文件