1. datanode介绍
1.1 datanode
datanode是负责当前节点上的数据的管理,具体目录内容是在初始阶段自动创建的,保存的文件夹位置由配置选项{dfs.data.dir}决定
1.2 datanode的作用
datanode以数据块的形式存储HDFS文件
datanode响应HDFS 客户端读写请求
datanode周期性向NameNode汇报心跳信息,数据块信息,缓存数据块信息
1.3 datanode的多目录配置
datanode也可以配置多个目录,每个目录存储的数据不一样,数据不是副本
(见:https://www.cnblogs.com/cjq10029/p/12368074.html)
<property> #hdfs-site.xml
<name>dfs.datanode.data.dir</name>
<value>/sdb1/data,/opt/software/hadoop277/tmp/data</value>
</property>
1.4 datanode的逻辑结构
我们可以将基于Federation的架构的HDFS分为三层:数据层,逻辑层和服务层
1.4.1 数据层
将DataNode 中负责数据块存储和管理数据块操作的部分抽象成数据层,它主要包括2部分:
1.4.1.1 DataStorage(数据块存储)
数据块存储主要是管理DataNode磁盘存储空间以及磁盘存储空间的生命周期。说的直白一点就是DataStorage这个类主要负责管理数据存储文件信息,比如current,detach,finalized等等文件。
BlockPoolSliceStorage可以用来管理DataNode每一个单独的块池,DataStorage会持有这个BlockPoolSliceStorage对象引用,并通过这个引用来管理DataNode的块池。
1.4.1.2 FSDataset(文件系统数据集)
FSDataset抽象了DataNode对数据块管理的操作,比如创建数据块,维护数据块文件等。我们知道每一个DataNode都可以配置多个不同类型的存储目录来保存数据,所以HDFS定义了FSVolumeImpl来管理DataNode上单个存储目录上 保存的数据块,同时定义了FSVo
lumeList来维护DataNode上所有FSVolumeImpl对象的引用。FSDataSet会通过FSVolumeList提供的管理功能来管理DataNode上存储的目录保存的数据块
1.4.2 逻辑层
DataNode基于数据层会执行很多HDFS 逻辑处理,比如向NameNode汇报数据块状态,发送心跳,扫描损坏的数据块等,我们将HDFS执行这些逻辑的部分抽象成逻辑层。逻辑层主要包括三个模块:
1.4.2.1 BlockPoolManager
BlockPoolManager是管理所有BlockPool的接口类,在HDFS Federation机制下,我们在集群可以创建多个NameSpace,每一个NameSpace都对应着一个BlockPool,一个BlockPoolManager会持有一个BPOfferService对象,用于管理DataNode单个BlockPool, 我们知道,如果引入HA机制, NameNode就会有ActiveNM 和 StandbyNM。所以每一个BPOfferService又会持有2个BPServiceActor对象,每一个BPServiceActor对应于命名空间里的一个Name Node,该对象负责向NameNode发送心跳报告,数据块汇报,缓存汇报等
1.4.2.2 DataBlockScanner
一个周期性扫描每一个数据块并检查数据块校验是否正常的一个线程
1.4.2.3 DirectoryScanner
周期性扫描磁盘数据块,对比内存中元数据与实际磁盘存储数据块的差异,并根据差异更新内存元数据,使得与磁盘保存一致
1.4.3 服务层
主要用于客户端或者其他节点和DataNode通信,以及访问DataNode状态等功能,主要包括三个模块:
1.4.3.1 HttpServer: 对外提供http服务
1.4.3.2 ipcServer:RPC服务端,响应来自客户端,NameNode和其他DataNode的rpc请求
1.4.3.3 DataXceiverServer:输出传输服务端,响应来自客户端以及其他Data Node的流式接口请求
1.5 datanode工作机制
datanode启动时,每个datanode对本地磁盘进行扫描,将本datanode上保存的block信息汇报给namenode
namenode在接收到的block信息以及该block所在的datanode信息等保存在内存中。
DataNode启动后向NameNode注册,通过后周期性(1小时)的向NameNode上报所有的块信息
通过向NameNode发送心跳保持与其联系(3秒一次),心跳返回结果带有NN的命令,返回的命令为:如块的复制,删除某个数据块…..
如果10分钟没有收到DataNode的心跳,则认为其已经lost,并copy其上的block到其它DataNode
DN在其文件创建后三周进行验证其checkSum的值是否和文件创建时的checkSum值一致
DataNode之间还会相互通信,执行数据块复制任务。同时,在客户端执行写操作的时候,DataNode之间需要相互配合,以保证写操作的一致性
逻辑结构原文链接:https://blog.csdn.net/zhanglh046/article/details/78599095