Hadoop-组件-HDFS-源码学习-元数据管理-checkpoint
Namenode 会定期将内存中的命名空间(文件目录树、文件目录元信息)保存到 fsimage 文件中,以防止 Namenode 掉电或者进程崩溃。如果 Namenode 实时地将内存中的元数据同步到 fsimage 文件中,会非常消耗资源且造成 Namenode 运行缓慢。所以 Namenode 会先将命名空间的修改操作保存在 editlog 文件中,然后定期合并 fsimage 和 editlog 文件。
一个正常大小的 editlog 文件往往在几十到几百个字节之间,但在某些极端的情况下,editlog 文件会变得非常大,甚至将磁盘空间写满,在 Namenode启动过程中一个很重要的部分就是逐条读取 editlog 文件中的记录,之后与 Namenode 命名空间合并。巨大的 editlog 文件会导致 Namenode 的启动时间过长,为了解决这个问题,HDFS 引入了检查点机制 (checkpointing)。
一、checkpoint 机制概述HDFS 的检查点机制会定时将 editlog 文件与 fsimage 文件合并以产生新的 fsimage 文件。这样 Name ...
Hadoop-组件-HDFS-源码学习-元数据管理-设计-元数据文件-EditLog
一、概述fsimage 始终是磁盘上的一个文件,不能实时跟 Namenode 内存中的数据结构保持同步,并且 fsimage 文件一般都很大,如果所有的更新操作都实时地写入 fsimage 文件,则会导致 Namenode 运行得十分缓慢,所以 HDFS 每过一段时间才更新一次 fsimage 文件。
为了避免两次持久化之间数据丢失的问题,又设计了 Edits log 编辑日志文件,HDFS 将新 fsimage 文件和上一个 fsimage 文件中进行的 Namenode 操作记录在 editlog (编辑日志) 文件中,editlog 是一个日志文件,文件中记录的是 HDFS 所有更改操作(文件创建,删除或修改)的日志,文件系统客户端执行的更改操作首先会被记录到 edits 文件中。
1.1. 文件格式oev 是offline edits viewer 的缩写,该工具不需要hadoop集群处于运行状态。
1$ hdfs oev -i edits_0000000000000000001-0000000000000044061 -o ~/edits.xml
12345678910 ...
Hadoop-组件-HDFS-源码学习-元数据管理-设计-元数据文件-Fsimage
一、概述在 Namenode 中,命名空间(namespace,指文件系统中的目录树、文件元数据等信息)是被全部缓存在内存中的,且 Namenode 重启或者宕机,内存中的所有数据将会全部丢失,必须要有一种机制能够将整个命名空间持久化保存,并且能在Namenode 重启时重建命名空间。
Namenode 将命名空间信息记录在 fsimage(命名空间镜像)的二进制文件中,fsimage 将文件系统目录树中的每个文件或者目录的信息保存为一条记录,每条记录中包括了该文件(或目录)的名称、大小、用户、用户组、修改时间、创建时间等信息。Namenode 重启时,读取 fsimage 文件来重构命名空间。
1.1. 文件格式**oiv ** 是 offline image viewer 的缩写,用于将fsimage文件的内容转储到指定文件中以便于阅读,该工具还提供了只读的WebHDFS API以允许离线分析和检查hadoop集群的命名空间。
oiv在处理非常大的fsimage文件时是相当快的,如果该工具不能够处理fsimage,它会直接退出。该工具不具备向后兼容性,比如使用hadoop-2 ...
Hadoop-组件-HDFS-源码学习-元数据管理-设计-元数据文件
一、概述在 Hadoop 的 HDFS 首次部署好配置文件之后,并不能马上启动使用,而是先要对文件系统进行格式化操作:
1hdfs namenode -format
format 之前,HDFS 在物理上还不存在
此处的 format 并不是指传统意义上的本地磁盘格式化,而是一些清除与准备工作,比如创建元数据本地存储目录和一些初始化的元数据相关文件
1.1. 元数据文件存储目录Namenode 元数据存储目录由参数: dfs.namenode.name.dir 指定,格式化完成之后,将会在 ${dfs.namenode.name.dir}/current 目录下创建如下的文件:
123456789101112[root@5c515555707e current]# tree /data/hadoop/dfs/name/data/hadoop/dfs/name|-- current| |-- VERSION| |-- edits_0000000000000000001-0000000000000044061| |-- edits_inprogre ...
Hadoop-组件-HDFS-源码学习-元数据管理-设计-内存元数据
一、概述元数据(文件系统的命名空间)在 Namenode 的内存中以一颗树的结构来存储。在 HDFS中,不管是目录还是文件,在文件系统目录树中都被看作是一个 INode 节点。如果是目录,则其对应的类为 INodeDireetory:如果是文件,则其对应的类为 INodeFile。 INode Directory 以及 INodeFile 类都是 INode 的派生类。INodeDirectory 中包含一个成员集合变量 children, 如果该目录下有子目录或者文件,其子目录或文件的 INode 引用就会被保存在 children 集合中。HDFS 就是通过这种方式来维护整个文件系统的目录结构的。
二、实现HDFS 元数据(文件系统的命名空间)在 Namenode 的内存中以一颗树的结构来存储。在 HDFS 中,不管是目录还是文件,在文件系统目录树中都被看作是一个 INode 节点。如果是目录,则其对应的类为 INodeDirectory,如果是文件,则其对应的类为 INodeFile。
INodeDirectory 以及 INodeFile 类都是 INode 的派生类。IN ...
Hadoop-组件-HDFS-源码学习-元数据管理-重建
一、概述当 Namenode 启动时,首先会将 fsimage 文件中记录的命名空间加载到 Namenode 内存中,然后将 editlog 文件中记录的更新操作加载并合并到命名空间中。接下来 Namenode 会等待各个 Datanode 向自己汇报数据块信息来组装 blockMap,从而离开安全模式。Namenode 每次启动时都会调用 FSImage.loadFSImage() 方法执行加载 fsimage 和 editlog 文件的操作。
在 loadFSImage() 方法中加载 fsimage 文件是通过调用 FSImage.loadFSImageFile() 方法实现的,加载 editlog 文件则是通过调用 FSImage.loadEdits() 方法实现的。
二、加载 fsimage 文件loadFSImageFile() 方法会根据当前 Namenode 的版本调用不同的加载方法,不同版本加载方法的区别主要是在 fsimage 文件的校验操作上,例如对于 2.6 版本的加载操作,每个 fsimage 文件都有一个对应的 md5 校验文件。fsimage 文件最终 ...
Hadoop-组件-HDFS-源码学习-写数据设计
正在总结中,等我😭~~~
Hadoop-组件-HDFS-源码学习-数据读写-写文件-DataStreamer
一、概述DataStreamer 线程会从 dataQueue 中取出 Packet 对象,然后通过底层 I/O 流将这个 DFSPacket 发送到数据流管道中的第一个 Datanode 上。发送完毕后,将 DFSPacket 从 dataQueue 中移除,放入 ackQueue 中等待下游节点的确认消息。
二、实现
2.1. 初始化2.1.1. toNewBlock123456private DataStreamer(HdfsFileStatus stat, ExtendedBlock block) { isAppend = false; isLazyPersistFile = isLazyPersist(stat); this.block = block; stage = BlockConstructionStage.PIPELINE_SETUP_CREATE;}
2.1.2. append2.2. 获取数据包2.2.1. 阻塞,等待数据包…123456try { // 等待数据包 dataQueue.wait(timeout) ...
Hadoop-组件-HDFS-源码学习-数据读写-写文件-ResponseProcessor
一、概述对于 DataStreamer 发出的每一个数据包,数据流管道中的 Datanode 都会发送 ack 响应给客户端。ResponseProcessor 线程就是处理 ack 响应的线程类。
二、实现ResponseProcessor 线程的处理逻辑比较简单,它从数据流管道下游节点的输入流中读入响应消息。然后判断响应状态,如果下游数据节点执行写入数据包失败,则通过 ack 消息中的应答码记录错误节点(errorIndex),并设置错误标志位(hashError)。最后会在 DataStreamer.run() 方法中调用 processDatanodeEroor() 处理这个错误信息。如果下游节点写入数据包成功,则把当前数据包信息从ackQucue 中移除。至此,一个数据包就成功地写入了。
从输入流中读取响应 ack
处理所有 DataNode 的响应状态
处理重启的 Datanode
1234567if (PipelineAck.isRestartOOBStatus(reply) && shouldWaitForRestart(i)) { ...
Hadoop-组件-HDFS-源码学习-数据读写-写文件设计
一、概述二、理论笔记三、实现3.1. 流式接口
引用本站文章
Hadoop-组件-HDFS-源码学习-数据读写-写文件-流式接口
Joker
3.2. 上传文件
3.2.1. 创建文件客户端在执行文件写操作前,首先需要调用 DistributedFileSystem.create() 创建一个空的 HDFS 文件,并且获取这个 HDFS 文件的输出流 HdfsDataOutputStream 对象。获取输出流对象后,客户端就可以在输出流 HdfsDataOutputStream 对象上调用 write() 方法执行写操作了。
引用本站文章
Hadoop-组件-HDFS-源码学习-数据读写-写文件-上传-创建文件
...