@[toc]
10.DataNode
10.1DataNode工作机制
(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
(2)DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息。
DN向NN汇报当前解读信息的时间间隔,默认6小时;
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>21600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
DN扫描自己节点块信息列表的时间,默认6小时
<property>
<name>dfs.datanode.directoryscan.interval</name>
<value>21600s</value>
<description>Interval in seconds for Datanode to scan data directories and
reconcile the difference between blocks in memory and on the disk.
Support multiple time unit suffix(case insensitive), as described
in dfs.heartbeat.interval.
</description>
</property>
一般来说是先扫描自己的块信息,然后再进行汇报
(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器。
10.2数据完整性
思考:如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0),但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?同理DataNode节点上的数据损坏了,却没有发现,是否也很危险,那么如何解决呢?
如下是DataNode节点保证数据完整性的方法。
(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)常见的校验算法crc(32),md5(128),sha1(160)
(5)DataNode在其文件创建后周期验证CheckSum。
10.2.1例子
10.2.1.1创建一个a.txt文件上传到集群上
- [summer@hadoop102 ~]$ vim b.txt
- [summer@hadoop102 ~]$ hadoop fs -put b.txt /
package com.summer.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
/**
* @author Redamancy
* @create 2022-08-15 17:59
*/
public class HdfsClient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//连接的集群nn地址
URI uri = new URI("hdfs://hadoop102:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
configuration.set("dfs.replication","2");
//用户
String user = "summer";
//获取到了客户端对象
fs = FileSystem.get(uri, configuration,user);
}
@After
public void close() throws IOException {
//关闭资源
fs.close();
}
//文件下载
@Test
public void testGet() throws IOException {
//参数的解读:参数一:原文件是否删除;参数二:原文件路径HDFS;参数三:目标地址路径Windows;参数四:是否要校验CRC
fs.copyToLocalFile(false,new Path("hdfs://hadoop102/b.txt"),new Path("D:\\"),false);
}
10.2.1.2打开crc文件
打开crc需要用ediplus
打开
注意,因为b.txt里面多一个换行,所以查的时候也要加上一个空格,输入的时候看清自己的文件内容,只要有一丁点不一样则CRC循环冗余检验就不一样
用这个网站检验CRC循环冗余校验http://www.ip33.com/crc.html
10.3掉线时限参数设置
这些都可以自行设置的,如果感觉自己的电脑反应慢,可以将时间设置长一点
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
<description>
This time decides the interval to check for expired datanodes.
With this value and dfs.heartbeat.interval, the interval of
deciding the datanode is stale or not is also calculated.
The unit of this configuration is millisecond.
</description>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3s</value>
<description>
Determines datanode heartbeat interval in seconds.
Can use the following suffix (case insensitive):
ms(millis), s(sec), m(min), h(hour), d(day)
to specify the time (such as 2s, 2m, 1h, etc.).
Or provide complete number in seconds (such as 30 for 30 seconds).
</description>
</property>
10.3.1如果将104的Datanode杀死出现的情况
杀死后以后超过了3s,在等10多分钟
再把104的Datanode启动
- [summer@hadoop104 ~]$ hdfs --daemon start datanode