hadoop DataNode 工作机制

DataNode工作机制图
DataNode工作机制
    1)一个数据块在 datanode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

    2)DataNode 启动后向 namenode 注册,通过后,周期性(1 小时)的向 namenode 上报所有的块信息。

    3)心跳是每 3 秒一次,心跳返回结果带有 namenode 给该 datanode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 datanode 的心跳,则认为该节点不可用。

    4)集群运行中可以安全加入和退出一些机器。


数据完整性

    1)当 DataNode 读取 block 的时候,它会计算 checksum

    2)如果计算后的 checksum,与 block 创建时值不一样,说明 block 已经损坏。

    3)client 读取其他 DataNode 上的 block.

    4)datanode 在其文件创建后周期验证 checksum

掉线时限参数设置

    datanode 进程死亡或者网络故障造成 datanode 无法与 namenode 通信,namenode 不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS 默认的超时时长为 10 分钟+30 秒。如果定义超时时间为 timeout,则超时时长的计算公式为:
    timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

    而默认的 dfs.namenode.heartbeat.recheck-interval 大小为 5 分钟,dfs.heartbeat.interval 默认为 3 秒。

    需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的单位为毫秒,dfs.heartbeat.interval 的单位为秒。

<property>
 	<name>dfs.namenode.heartbeat.recheck-interval</name>
 	<value>300000</value>
</property>
<property>
 	<name>dfs.heartbeat.interval</name>
	<value>3</value>
</property>

DataNode 的目录结构

    和 namenode 不同的是,datanode 的存储目录是初始阶段自动创建的,不需要额外格式化。
    1)在/home/hadoop/hadoop_home/dfs/data/current 这个目录下查看版本号
hadoop@master:~/hadoop_home/dfs/name/current$ cat VERSION

storageID=DS-1b998a1d-71a3-43d5-82dc-c0ff3294921b
clusterID=CID-1f2bf8d1-5ad2-4202-af1c-6713ab381175
cTime=0
datanodeUuid=970b2daf-63b8-4e17-a514-d81741392165
storageType=DATA_NODE
layoutVersion=-56

    2)具体解释
    (1)storageID:存储 id 号
    (2)clusterID 集群 id,全局唯一
    (3)cTime 属性标记了 datanode 存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为 0;但是在文件系统升级之后,该值会更新到新的时间戳。
    (4)datanodeUuid:datanode 的唯一识别码
    (5)storageType:存储类型
    (6)layoutVersion 是一个负整数。通常只有 HDFS 增加新特性时才会更新这个版本号。

    3)在/home/hadoop/hadoop_home/dfs/data/current/BP-97847618-192.168.10.102-1493726072779/current 这个目录下查看该数据块的版本号
hadoop@master:~/hadoop_home/dfs/name/current$ cat VERSION

#Mon May 08 16:30:19 CST 2017
namespaceID=1933630176
cTime=0
blockpoolID=BP-97847618-192.168.10.102-1493726072779
layoutVersion=-56

    4)具体解释
    (1)namespaceID:是 datanode 首次访问 namenode 的时候从 namenode 处获取的storageID 对每个 datanode 来说是唯一的(但对于单个 datanode 中所有存储目录来说则是相同的),namenode 可用这个属性来区分不同 datanode。
    (2)cTime 属性标记了 datanode 存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为 0;但是在文件系统升级之后,该值会更新到新的时间戳。
    (3)blockpoolID:一个 block pool id 标识一个 block pool,并且是跨集群的全局唯一。当一个新的 Namespace 被创建的时候(format 过程的一部分)会创建并持久化一个唯一 ID。在创建过程构建全局唯一的 BlockPoolID 比人为的配置更可靠一些。NN 将BlockPoolID 持久化到磁盘中,在后续的启动过程中,会再次 load 并使用。
    (4)layoutVersion 是一个负整数。通常只有 HDFS 增加新特性时才会更新这个版本号。


服役新数据节点

    0)需求:
    随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
    1)环境准备
    (1)克隆一台虚拟机
    (2)修改 ip 地址和主机名称
    (3)修改 xcall 和 xsync 文件,增加新增节点的同步
    (4)删除原来 HDFS 文件系统留存的文件 /home/hadoop/hadoop_home/dfs/name
    2)服役新节点具体步骤
    (1)在 namenode 的~/hadoop_home /etc/hadoop 目录下创建 dfs.hosts 文件
hadoop@master:~/hadoop_home/etc/hadoop$ pwd

/home/hadoop/hadoop_home/etc/hadoop 

hadoop@master:~/hadoop_home/etc/hadoop$ touch dfs.hosts
hadoop@master:~/hadoop_home/etc/hadoop$ vi dfs.hosts
添加如下主机名称(包含新服役的节点)

node3
node4
node5

    (2)在 namenode 的 hdfs-site.xml 配置文件中增加 dfs.hosts 属性

<property>
	<name>dfs.hosts</name>
 	<value>/home/hadoop/hadoop_home/etc/hadoop/dfs.hosts</value>
</property>

    (3)刷新 namenode
[hadoop@nod1:~/hadoop_home]$ hdfs dfsadmin -refreshNodes

Refresh nodes successful

    (4)更新 resourcemanager 节点
[hadoop@nod1:~/hadoop_home]$ yarn rmadmin -refreshNodes

17/06/24 14:17:11 INFO client.RMProxy: Connecting to ResourceManager at node2/192.168.0.242:8033

    (5)在 namenode 的 slaves 文件中增加新主机名称
增加 node 不需要分发

node1
node2
node3

    (6)单独命令启动新的数据节点和节点管理器
hadoop@master:~/hadoop_home$ sbin/hadoop-daemon.sh start datanode

starting datanode, logging to /home/hadoop/hadoop_home/logs/hadoop-hadoop-datanode-node3.out

hadoop@master:~/hadoop_home$ sbin/yarn-daemon.sh start nodemanager

starting nodemanager, logging to /home/hadoop/hadoop_home/logs/yarn-hadoop-nodemanager-hadoop105.out

    (7)在 web 浏览器上检查是否 ok

    3)如果数据不均衡,可以用命令实现集群的再平衡
[hadoop@node2 sbin]$ ./start-balancer.sh

starting balancer, logging to /home/hadoop/hadoop_home/logs/hadoop-hadoop-balancer-master.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move 
Bytes Being Moved

退役旧数据节点

    1)在 namenode 的/home/hadoop/hadoop_home/etc/hadoop 目录下创建 dfs.hosts.exclude 文件
[hadoop@node2 hadoop]$ pwd

/home/hadoop/hadoop_home/etc/hadoop

[hadoop@node2 hadoop]$ touch dfs.hosts.exclude
[hadoop@node2 hadoop]$ vi dfs.hosts.exclude
添加如下主机名称(要退役的节点)

node3

    2)在 namenode 的 hdfs-site.xml 配置文件中增加 dfs.hosts.exclude 属性

<property>
	<name>dfs.hosts.exclude</name>
 	<value>/home/hadoop/hadoop_home/etc/hadoop/dfs.hosts.exclude</value>
</property>

    3)刷新 namenode、刷新 resourcemanager
[hadoop@nod1:~/hadoop_home]$ hdfs dfsadmin -refreshNodes

Refresh nodes successful

[hadoop@nod1:~/hadoop_home]$ yarn rmadmin -refreshNodes

17/06/24 14:55:56 INFO client.RMProxy: Connecting to ResourceManager at node/192.168.0.242:8033

    4)检查 web 浏览器,退役节点的状态为 decommission in progress(退役中),说明数据节点正在复制块到其他节点。
如图
    5)等待退役节点状态为 decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是 3,服役的节点小于等于 3,是不能退役成功的,需要修改副本数后才能退役。
如图
hadoop@master:~/hadoop_home$ sbin/hadoop-daemon.sh stop datanode

stopping datanode

hadoop@master:~/hadoop_home$ sbin/yarn-daemon.sh stop nodemanager

stopping nodemanager

    6)从 include 文件中删除退役节点,再运行刷新节点的命令
    (1)从 namenode 的 dfs.hosts 文件中删除退役节点 hadoop105

node3
node4
node5

    (2)刷新 namenode,刷新 resourcemanager
[hadoop@nod1:~/hadoop_home]$ hdfs dfsadmin -refreshNodes

Refresh nodes successful

[hadoop@nod1:~/hadoop_home]$ yarn rmadmin -refreshNodes

17/06/24 14:55:56 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033

    7)从 namenode 的 slave 文件中删除退役节点 node5

node3
node4
node5

    8)如果数据不均衡,可以用命令实现集群的再平衡
[hadoop@nod1:~/hadoop_home]$ sbin/start-balancer.sh

starting balancer, logging to /home/hadoop/hadoop_home/logs/hadoop-hadoop-balancer-master.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move 
Bytes Being Moved

Datanode 多目录配置

    1)datanode 也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本。

    2)具体配置如下:

    [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>

猜你喜欢

转载自blog.csdn.net/qq_36885128/article/details/88074957