Hadoop DataNode详解

一个集群可能包含上千个DataNode节点,这些DataNode定时和NameNode进行通信,接受NameNode的指令
为了减轻NameNode的负担,NameNode上并不永久保存哪个DataNode上有哪些数据块的信息,而是通过DataNode启动时的上报来更新NameNode上的映射表。

  1. 根据客户端或者是namenode的调度存储和检索数据,并且定期向namenode发送所存储的块(block)的列表
  2. 数据块在DataNode进程所在的节点上以文件的形式存储在本地磁盘上
    一个是数据本身
    一个是元数据(数据块的长度,块数据的校验和,以及时间戳)
  3. 维护blockid与DataNode之间的映射信息(元信息)

DataNode工作机制
datanode启动时,每个datanode对本地磁盘进行扫描,将本datanode上保存的block信息汇报给namenode
namenode在接收到的block信息以及该block所在的datanode信息等保存在内存中。
DataNode启动后向NameNode注册,通过后周期性(1小时)的向NameNode上报所有的块信息

  1. 通过向NameNode发送心跳保持与其联系(3秒一次),心跳返回结果带有NN的命令
    返回的命令为:如块的复制,删除某个数据块…..
  2. 如果10分钟没有收到DataNode的心跳,则认为其已经lost,并copy其上的block到其它DataNode
  3. DN在其文件创建后三周进行验证其checkSum的值是否和文件创建时的checkSum值一致

【注意】
NameNode不会发起到DataNode的请求。在这个通信过程中,它们严格遵从客户端/服务器架构,当然DataNode也作为服务器接受来自客户端的访问,处理数据块读/写请求。

DataNode之间还会相互通信,执行数据块复制任务。同时,在客户端执行写操作的时候,DataNode之间需要相互配合,以保证写操作的一致性。

Client读写操作:
集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。
当需要通过客户端读/写某个数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作
然后,客户端直接与这个DataNode服务器上的后台程序进行通信,并且对相关的数据块进行读/写操作。

DN文件结构
DataNode不需要进行格式化,它会在启动时自己创建存储目录,其中关键的文件和目录如下:

$ {dfs.data.dir}/current/VERSION
$ {dfs.data.dir}/current/blk_<id_1>
$ {dfs.data.dir}/current/blk_<id_1>.meta
$ {dfs.data.dir}/current/blk_<id_2>
$ {dfs.data.dir}/current/blk_<id_2>.meta
$ {dfs.data.dir}/current/....
$ {dfs.data.dir}/current/subdir0/
$ {dfs.data.dir}/current/subdir1/
$ {dfs.data.dir}/current/....          
$ {dfs.data.dir}/current/subdir63/

DataNode的VERSION文件和NameNode的非常类似,内容如下:

#Tue Mar 10 21:32:31   GMT  2010
namespaceID=134368441       //第一次连接NameNode时就会从中获取
storageID=DS-5477177...     //相对于DataNode来说是唯一的,用于在NameNode处标识DataNode
cTime=0                    //与NameNode中的值一样
storageType=DATA_NODE       //storageType将这个目录标志为DataNode数据存储目录
layoutVersion=-18           //与NameNode中的值一样

DataNode中current目录下的其他文件都有blk_refix前缀,它有两种类型:

(1)HDFS中的文件块本身,存储的是原始文件内容
(2)块的元数据信息(使用.meta后缀标识)。一个文件块由存储的原始文件字节组成,元数据文件由一个包含版本和类型信息的头文件和一系列的区域校验和组成。

当目录中存储的块数量增加到一定规模时,DataNode会创建一个新的目录,用于保存新的块及元数据。当目录中的块数量达到64(可由dfs.DataNode.numblocks属性值确定)时,便会新建一个子目录,这样就会形成一个更宽的文件树结构,避免了由于存储大量数据块而导致目录很深,使检索性能免受影响。通过这样的措施,数据节点可以确保每个目录中的文件块数是可控的,也避免了一个目录中存在过多文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值