本案例通过搭建服务器集群,安装Hadoop组件,实训演练Hadoop的核心组件HDFS分布式文件系统的读、写流程和原理
1、搭建服务器集群,为每个机架配置三台服务器,建立通信联系
(每个块的大小可以通过配置参数(dfs.blocksize)来规定,默认的大小在hadoop2.x版本中是128M,在之前的版本中是64M。)
请求上传文件
可以上传
请求第一个块文件上传
接收信息
请求上传文件
返回是否可以上传
请求Block1上传到哪几个
DataNode服务器上
返还可以上传的数据节点
检查目标文件是否已存在
父目录是否存在
查询可用的数据节点,返回3个
DataNode节点,分别为DataN
ode1、DataNode2、DataN
ode3
请求建立block1
请求建立
block1
传输通道
请求建立
block1
传输通道
应答成功
IO存储备份
成功
IO存储成功
传输第一个
网络传输备份
网络传输备份
IO存储备份成功
IO存储备份成功
IO存储成功
Block1:{{value7}},{{value8}},{{value9}}
Block2:{{value7}},{{value8}},{{value9}}
Block3:{{value7}},{{value8}},{{value9}}
Block4:{{value7}},{{value8}},{{value9}}
步骤①: Client向NameNode发送信息,告知NameNode自己想读取哪一份文件
步骤②: NameNode查找自身存下来的元数据(meta data)。为Client生成一张清单消息,这个消息包括:
待读取的文件在集群上所有的block信息。
每一个block信息的副本所存放的DataNode的ip地址(有3个副本就有3个DataNode)。同时对这3个地址,按照其和Client的距离排好序。
步骤③: 客户端拿到清单,联系相关的DataNode,请求文件块。DataNode返回文件块给客户端。客户端会选取排序靠前的DataNode来依次读
取Block块,每一个Block都会进行CheckSum若文件不完整,则客户端会继续向NameNode获取下一批的Block列表,直到验证读取出来文件是
完整的,则Block读取完毕。
步骤④客户端会把最终读取出来所有的Block块合并成一个完整的最终文件。
Block1:{{value7}},{{value8}},{{value9}}
Block2:{{value7}},{{value8}},{{value9}}
Block3:{{value7}},{{value8}},{{value9}}
Block4:{{value7}},{{value8}},{{value9}}
一、 分布式文件系统
分布式文件系统是横跨在多台计算机上的存储系统,是分布式系统的一个应用子集。这些互相联网的计算机,也被称为集群。
Hadoop Distributed File System(简称 HDFS)是一个分布式文件系统,是
Hadoop
的核心组件之一。它能够将大规模数据存储到多个服务器集群上,并提供数据访问服务。它的主要优势是:
•
高容错性(受益于它的“副本拷贝”机制和“机架感知”机制),适合部署在廉价的机器上。
• 高吞吐量的数据写入和访问
二、HDFS的架构
HDFS中有三个重要的模块:NameNode(名称节点)、DataNode(数据节点)和Client(客户节点)。这三个模块用典型的master/slave(主从)模式进行搭建。

1、NameNode:即master节点。是分布式文件系统中的管理者。
NameNode的主要职责有:
• 管理文件系统的命名空间
• 管理集群的配置信息
•
管理文件块(block)的复制(文件块是HDFS中的基本读写单元,在下面会细说)
• 监测DataNode及其所存储的数据的情况(心跳机制和数据报告机制)
为了履行好这些职责,NameNode将文件系统的元数据(meta
data)存放在自己的内存中,元数据里主要包括:
• 文件信息
• 每一个文件对应的文件块的信息(block_id)
• 每一个文件块所存放的DataNode的信息
NameNode是整个HDFS中唯一的单点,因此它一旦故障,就会引起整个集群的故障。针对此做了一个防护措施,即构建一个节点Secondary
NameNode,该节点定期与NameNode进行通信,获取元数据的快照存储下来。
2、DataNode:即slave节点,是真正存放文件数据的地方。更严谨地说,它存放的是文件块。
•
通过心跳机制(heartbeat),它每隔3s就会向NameNode发送一次心跳,告诉NameNode自己没宕机。如果NameNode连续10min都没有收到心跳,它会认为这个DataNode已经死掉,所以将这个DataNode移出集群,并启动一个进程恢复数据,同时做好相应记录。
•
通过数据报告机制,它在固定的周期内会向NameNode发送自己存储的所有文件块的信息(验证和校验)。这个机制让NameNode知道哪些数据副本已经损坏,及时创建副本(只要DataNode没死掉),并做好记录。
3、Client:客户端,它的主要职责如下:
• 切分文件。把一份文件切分成若干个文件块。
• 与NameNode进行交互,获得文件信息和相关的DataNode的信息。
• 与DataNode进行直接交互,进行相关的数据流操作。
以上三种类型的节点承担起了HDFS运作的主要工作,在Hadoop中,还有另外两个主要节点:JobTracker(作业跟踪节点)和TaskTracker(任务跟踪节点)。这两个节点在MapReduce的运作中起到重要作用。由于这里只关注HDFS数据的写和读,因此先略过这两个节点。在数据计算,即MapReduce中,再来看这两个节点。
三、HDFS写入数据

步骤1:Client想写入一份文件,它首先将文件切分成若干个块(block),每个块64MB(或128MB)。例如原始文件200MB,则它被切分成四块,分别是64+64+64+8。
然后它开始逐个处理文件块,针对第一个文件块(以下简称block1),它向NameNode发生请求:
• 每一个文件块,我都想在集群上存3个副本
• 因此,请帮我在集群上找到3个可以存副本的DataNode
“3”只是个默认值,Client可以自定义想要存放的副本个数
步骤2:NameNode接收到Client的信息,做了如下处理
• 把这个文件块复制3份
• 为这个文件块找到可用的三个数据节点:DateNode A,DataNode E和DataNode
F。在找可用数据节点的过程中,NameNode启用了机架感知机制(rack-awareness):
若Client在集群中,则将Client所在的节点选为第一个数据节点。
若Client不在集群中,则随机选择一个节点。
• 就这样,NameNode选中了DataNode A
•
第二个数据节点需要满足:和第一个数据节点在不同的机架(rack)上。就这样。NameNode选择了DataNode
E。
•
第三个数据节点需要满足:和第二个数据节点在同一个机架上。就这样,NameNode选择了DataNode
F
采用机架感知机制的原因是,在存放运行Hadoop和HDFS机器的数据中心中,一个机架共享同一个电源,网线和交换机。因此如果有意外,通常是一整个机架上所有的机器一起宕机。所以把副本存放在不同的机架上,也是为了有效应对这个情况。
•
将选好的三个数据节点的相关信息告诉Client,让Client自己和数据节点进行交流
• 步骤3:Client接收到数据节点信息,接下来发生了几件事:
Client直接联系DataNode A,告诉它存放一个block1的副本;
DataNode A联系DataNode E,告诉它存放一个block1的副本;
DataNode E联系DataNodeF,告诉它存放一个block1的副本。
•
步骤4:三个副本都存放在各自的DataNode上后,三个DataNode给NameNode发送消息,告知NameNode存放已经完成。
• 步骤5:
第一个block的存储结束后,其余block按照相同的流程进行存储。所有block存完之后,Client将会通知NameNode终止写入流程。
四、HDFS读出数据

• 步骤1: Client向NameNode发送信息,告知NameNode自己想读取哪一份文件
• 步骤2: NameNode查找自身存下来的元数据(meta
data)。为Client生成一张清单消息,这个消息包括:
待读取的文件在集群上所有的block信息。
每一个block信息的副本所存放的DataNode的ip地址(有3个副本就有3个DataNode)。同时对这3个地址,按照其和Client的距离排好序。
• 步骤3:
客户端拿到清单,联系相关的DataNode,请求文件块。DataNode返回文件块给客户端。返回完毕后关闭连接