Hadoop HDFS 源码解析记录

版权说明: 本文章版权归本人及博客园共同全部,转载请标明原文出处( http://www.javashuo.com/article/p-rmsmpjar-ku.html ),如下内容为我的理解,仅供参考。
html

文本参考书籍《Hadoop2.x HDFS源码剖析》编写。node

 

1、HDFS体系结构架构

 

 

一、数据块Block工具

  最小存储单元,默认128MB,适合大文件存储,减小寻址和内存开销。oop

 

二、Namenodespa

  文件系统命名空间,含目录、文件的数据块索引,索引存储在内存中,文件越多占用内存越大。3d

同时存储命名空间镜像文件(FsImage)与编辑日志文件(EditLog),文件的变动先写入日志文件中。日志

2.X版本引入HA功能,一般经过Journal Nodes保持多主间EditLog同步。再加入ZKfailoverController进行主备切换操做(也可人工切换)。cdn

 

三、Datanodehtm

  数据存储节点,执行数据块的建立、删除、复制等操做。

 

四、Secondary Namenode

  因为Namenode 合并EditLog和FsImage很是耗时,特别在大型集群中。故增长一个secondary namenode负责定时从namenode获取(HTTP)EditLog而且合并到FsImage中,耗时的合并工做完成后将新的FsImage传回namenode。

 

 

2、HDFS主要流程

 

  2.1 客户端的读取

 

一、调用DistributedFileSystem.open打开文件(底层调用DFSClient.open)并建立HdfsDataInputStream。

二、经过调用DFSClient.getBlockLocations获取数据块所在的datanode节点列表,根据排序规则选择一个datanode创建链接获取数据块,当此数据块读取完毕后,再次向namenode获取下一个数据块。依次循环。

 

2.2 客户端写入流程

 

image.png

 

一、经过调用DistributedFileSystem.create在底层调用DFSClient.create发送通知namenode建立文件。

二、获取输出流后就能够调用DFSOutputStream写数据,空文件时就会调用Clientprotocol.addBlock向Namenode申请一个数据块并返回LocatedBlock,此对象包含该数据块的全部节点信息,后续便可往其中一节点write数据。

 

2.3 HA切换流程

image.png

 

Hadoop 2.X以前版本NN存在单点故障,HA功能提供一个active NN与一个standby NN,命名空间实时同步。Active NN修改命名空间时同时通知多数的Quorum Journal Nodes(JNS),standby NN监听JNS中的editlog变化,并与自身的命名空间合并,当发生切换时,须要等待standby合并JNS上的全部editlog后才会进行切换。

    ZKFailoverController会实时监控NN的状态,若是active NN处于不可用状态则进行自动主备切换,不须要人工干预,固然管理员也可用DFSHAAdmin命令进行手工切换。

 

3、NameNode

   

3.1 文件目录树

    HDFS命名空间在内存中以树结构存储,目录与文件抽象为INode节点,目录为INodeDirectory,文件为INodeFile。目录有List<INode> children存储子目录或文件(内部使用二分法作检索),HDFS命名空间存储在本地系统FsImage文件中,启动时加载,与此同时NN会按期合并fsimage与editlog,editlog操做类为FSEditLog。

    INodeFile主要成员变量:

        private long header = 0L;  # 文件头信息

        private BlockInfoContiguous[] blocks;  # 数据块与数据节点关系

 

3.2 数据块管理

    一、NameNode启动时从fsimage加载文件与数据块以前的关系,数据块存储在哪些节点上具体是由datanode启动时向NN上报数据块信息时才能构建。

    二、BlockMap在NN中存储数据块与节点的关系,该关系则由DN上报时更新。

 

3.3 数据节点管理

    一、添加和撤销DN:HDFS提供的dfs.hosts可配置include和exclude,若是节点下线则配置exclude并执行dfsadmin -refreshNodes后NN开始进行撤销,下线的节点数据会复制到其余节点上,此时DN则处于正在被撤销状态,复制完毕后DN状态则变成已撤销。

    二、DN启动须要向NN握手、注册于上报数据块,并按期发送心跳包。

 

3.4 NN的启动与中止

    一、NN启动由NameNode类的main方法执行,并调用createNameNode方法进行初始化。调用FSNamesystem.loadFromDisk进行fsimage与editlog。

    二、NN的中止则是经过启动时注册JVM的ShutdownHook,当JVM退出时调用,并输出一些退出日志。

 

4、数据节点DN

    HDFS 2.X DN使用Federation架构,可配置多个命名空间,每一个命名空间在DN中对应一个池。DN的启动由DataNode类的main方法执行,关闭也是注册了JVM的钩子。

image.png

    一、DataBlockScanner扫描数据块并检查校检和是否匹配。

    二、DirectoryScanner定时扫描内存元数据与磁盘是否有差别,若有则更新内存。

    三、IPCServer为RPC服务端,接收Client、NN、DN的RPC请求。

    四、DataXceiverServer用于流式数据传输。

 

4.1 DN磁盘存储与读写

   一、DFSStorage管理数据块,管理磁盘存储目录(dfs.data.dir),dfs.data.dir可定义多个存储目录,不一样目录磁盘克异构。

    二、DataTransferProtocol定义了基于TCP流的数据访问接口,包含Sender和Receiver,流程以下图:

image.png

 

 

5、HDFS经常使用工具

    一、FsShell :  bin/hadoop fs <args>

    二、DFSAdmin: bin/hdfs dfsadmin <args>

相关文章
相关标签/搜索