第十章-2 datanode工作机制

一、datanode工作机制

1、基本流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qABA69Oh-1571237631700)(https://note.youdao.com/yws/api/personal/file/2B50F92945454A78AA7848EB7A255ABF?method=download&shareKey=f5d578df9d0edfd741465a81695e3422)]

1)datanode启动后会根据配置文件中指定的namenode地址,向namenode进行注册。
2)namenode返回注册成功
3)此后,datanode会周期性向namenode上报所有块信息,默认是1小时
4)同时,datanode会每3秒给namenode发送心跳信息,namenode返回的心跳结果带有namenode给该datanode的命令,如复制块数据到另外一台机器,或者删除某个数据块。如果超过超过10分钟(默认)没有收到某个datanode的心跳信息,则认为该节点不可用。
5)集群运行过程中可以安全的加入和退出一些datanode机器

2、基本目录结构

​ namenode 的目录结构是通过手动初始化hdfs namenode -format时创建的,而datanode的则是在启动时自动创建的,无需手动格式化。而且就算在datanode上格式化了namenode的目录结构,只要不在datanode在启动namenode,那么这些格式化的目录也是没有任何用处的。
​ 一般datanode 的目录在 ${hadoop.tmp.dir}/dfs/data 下,看看目录结构

data
├── current
│   ├── BP-473222668-192.168.50.121-1558262787574 以poolID作为目录命名
│   │   ├── current
│   │   │   ├── dfsUsed
│   │   │   ├── finalized
│   │   │   │   └── subdir0
│   │   │   │       └── subdir0
│   │   │   │           ├── blk_1073741825
│   │   │   │           ├── blk_1073741825_1001.meta
│   │   │   │           ├── blk_1073741826
│   │   │   │           ├── blk_1073741826_1002.meta
│   │   │   │           ├── blk_1073741827
│   │   │   │           ├── blk_1073741827_1003.meta
│   │   │   ├── rbw
│   │   │   └── VERSION
│   │   ├── scanner.cursor
│   │   └── tmp
│   └── VERSION
└── in_use.lock

(1)/data/current/VERSION
文件内容如下:

# datanode的id,非全局唯一,没什么用
storageID=DS-0cb8a268-16c9-452b-b1d1-3323a4b0df60 
# 集群ID,全局唯一
clusterID=CID-c12b7022-0c51-49c5-942f-edc889d37fee
# 创建时间,没什么用
cTime=0
# datanode 的唯一标识码,全局唯一
datanodeUuid=085a9428-9732-4486-a0ba-d75e6ff28400
# 存储类型为datanode
storageType=DATA_NODE
layoutVersion=-57

(2)/data/current/POOL_ID/current/VERSION

# 对接的namenode 的ID
namespaceID=983105879
# 创建时间戳
cTime=1558262787574
# 使用的pool id
blockpoolID=BP-473222668-192.168.50.121-1558262787574
layoutVersion=-57

(3)/data/current/POOL_ID/current/finalized/subdir0/subdir0
这个目录下是真正存储数据块。一个block主要分为两个文件存储:

blk_${BLOCK-ID}
blk_${BLOCK-ID}_xxx.meta

对于目录来说:

blk_${BLOCK-ID} :
是一个xml格式的文件,上面记录了了类似edits文件的操作日志,如:
<?xml version="1.0" encoding="UTF-8"?>
<EDITS>
  <EDITS_VERSION>-63</EDITS_VERSION>
  <RECORD>
    <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
    <DATA>
      <TXID>22</TXID>
    </DATA>
  </RECORD>
  <RECORD>
    <OPCODE>OP_MKDIR</OPCODE>
    <DATA>
      <TXID>23</TXID>
      <LENGTH>0</LENGTH>
      <INODEID>16386</INODEID>
      <PATH>/input</PATH>
      <TIMESTAMP>1558105166840</TIMESTAMP>
      <PERMISSION_STATUS>
        <USERNAME>root</USERNAME>
        <GROUPNAME>supergroup</GROUPNAME>
        <MODE>493</MODE>
      </PERMISSION_STATUS>
    </DATA>
  </RECORD>
</EDITS>

blk_${BLOCK-ID}_xxx.meta:
是一个raw G3 data, byte-padded格式的文件,主要存储目录下的inode记录

对于文件来说:

blk_${BLOCK-ID} :
记录的是block中的实际数据

blk_${BLOCK-ID}_xxx.meta:
CRC32校验文件,保存数据块的校验信息

3、验证数据块完整性

1)datanode读取block时,会计算其对于的checksum,如果和创建block时的checksum不同,那么证明该当前datanode上的该block已经损坏。此时client就会想存储该block 的其他datanode节点请求读取该block。
2)datanode在创建了block之后,会周期性检查block是否损坏,也是通过检查checksum的方式实现的。

4、datanode超时参数设置

datanode进程死亡,或者因为网络故障导致datanode无法与namenode通信,namenode不会立刻把该datanode判定为死亡,而是经过一段时间内,该datanode都没有心跳信息的话,就判定为死亡。而超时时间的计算公式为:

timeout  = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval

dfs.namenode.heartbeat.recheck-interval:是namenode检查datanode是否存活的时间间隔,默认是为 5分钟,单位是毫秒
dfs.heartbeat.interval:datanode上传心跳信息的时间间隔,默认是3秒,单位是秒

两者都在 hdfs-site.xml中进行设置

5、datanode的多目录配置

datanode的多目录配置和namenode不同,多目录之间的数据是不相同的,而是将block数据分成两部分,分别放到两个目录下而已。配置如下:

//hdfs-site.xml
<property>
        <name>dfs.datanode.data.dir</name>
      <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>

6、关于block的实际大小

atanode.data.dir
file:/// h a d o o p . t m p . d i r / d f s / d a t a 1 , f i l e : / / / {hadoop.tmp.dir}/dfs/data1,file:/// hadoop.tmp.dir/dfs/data1,file:///{hadoop.tmp.dir}/dfs/data2




## 6、关于block的实际大小

虽然说每个block的大小都是128M(hadoop2.x),即使存储的数据实际大小并没有128M,也仍旧占据128M。但是实际存储到磁盘上时占据的是数据实际大小,而不是128M。因为物理磁盘的block默认是4KB,所以不可能是会白占128M。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Datanode分块机制是指在Hadoop分布式文件系统中,为了支持大文件的存储和处理,将大文件划分为多个块(Block),每个块的大小通常为64MB或128MB,并将这些块分散存储在不同的Datanode上。 具体来说,当客户端上传一个大文件时,Namenode会根据预设的块大小将文件划分为多个块,并为每个块分配一个唯一的Block ID。然后,Namenode会将每个块的Block ID和副本信息(如副本数、存储位置等)存储在元数据(Metadata)中。 接下来,客户端会通过数据流的方式将每个块上传到对应的Datanode上,并告知Datanode所上传的块的Block ID和副本信息。Datanode会确认该块是否已经存在于本地,如果不存在,则会将该块存储在本地,并根据副本数的设置将该块复制到其他的Datanode上。如果该块已经存在于本地,则Datanode会返回成功的响应。 当客户端需要读取某个块时,它会向Namenode请求该块的副本信息。Namenode会查询元数据,返回该块所有副本的位置信息。客户端会选择距离最近的Datanode读取该块,如果该Datanode发生故障,则会选择距离次近的Datanode读取该块,以此类推,直到成功读取该块为止。 总的来说,Datanode分块机制是Hadoop分布式文件系统的核心机制之一,它通过将大文件划分为多个块,并将这些块分散存储在不同的Datanode上,实现了高效的数据存储和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值