共计 2132 个字符,预计需要花费 6 分钟才能阅读完成。
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