大家好,又见面了,我是你们的朋友全栈君。
分布式文件存储系统
如上图所示,HDFS 也是按照Master 和Slave 的结构。分NameNode、SecondaryNameNode、DataNode 这几个角色。 NameNode:是Master 节点,是大领导。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS 的名称空间; SecondaryNameNode:是一个小弟,分担大哥namenode的一部分工作量;是NameNode 的冷备份;合并fsimage 和fsedits然后再发给namenode。 DataNode:Slave 节点,奴隶,干活的。负责存储client 发来的数据块block;执行数据块的读写操作。热备份:b 是a 的热备份,如果a 坏掉。那么b 马上运行代替a的工作。冷备份:b 是a 的冷备份,如果a 坏掉。那么b 不能马上代替a工作。但是b 上存储a 的一些信息,减少a 坏掉之后的损失。 fsimage:元数据镜像文件(文件系统的目录树。) edits:元数据的操作日志(针对文件系统做的修改操作记录) namenode 内存中存储的是=fsimage edits。 SecondaryNameNode 负责定时默认1 小时,从namenode上,获取fsimage 和edits 来进行合并,然后再发送给namenode。减少namenode 的工作量。 1.工作机制 NameNode 负责管理整个文件系统元数据;DataNode 负责管理具体文件数据块存储;Secondary NameNode 协助NameNode 进行元数据的备份。HDFS 的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向NameNode 申请来进行。
2.读写流程 HDFS 写数据流程 1、client 发起文件上传请求,通过RPC 与NameNode 建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传; 2、client 请求第一个block 该传输到哪些DataNode 服务器上; 3、NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的DataNode 的地址如:A,B,C; 注: Hadoop 在设计时考虑到数据的安全与高效,数据文件默认在HDFS 上存放三份, 存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。 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 将pipeline ack 发送给client; 7、当一个block 传输完成之后,client 再次请求NameNode 上传第二个block 到服务器。 HDFS 读数据流程 1、Client 向NameNode 发起RPC 请求,来确定请求文件block 所在的位置; 2、NameNode 会视情况返回文件的部分或者全部block 列表,对于每个block,NameNode 都会返回含有该block 副本的DataNode 地址; 3、这些返回的DN 地址,会按照集群拓扑结构得出DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client 近的排靠前;心跳机制中超时汇报的DN 状态为STALE,这样的排靠后; 4、Client 选取排序靠前的DataNode 来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据; 5、底层上本质是建立Socket Stream(FSDataInputStream),重复的调用父类DataInputStream 的read 方法,直到这个块上的数据读取完毕; 6、当读完列表的block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的block 列表; 7、读取完一个block 都会进行checksum 验证,如果读取DataNode 时出现错误,客户端会通知NameNode,然后再从下一个拥有该block 副本的DataNode 继续读。 8、read 方法是并行的读取block 信息,不是一块一块的读取;NameNode 只是返回Client 请求包含块的DataNode 地址,并不是返回请求块的数据; 9、最终读取来所有的block 会合并成一个完整的最终文件。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142959.html原文链接:https://javaforall.cn