赞
踩
工作流程: SecondaryNameNode 询问NameNode是否需要checkpoint。直接带回NameNode是否检查结果 , SecondaryNameNode请求执行checkpoint。 NameNode滚动正在写的edits.log日志 , 将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode , SecondaryNameNode加载编辑日志和镜像文件到内存,并合并。 生成新的镜像文件fsimage.chkpoint , 拷贝fsimage.chkpoint到NameNode, NameNode将fsimage.chkpoint重新命名成 fsimage 。主要是解决NameNode启动的时候,edits.log过大需要合并太久问题。
HDFS 调用 open() 返回 FileSystem 调用 open() 返回 distributedFilesystem 调用 DFSInputStream() 返回DFSInputStream 调用openInfo() 调用NameNodeRpcServer 获取到block位置,将block信息写入输出流,保存到DFSInputStream输入流对象中的成员变量中,交给IOUtil,下载文件到本地
2.2 写流程:
(源码可以参照读流程自己看看)
HDFS client 调用文件系统(distributed filesystem)的 create 方法,远程调用 NameNode 中的 create 方法。此时 NameNode 进行4个操作检测自己是否正常,文件是否存在,客户端权限与写日志。此时create的返回值为FSData outputstream对象,此时 HDFS client 调用 write 方法和 NameNode 进行连接,调用 addblock 方法返回 block 分配的 Datanode 列表
主要放在 DFSOutputStream.class 先写入 writeChunk (32768)后 queueCurrentPacket (),置入 createBlockOutputStream , 向DataNode传输,DataNode传输结束会检测checkSum,成功就删除 ack queue 的 package,否则放回 data queue 重传, 结束后关闭流,告诉NameNode,调用complete方法结束
读取数据的完整性:DataNode的存储的除了数据还附带checkSum检验(CRC32算法 32位4个字节大小) , 每次读取完数据后,都会对数据做一次checkSum对比,保证数据传输的完整性
- 1. 命名空间的限制,NameNode 上存储着整个 HDFS 上的文件的元数据,NameNode 是部署在一台机器上的,因为单个机器硬件的限制,必然会限制 NameNode 所能管理的文件个数,制约了数据量的增长。
- 2. 数据隔离问题, 整个 HDFS 上的文件都由一个 NameNode 管理,所以一个程序很有可能会影响到整个 HDFS 上的程序,并且权限控制比较复杂。
- 3. 性能瓶颈, 单个NameNode 时 HDFS文件系统的吞吐量受限于单个 NameNode 的吞吐量。因为 NameNode 是个 JVM 进程,JVM 进程所占用的内存很大时,性能会下降很多。
Federation 中的多个 NameNode 是不同的,可以理解为将一个 NameNode 切分为了多个 NameNode,每一个 NameNode 只负责管理一部分数据。HDFS Federation 中的多个 NameNode 共用 DataNode。
快照是一个只读的基于时间点文件系统拷贝,是整个文件系统的也可以是一部分,用于数据备份,防止用户错误操作和容灾恢复,snapshot 并不影响hdfs的正常操作,修改会按照时间的反序记录,是当前数据减去修改的部分计算出来的,快照会存储在snapshottable的目录下
secondaryNamenode 通过http get 方式把edit.log 和 fsimage信息拉取过来 , 合并产生新文件fsimage.ckpt,再回传给namenode。而客户端对namenode的操作也会产生新日志,单独放在edits.new 文件中。传回fsimage.ckpt会被分解成fsimage edits.log,edits.log和合edits.new的日志文件一同合并作为一份完整的edits.log文件
1 namenode 全权管理数据块的复制,周期性从集群中的每个dataname接收心跳信号和块状态报告,接收心跳信号意味着该datanode工作状态正常,块状态包含datanode上所有数据块的列表
2 DataNode启动时向NameNode注册,通过后周期性地向NameNode上报blockReport,每3秒向NameNode发送一次心跳,NameNode返回对该DataNode的指令,如将数据块复制到另一台机器,或删除某个数据块等···而当某一个DataNode超过10min还没向NameNode发送心跳,此时NameNode就会判定该DataNode不可用,此时客户端的读写操作就不会再传达到该DataNode上
3 hadoop集群刚开始启动时会进入安全模式(99.99%),就用到了心跳机制,其实就是在集群刚启动的时候,每一个DataNode都会向NameNode发送blockReport,NameNode会统计它们上报的总block数,除以一开始知道的总个数total,当 block/total < 99.99% 时,会触发安全模式,安全模式下客户端就没法向HDFS写数据,只能进行读数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。