前言

前段时间公司线上CDH集群突然异常报警,经过查验后发现是其中一个数据节点所在的服务器上某块磁盘无法读写,导致当前DataNode节点读写异常。随后登录到故障节点进行手动验证,进入到损坏磁盘的挂载目录,预创建文件进行读写操作,发现直接报错,查看报错信息,确实是当前磁盘无法读写异常。

问题已经足以说明是磁盘损坏了,那接下来就是换盘操作了,由于机房不在本地(公司),所以同时联系运维同时进驻机房,进行手动换盘,然后在服务器上再进行设置。

由于我本人不是做运维方面的,关于服务器一些常用的命令使用起来基本没什么问题,但是像磁盘挂载这方面的操作还是比较生疏的,虽然之前有了解过一些,也在自己本机进行过配置,但毕竟不是生产环境,差别还是有的。并且公司有专门的运维同事负责我们项目组线上的集群(但是只负责服务器相关的运维操作,CDH集群包括项目组线上所有运行的服务还得我们自己排查自己搞,有时候都怀疑自己除了是大数据开发,还附带兼职运维图片)。

玩笑归玩笑,工作上的事情该做还是要好好做,不能给后人“唾骂”的机会。那么本文主要讲述磁盘故障需要在线换盘时,CDH集群需要做的操作有哪些。

为DataNode执行磁盘热交换

实质的操作就是在不关闭datanode的情况下更换HDFS磁盘
警告:要求和限制
 1. CDH 5.4和更高版本支持热插拔。
 2. 热插拔只能添加具有空数据目录的磁盘。
 3. 卸下磁盘不会将数据移出磁盘,这可能会导致数据丢失。
 4. 不要同时在多个主机上执行热交换。

使用Cloudera Manager为DataNode执行磁盘热交换
最低要求角色:群集管理员
 1. 配置数据目录以删除要换出的磁盘:
  a. 进入HDFS服务。
  b. 单击实例选项卡。
  c. 在“角色类型”列中,单击受影响的DataNode。
  d. 单击配置选项卡。
  e. 选择“作用域” >“ DataNode”。
  f. 选择类别>主。
  g. 更改“DataNode数据目录”属性的值,以删除作为要删除磁盘的安装点的目录。
  警告:仅对于计划在其中热交换磁盘的特定DataNode实例,更改此属性的值。不要编辑此属性的角色组值。这样做会导致数据丢失。
 2. 单击保存更改以提交更改。
 3. 刷新受影响的DataNode。选择操作>刷新数据目录。
 4. 取出旧磁盘并添加替换磁盘。
 5. 更改DataNode数据目录属性的值,以重新添加目录,这些目录是您添加的磁盘的安装点。
 6. 单击保存更改以提交更改。
 7. 刷新受影响的DataNode。选择操作>刷新数据目录。
 8. 跑过 hdfs fsck / 命令以验证HDFS的运行状况。

使用命令行为DataNode执行磁盘热交换
重要:
1. 如果您使用Cloudera Manager,请不要使用这些命令行说明。
2. 该信息专门适用于CDH5.8.x。如果您使用较低版本的CDH,请参阅位于Cloudera文档中的该版本的文档。

使用以下说明在不受Cloudera Manager管理的集群中执行磁盘的热交换

要添加和删除磁盘:
1. 如果要添加磁盘,请格式化并挂载它们。
2. 更改值 dfs.datanode.data.dir 在DataNode上的hdfs-site.xml中,以反映从现在起将要使用的目录(添加新点并删除过时的点)。有关更多信息,请参阅“配置本地存储目录”下有关DataNodes的说明。
3. 开始重新配置过程:
 a. 如果启用了Kerberos:

1
$ kinit -kt /path/to/hdfs.keytab hdfs/<fully.qualified.domain.name@YOUR-REALM.COM> && dfsadmin -reconfig datanode HOST:PORT start

 b. 如果未启用Kerberos:

1
$ sudo -u hdfs hdfs dfsadmin -reconfig datanode HOST:PORT start

其中 HOST:PORT 是DataNode的 dfs.datanode.ipc.address(或其主机名和在中指定的端口 dfs.datanode.ipc.address;例如 dnhost1.example.com:5678)
要检查重新配置的进度,可以使用 status 命令选项;例如,如果未启用Kerberos:

1
$ sudo -u hdfs hdfs dfsadmin -reconfig datanode HOST:PORT status

4. 重新配置完成后,请卸载从配置中删除的所有磁盘。
5. 运行HDFS fsck 实用程序来验证HDFS的运行状况。

要对磁盘执行维护:
1. 更改值 dfs.datanode.data.dir 在DataNode上的hdfs-site.xml中,以排除驻留在受影响的磁盘上的安装点目录,并且仅反映将在维护窗口期间使用的目录。有关更多信息,请参阅“配置本地存储目录”下有关DataNodes的说明。
2. 开始重新配置过程:
 a. 如果启用了Kerberos:

1
$ kinit -kt /path/to/hdfs.keytab hdfs/<fully.qualified.domain.name@YOUR-REALM.COM> && dfsadmin -reconfig datanode HOST:PORT start

 b. 如果未启用Kerberos:

1
sudo -u hdfs hdfs dfsadmin -reconfig datanode HOST:PORT start

其中 HOST:PORT 是DataNode的 dfs.datanode.ipc.address 或其主机名和在中指定的端口 dfs.datanode.ipc.address
要检查重新配置的进度,可以使用 状态命令选项;例如,如果未启用Kerberos:

1
$ sudo -u hdfs hdfs dfsadmin -reconfig datanode HOST:PORT status

3. 重新配置完成后,卸载磁盘。
4. 在磁盘上执行维护。
5. 重新安装磁盘。
6. 更改值 dfs.datanode.data.dir 再次反映原始的安装点集。
7. 重复步骤2。
8. 运行HDFS fsck 实用程序来验证HDFS的运行状况。
分类:管理员 | Cloudera Manager | 数据节点 | 磁盘存储 | HDFS | 故障排除 | 所有类别

使用命令行停用DataNode

停用DataNode后,将其数据复制到活动节点后会将其从群集中排除。取消对DataNode的分解:
1. 创建一个名为 dfs.exclude在HADOOP_CONF_DIR中(默认为 /etc/hadoop/conf)。
2. 在每行上添加要停用的每个DataNode主机的名称。
3. 在要停用的DataNode上停止TaskTracker。
4. 将以下属性添加到 hdfs-site.xml 在NameNode主机上。

1
2
3
4
<property>
<name>dfs.hosts.exclude</name>
<value>/etc/hadoop/conf/dfs.exclude</value>
<property>

当数据管理部被标记为停止使用,所有对数据管理部的块被标记为下复制。在“停用DataNodes”下的NameNode UI中,您可以看到未完全复制的块的总数,随着时间的流逝,这将减少,表示停用进度。
Cloudera建议您一次停用不超过两个DataNode。

停止退役过程
要使用命令行停止DataNode的停用过程:
1. 从中删除DataNode名称 /etc/hadoop/conf/dfs.exclude。
2. 运行命令 $ hdfs dfsadmin -refreshNodes。

测试环境使用过的命令

生产环境磁盘故障问题结束后,在测试环境手动进行了磁盘“故障”下线操作模拟测试,以下为使用到的一些主要命令仅供参考:
1. cm管理界面找到损坏磁盘,手动更改配置进行下线
2. 服务器上进行配置生效操作

1
2
hdfs dfsadmin -reconfig datanode hostname:50020 status
hdfs dfsadmin -reconfig datanode hostname:50020 start

3. 卸载损坏磁盘

1
2
umount -l /dev/mapper/datavg-data2
mount /dev/mapper/datavg-data2

4. 修改数据副本数命令:

1
2
hdfs dfs -setrep -R -w 3 /*  
# HDFS根目录下所有文件均设置为三备份

Clouder官网:https://docs.cloudera.com/documentation/enterprise/5-8-x/topics/admin_dn_swap.html