HDFS组成:
HDFS主要由NameNode,DataNode,SecondaryNameNode组成,进程启动顺序也是如上所示。
NameNode
NameNode是主节点,负责存储文件的元数据,如文件名,文件目录结构,文件属性(创建时间,副本数等等),以及块列表和所对应的DataNode节点。它是一个主服务器,除了负责存储文件元数据以外,还负责控制client对文件的访问,但是client读取数据不是从client这里读。
DataNode
DataNode是数据节点,负责存储文件和文件的校验文件,校验文件包括文件的长度,文件的校验和时间戳。client可以从DataNode中读取数据和写入数据,前提是client从NameNode那里得到允许。
SecondaryNameNode
- SecondaryNameNode是辅助NameNode节点工作的。
- SecondaryNameNode不是NameNode的一个热备份,而是它的冷备份,SecondaryNode定期从NameNode获得FSImage和Edit,将他们合并成新的FSIamge.ckpt,再将FSImage发送回给NameNode。
- 当NameNode宕机时,就可以用SecondaryNameNode记录的信息进行恢复,但是它并不是最新的镜像。
HDFS架构之SecondaryNameNode与Client:
Client
- client负责文件分块,当文件大小超过系统block的大小的时候,需要对文件进行分块,client从NameNode获取如何分块,然后由Client进行数据分块(逻辑),然后再将分好的块写入到相对应的DataNode中
SecondaryNameNode
NameNode两个重要文件:
- fsimage 元数据镜像文件 (保存文件系统的目录树)
- edits 元数据操作日志(针对目录树的更改操作)
元数据镜像
- 内存中保存一份最新的
- 内存中的镜像=fsimage+edits
定期合并fsimage和edits
- edits过大将导致NameNode重启过慢,NameNode启动是先将fsimage加载到内存中,然后再根据edits更改目录树,如果edits过大就会导致重启过慢
- SencondaryNameNode负责定期合并fsimage和edits
SecondaryNameNode合并过程
- SNN通知NN切换到editlog
- SNN通过http get方式从NN获得fsimage和edits
- SNN将fsiamge加入内存,然后开始合并edits
- SNN将新的fsimage.ckpt返回给NN
- NN用新的fsimage替换旧的fsimage
HDFS文件读写流程:
文件读取流程
Client调用FileSystem.open()方法:
- 1).FileSystem通过RPC与NameNode通信,NameNode返回该文件的部分或全部block列表(含有block拷贝的DataNode地址)
- 2).选取距离客户端最近的DataNode建立连接,读取block,返回FSDataInputStream
Client调用FSDataInputStream的read()方法
- 1).当读取到block结尾时,FSDataInputStream关闭与当前DataNode的连接,并为读取下一个block寻找最近的DataNode
- 2).读取完一个Block都会进行checksum验证,如果验证失败,客户端会通知NameNode,然后读取下一个最近的拥有该block拷贝的DataNode
- 3).如果block列表读取完,文件仍然没有结束,那么FileSystem再向NameNode获取下一批block列表
关闭FSDataInputStream.
文件写入流程
Client调用FileSystem的create()方法:
- 1) FileSystem向NameNode发送请求,在namespace中创建新文件,但并不关联任何块
- 2) NameNode验证该文件是否已经存在,操作权限。如果验证通过,NameNode记录新文件信息,并且在某一DataNode上创建数据块
- 3) 返回FSDataOutputStream, 并将Client引导至数据块执行写入操作
Client调用FSDataOutputStream的write()方法:
- HDFS默认将每个数据块放置3份。FSDataOutputStream先将数据写到第一个节点,数据包由第一个节点传送并写入到第二个节点,再由第二个节点到三个节点,最后在由3->2->1->FSDataOutputStream放回ack包,确认复制成功。
Client调用流的close()方法:
- flush缓冲区的数据包,block完成复制份数后,向NN返回成功消息
HDFS高可靠性如何实现:
1.一个NameNode节点多个DataNode节点
2.数据备份机制
- 对数据进行冗余存储
- 机架存放策略(2种)
3.故障检测机制
- 心跳机制 DataNode每3秒向NameNode发送心跳包,表示节点还活着,然后从NameNode接受返回信息,返回信息中可能包括一些数据操作指令。如果NameNode超过10分钟没有接收到某个DataNode节点的心跳包,则表明该节点已经死亡。
- 块报告 DataNode每1个小时向NameNode发送块报告,快报告包含该节点所有的块信息。
- 数据完整性检测
4.SecondaryNameNode辅助NameNode
5.垃圾回收机制
安全模式
hadoop安全模式
- 在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入 安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
- NameNode在启动的时候首先进入安全模式,如果datanode丢失的block达到一定的比例(1- dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态。 dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了 元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。
- 修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。
- hadoop dfsadmin -safemode leave命令强制离开