DataNode详解
Datanode工作机制
箭头所指的第一个文件存放真实的文件块,第二个meta文件是存放一些时间戳,校验和之类的。
1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器。
设置节点掉线时限
当心跳3秒后该节点仍未有反应,那么namenode不会立即认为该节点死亡。
需要注意的是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>
数据完整性
1)当DataNode读取Block的时候,它会计算CheckSum。
2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
3)Client读取其他DataNode上的Block。
4)DataNode在其文件创建后周期验证CheckSum。
新节点服役
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
- 环境准备
(1)在hadoop3主机上再克隆一台hadoop4主机
(2)修改IP地址和主机名称,告诉新机器namenode和resourcemanager在哪里。
(3)删除原来HDFS文件系统留存的文件(/opt/module/hadoop-2.7.2/data 和log)
(4)source 一下配置文件:
直接启动DataNode,即可关联到集群,同理,如果要扩容计算节点,只需启动resourcemanager和nodemanager
退役节点
添加白名单(伪退役)
添加到白名单的主机,都允许访问NameNode,不在白名单的主机,都会被退出。
配置白名单的具体步骤如下:
(1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件:
[ygp@hadoop1 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[ygp@hadoop1 hadoop]$ touch dfs.hosts
[ygp@hadoop1 hadoop]$ vi dfs.hosts
添加如下主机名称(不添加hadoop3)
hadoop1
hadoop2
(2)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
</property>
(4)刷新NameNode
[ygp@hadoop1hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
添加黑名单(真退役)
如果是退役datanode节点,要保证在退役前将数据交给其他的datanode。
【注】一个datanode要真的退役,必须在白名单和黑名单同时存在。
1.在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts.exclude文件
[ygp@hadoop1 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[ygp@hadoop1 hadoop]$ touch dfs.hosts.exclude
[ygp@hadoop1 hadoop]$ vi dfs.hosts.exclude
添加如下主机名称(要退役的节点)
hadoop3
同时我也要在白名单里加入hadoop3.
2.在NameNode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value>
</property>
3.刷新NameNode
[ygp@hadoop1 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
-
检查Web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点
Datanode多目录配置
- 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>
哪个机器需要多目录就在哪个机器配置。
然后存数据的时候是配置的多目录轮流去存块,你存一块,我存一块。
Hadoop归档
(1)需要启动YARN进程
[ygp@hadoop2 hadoop-2.7.2]$ start-yarn.sh
(2)归档文件
把你自己建的测试目录比如/user/ygp/input里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/user/ygp/output路径下。
[ygp@hadoop2 hadoop-2.7.2]$ hadoop archive -archiveName input.har –p /user/ygp/input /user/ygp/output
(3)查看归档
[ygp@hadoop2 hadoop-2.7.2]$ hadoop fs -lsr /user/ygp/output/input.har
[ygp@hadoop2 hadoop-2.7.2]$ hadoop fs -lsr har:///user/ygp/output/input.har
(4)解归档文件
[ygp@hadoop2 hadoop-2.7.2]$ hadoop fs -cp har:/// user/ygp/output/input.har/* /user/ygp