分布式文件系统(HDFS)读写流程

HDFS数据副本机制

分布式文件系统(HDFS)读写流程_第1张图片
​1、第一份数据来源于用户的客户端

​2、第二份数据存放在与第一份副本在同一个机架,不同的节点,按照一定的机制(cpu 内存 io 使用率和节点磁 盘剩余容量)选取一个节点进行存放

​3、第三份副本存放在,与第一第二副本不在同一机架,且逻辑距离最近的机架上,按照一定的机制(cpu 内存 io 使用率和节点磁盘剩余容量),选择一个节点进行存放

NameNode的三大作用

​1、维护、管理HDFS的目录数-元数据-名字空间

​2、确定指定的文件块到具体的DataNode结点的映射关系。

​3、维护、管理工作者的心跳信息

DataNode作用

​1、负责数据的读写(响应的是客户端)

​2、周期向NameNode做心跳报告 (节点是否可用、数据是否丢失、校验和)每三秒发送一次心跳报告,10分钟没有心跳NameNode认为该节点宕机。

​3、负责数据的流水线复制(一点一点复制)
分布式文件系统(HDFS)读写流程_第2张图片

HDFS数据写入流程

首先了解 RPC 中文 远程过程调用 是一个调用协议。多个组件之间,多个模块之间进行信息通信协议。
分布式文件系统(HDFS)读写流程_第3张图片
​1、 client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录 是否存在,返回是否可以上传;
​2、 client请求第一个block该传输到哪些DataNode服务器上;
​3、 NameNode根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的DataNode的地址如:A,B,C;
​4、 client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;
​5、 client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
​6、 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipelineack发送给client;
​7、关闭写入流。
​8、 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。

HDFS文件读取流程

分布式文件系统(HDFS)读写流程_第4张图片
​1、客户端通过调用FileSystem对象的open()来读取希望打开的文件。
​2、Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
​3、NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该block副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出DataNode与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client近的排靠前;心跳机制中超时汇报的 DN 状态为STALE,这样的排靠后;
​4、Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数 据(短路读取特性);
​5、底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
​6、并行读取,若失败重新读取
​7、当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
​8、返回后续block列表
​9、最终关闭读流,并将读取来所有的 block 会合并成一个完整的最终文件。

你可能感兴趣的:(hadoop,hdfs)