Decommission Datanode就是把Datanode从HDFS集群中移除掉。那问题来了,HDFS在设计时就把诸如机器故障考虑进去了,能否直接把某台运行Datanode的机器关掉然后拔走呢?我认为理论上可行的,不过在实际的集群中,如果某份数据只有一份拷贝而且它就在这个机器上,那么直接关掉并拔走机器就会造成数据丢失。本文将介绍如何Decommission Datanode以及可能会遇到的一些问题及其解决办法。

Decommission Datanode都做了什么?

Datanode是存储实际数据的,因此在Decommission Datanode的时候需要把Datanode上的数据迁移到别的机器上。这就好比公司里面有人离职了,他需要把他负责的工作交接给别的同事。

那如何Decommission Datanode呢?这需要如下两个步骤:

  1. 在Namenode上,把需要Decommission的Datanode的机器名加入到dfs.hosts.exclude(该配置项在hdfs-site.xml)所指定文件中,也就是告诉Namenode哪些Datanode要被Decommission。

如果hdfs-site.xml没有找到dfs.hosts.exclude,那么就手动把下面内容加入到hdfs-site.xml中,然后把需要Decommission的机器写到文件/etc/hadoop/conf/dfs.exclude中去。

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

2 . 用如下命令启动Decommission:

sudo -u hdfs hdfs dfsadmin -refreshNodes

注意:通常需要用hdfs用户来执行这个命令。 
接下来就可以在Namenode的UI(http://<namenode_fqdn>:50070)上看到对应Datanode会处在Decommissioning状态。完成后,对应的Datanode会处在Decommissioned状态。

常见问题

我们知道HDFS上的文件默认replica factor是3,也就是文件要存储3份。Decommission Datanode的时候需要保证在该Datanode移除以后,HDFS上的文件还能满足replica factor的最低要求。

比如,一个只有3个Datanode的HDFS集群,文件默认replica factor是3,那么移除任何一个Datanode都会导致某些文件不能满足replica factor的最低要求。当试图移除一个Datanode的时候,会一直处在Decommissioning的状态,因为它找不到别的机器来迁移它的数据了。这个问题通常容易出现在小集群上。

一个解决办法就是临时把相应文件的replica factor调低。 
1. 用如下命令来查看HDFS中所有文件的replica factor

sudo -u hdfs hdfs fsck / -files -blocks

比如在我的测试集群上,一部分输出如下:

/user/oozie/share/lib/sqoop/sqoop-1.4.4.phd.3.0.0.0-1.jar 756504 bytes, 1 block(s):  OK
0. BP-1770424924-192.168.64.102-1412922647084:blk_1073741898_1074 len=756504 repl=1

其中repl=1表示该文件的该block的replica factor为1。通过这个命令就可以找到那些replica factor比较高的文件了。

2 . 调整文件的replica factor 
我们需要注意的是,replica factor是文件的属性,而不是集群的属性,也就是说同一个集群中的文件可以有不同的replica factor。因此,我们需要针对文件修改replica factor。对应的命令是:

hdfs dfs -setrep [-R] [-w] <rep> <path>

其中

  • -R表示recursive,可以对一个目录及其子目录设置replica factor,
  • 表示需要设置的replica factor的值
  • 表示需要设置的replica factor的文件或目录路径

小结

Decommission Datanode就有点类似于在拔掉移动硬盘的时候先将其弹出。本文简要介绍了如何Decommission Datanode和一个常见问题及其解决办法。

最新文章

  1. Windows10 会不会成为微软的新起点?
  2. POJ3070 Fibonacci[矩阵乘法]
  3. windows下CMake使用图文手册 Part 3
  4. 一个空行引起的阿里云负载均衡上部署https证书的问题
  5. spring-servlet.xml简单示例
  6. Windows下用C++删除磁盘分区信息
  7. UI2_视图切换ViewController
  8. mysq 日期相减
  9. sql - sum() 和 count() 函数的区别
  10. Webform用户控件
  11. 开源企业管理软件 ONES
  12. TIJ笔记:内部类的初始化
  13. RxJava在Android中使用场景详解
  14. 实现string到double的转换
  15. PageHelper分页插件的使用
  16. 在图像中随机更改像素值程序——matlab
  17. Sysinternals Utilities
  18. Archive required for library “xxx” cannot be read or is not a valid zip file报错解决
  19. 嵌入式开发之精确延时---多线程延时阻塞精度asm(&quot;nop&quot;) nanosleep usleep sleep select
  20. Struts初步入门(四)

热门文章

  1. h5微信浏览器复制粘贴--ios兼容问题的解决方法(clipboard.js插件)
  2. 网编(小白心得osi七层协议)
  3. 这些用来审计 Kubernetes RBAC 策略的方法你都见过吗?
  4. 【转】[Python小记] 通俗的理解闭包 闭包能帮我们做什么?
  5. 掌握 Maven 私服
  6. 本地项目上传到github上最直接步骤
  7. CodeForces 989C
  8. js的兼容问题以及解决方式(持续更新)
  9. 正则表达式-Regex详解
  10. 在.net core web网站中添加webSocket支持