大数据基石之 Hadoop 的读写流程与 2.X 架构
Hadoop 读写流程与 2.X 架构
安全模式
集群启动时的一个状态,处于安全模式的状态下,只向客户端提供文件的只读视图
HDFS 的权限
HDFS 对权限的控制
只能防止好人做错事
不能防止坏人做坏事
机架感知策略
我们需要将副本放在不同的 DN 节点上,节点也需要一定的考量
可靠性、可用性、带宽消耗
第一个节点
集群内部(优先考虑和客户端相同节点作为第一个节点)
集群外部(选择资源丰富且不繁忙的节点为第一个节点)
第二个节点
选择和第一个节点不同机架的其他节点
第三个节点
与第二个节点相同机架的其他节点
第 N 个节点
与前面节点不重复的其他节点
HDFS 写数据流程
宏观流程
客户端向 HDFS 发送写数据请求
filesystem 通过 rpc 调用 namenode 的 create 方法
nn 首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在,权限
有:NN 会针对这个文件创建一个空的 Entry 对象,并返回成功状态给 DFS
没有:直接抛出对应的异常,给予客户端错误提示信息
3.DFS 如果接收到成功状态,会创建一个对象 FSDataOutputStream 的对象给客户端使用
4.客户端需要向 NN 询问第一个 Block 存放的位置
NN 通过机架感知策略 (node1 node 2 node8)5.需要将客户端和 DN 节点创建连接
pipeline(管道)
客户端和 node1 创建连接 socket
node1 和 node2 创建连接 socket
node2 和 Node8 创建连接 socket
6.客户端将文件按照块 block 切分数据,但是按照 packet 发送数据
默认一个 packet 大小为 64K,Block128M 为 2048 个 packet
7.客户端通过 pipeline 管道开始使用 FSDataOutputStream 对象将数据输出
客户端首先将一个 packet 发送给 node1,同时给予 node1 一个 ack 状态
node1 接受数据后会将数据继续传递给 node2,同时给予 node2 一个 ack 状态
node2 接受数据后会将数据继续传递给 node8,同时给予 node8 一个 ack 状态
node8 将这个 packet 接受完成后,会响应这个 ack 给 node2 为 true
node2 会响应给 node1 ,同理 node1 响应给客户端
8.客户端接收到成功的状态,就认为某个 packet 发送成功了,直到当前块所有的 packet 都发送完成
9.如果客户端接收到最后一个 pakcet 的成功状态,说明当前 block 传输完成,管道就会被撤销
10.客户端会将这个消息传递给 NN,NN 确认传输完成
NN 会将 block 的信息记录到 Entry,客户端会继续向 NN 询问第二个块的存储位置,依次类推
block1 (node1 node2 node8)
block2 (node1 node8 node9)
…
blockn(node1 node7 node9)
当所有的 block 传输完成后,NN 在 Entry 中存储所有的 File 与 Block 与 DN 的映射关系关闭 FsDataOutPutStream
微观流程
1.首先客户端从自己的硬盘以流的方式读取数据文件到自己的缓存中
2.然后将缓存中的数据以 chunk(512B)和 checksum(4B)的方式放入到 packet(64K)
chunk:checksum=128:1
checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
Packet 中的数据分为两类,一类是实际数据包,另一类是 header 包。
一个 Packet 数据包的组成结构
3.当 packet 满的时候加入到 添加到 dataqueue
4.datastreamer 开始从 dataqueue 队列上取出一个 packet,通过 FSDataOPS 发送到 Pipleline
在取出的时候,也会将 packet 加入到 ackQueue,典型的生产者消费者模式
5.客户端发送一个 Packet 数据包以后开始接收 ack,大数据培训会有一个用来接收 ack 的 ResponseProcessor 进程,如果收到成功的 ack
如果某一个 packet 的 ack 为 true,那么就从 ackqueue 删除掉这个 packet
如果某一个 packet 的 ack 为 false,将 ackqueue 中所有的 packet 重新挂载到 发送队列,重新发送
6.最终 DFS 保存的数据格式为
blk_ 为 trunk 文件
blk_ .mate 为 checksum 文件
HDFS 读数据流程
首先客户端发送请求到 DFS,申请读取某一个文件
DFS 去 NN 查找这个文件的信息(权限,文件是否存在)
如果文件不存在,抛出指定的错误
如果文件存在,返回成功状态
DFS 创建 FSDataInputStream 对象,客户端通过这个对象读取数据
客户端获取文件第一个 Block 信息,返回 DN1 DN2 DN8
客户端直接就近原则选择 DN1 对应的数据即可
依次类推读取其他块的信息,直到最后一个块,将 Block 合并成一个文件
关闭 FSDataInputStream
Hadoop1 的困境
单点故障
每个群集只有一个 NameNode,NameNode 存在单点故障(SPOF)
水平扩展
将来服务器启动的时候,启动速度慢
namenode 随着业务的增多,内存占用也会越来越多
如果 namenode 内存占满,将无法继续提供服务
业务隔离性差
丢失 inprocess
评论