大数据基石之Hadoop的读写流程与2.X架构
Posted 进击的-小胖子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据基石之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
-
-
- 客户端将文件按照块block切分数据,但是按照packet发送数据
- 默认一个packet大小为64K,Block128M为2048个packet
-
- 客户端通过pipeline管道开始使用FSDataOutputStream对象将数据输出
-
- 客户端首先将一个packet发送给node1,同时给予node1一个ack状态
-
- node1接受数据后会将数据继续传递给node2,同时给予node2一个ack状态
-
- node2接受数据后会将数据继续传递给node8,同时给予node8一个ack状态
-
- node8将这个packet接受完成后,会响应这个ack给node2为true
-
- node2会响应给node1 ,同理node1响应给客户端
-
- 客户端接收到成功的状态,就认为某个packet发送成功了,直到当前块所有的packet都发送完成
-
- 如果客户端接收到最后一个pakcet的成功状态,说明当前block传输完成,管道就会被撤销
-
- 客户端会将这个消息传递给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重新挂载到 发送队列,重新发送
-
-
- 最终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
以上是关于大数据基石之Hadoop的读写流程与2.X架构的主要内容,如果未能解决你的问题,请参考以下文章
大数据技术之Hadoop(HDFS)概述Shell操作API操作读写流程工作机制
大数据技术之Hadoop(HDFS)概述Shell操作API操作读写流程工作机制