DataNode
1、DataNode工作机制
修改:以后每周期(6小时)上报所有块信息!!!!!
心跳机制:心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。DataNode会主动联系NameNode。
工作流程
1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。在介绍NameNode时,介绍了NameNode中含有每隔块中的信息,包括文件(或者目录)的id,权限,所有者以及文件大小等,但是不包括块是存储在哪一个DataNode里面,这时候在汇报的时候,NameNode会汇报自己含有的块信息。
2)DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息。
3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器。
2、数据完整性
DataNode会自己去校验自己的信息,避免数据错误。但是在一般情况下,不是人为的破坏数据,DataNode中的数据不会有变化或者修改。
校验流程
1)当DataNode读取block的时候,它会计算checksum
2)如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
3)client读取其他DataNode上的block.
4)datanode在其文件创建后周期验证checksum
通常使用的校验算法是crc(32)校验、md5(128)校验、sha1(160)校验
算法校验拓展
crc、md5、sha1
-
算法不同。CRC采用多项式除法,MD5和SHA1使用的是替换、轮转等方法;
-
校验值的长度不同。CRC校验位的长度跟其多项式有关系,一般为16位或32位;MD5是16个字节(128位);SHA1是20个字节(160位);
-
校验值的称呼不同。CRC一般叫做CRC值;MD5和SHA1一般叫做哈希值(Hash)或散列值;
-
安全性不同。这里的安全性是指检错的能力,即数据的错误能通过校验位检测出来。CRC的安全性跟多项式有很大关系,相对于MD5和SHA1要弱很多;MD5的安全性很高,不过大概在04年的时候被山东大学的王小云破解了;SHA1的安全性最高。
-
效率不同,CRC的计算效率很高;MD5和SHA1比较慢。
-
用途不同。CRC一般用作通信数据的校验;MD5和SHA1用于安全(Security)领域,比如文件校验、数字签名等。
在这个奇偶校验算法中还是存在问题,算法过于简单而且容易出错。所以,在确保数据完整性还是需要**校验算法,而且校验算法有一定的可靠性!!!**才可以保证数据大概率不会出错。
3、掉线时限参数设置
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:
TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.namenode.heartbeat.recheck
而默认的dfs.namenode.heartbeat.recheck-interval大小是5分钟,dfs.namenode.heartbeat.recheck心跳机制的默认时间是3秒
修改hdfs-site.xml文件进行修改NameNode和DataNode联系的时间
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name> dfs.heartbeat.interval </name>
<value>3</value>
</property>
4、服务新数据节点
需求
随着公司业务的增长,数据量越来越大,原有的数据结点的容器已经不在满足存储数据的需求,需要在原有的集群基础上动态添加新的数据节点。
环境配置
1)在原有的主机上克隆一台新的主机hadoop3
2)修改hadoop3主机的IP地址和主机名称
2)删除原来HDFS文件系统中保存的文件(所有的data数据和logs日志)
4)source 一下配置文件,配置一下/etc/profile(hadoop以及jdk的环境变量)
服役新节点的具体步骤
- 直接启动DataNode,即可关联到集群
hdfs --daemon start datanode
# start-dfs.sh
yarn --daemon start yarn
# stop-yarn.sh
5、退役旧数据结点
添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被直接退出。
添加到黑名单的主机节点,不允许访问NameNode,会在诗句迁移后退出。
实际情况下,白名单用于确定允许访问DataNode节点,内容配置一般与workers文件内容一致。黑名单用于在集群运行过程中退役DataNode节点。
增加黑名单和白名单
配置黑名单和白名单的具体步骤如下:
1)在NameNode的/usr/local/hadoop/etx/hadoop(这是我自己配置的hadoop路径,hadoop路径根据自己自身情况而定)目录下分别创建whitelist和blacklist文件。
# 假设现在的路径在/usr/local/hadoop/etc/hadoop
# 新建黑白两个名单
touch whitelist # 新建白名单
touch blacklist # 新建黑名单
在whitelist白名单中添加配置的主机名称hadoop3,假设集群正常工作的节点是hadoop,hadoop1,hadoop2
hadoop
hadoop1
hadoop2
hadoop3
黑名单暂时为空
2)在NameNode的hdfs-site.xml配置文件中添加dfs.hosts和dfs.hosts.exclude 配置
<!--配置白名单-->
<property>
<name>dfs.hosts</name>
<value>/usr/local/hadoop/etc/hadoop/etc/hadoop/whitelist</value>
</property>
<!--配置黑名单-->
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/etc/hadoop/blacklist<value>
<property>
3)集群分发
# 分发whitelist
rsync whitelist root@hadoop:/usr/local/hadoop/etc/hadoop/etc/hadoop/whitelist # 其他节点同理
# 分发blacklist
rsync blacklist root@hadoop:/usr/local/hadoop/etc/hadoop/etc/hadoop/blacklist
# 分发hdfs-site.xml
rsync whitelist root@hadoop:/usr/local/hadoop/etc/hadoop/etc/hadoop/hdfs-site.xml
4)重新启动集群
start-dfs.sh
start-yarn.sh
黑名单退役
1)准备使用黑名单退役hadoop3
编写blacklist文件,增加hadoop3
vi blacklist
hadoop3
2)刷新NameNode
hdfs dfsadmin -refreshNodes
3)在web端查看DN状态,hadoop3正在退役中。。进行数据的迁移退役中表示将数据给其他可运行的NameNode,当节点hadoop3节点完成退役后,颜色会变成黄色。
4)如果hadoop3启动了NameNode以及NodeManager,也可以刷新yarn的状态
yarn rmadmin -refreshNodes
如果想要退役的节点重新回来
- 去掉黑名单的内容
- 重新刷新一遍 输入 hdfs dfsadmin -refreshNodes
白名单退役【不推荐】
1)找到白名单的位置
2)删除(擦除)不需要的数据
6、DataNode 多目录
DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本
配置在hdfs-site.xml
<!--存放data的节点地方-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>
需要清除之前所有的数据(data)和日志(logs),进行重新格式化,然后再启动集群
7、DataNode和NameNode多目录区别
NameNode多目录配置
NameNode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性
具体配置如下
(1)在hdfs-site.xml文件中增加如下内容
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>
步骤:
(1)修改完毕后,将修改内容分发一下并重启dfs
(2)停止集群,删除data和logs中所有数据。
(3)格式化集群并启动。
bin/hdfs namenode –format
sbin/start-dfs.sh
NameNode多目录的作用:提高可用性
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>
步骤:修改文件后同步,重新格式化,启动hdfs及yarn,上传文件测试,观察目录中的内容不一样
Datanode的作用:保证所有磁盘都被利用均衡
一、引起磁盘倾斜不均衡的可能原因有哪些
(1)扩容节点,向集群中添加新的数据节点 (服役新节点候可以使用hadoop自带的balancer来使数据再平衡)
(2)数据节点之间的磁盘大小不一致
二、磁盘倾斜引起的性能问题
(1)MR程序无法很好地利用本地计算的优势
(2)机器之间无法达到更好的网络带宽使用率
(3)机器磁盘无法利用