如何在Hadoop中正确删除节点?

Phi*_*ret 22 hadoop

我在一台拥有10台以上机器的集群上运行Hadoop 1.1.2.对于HDFS和MapReduce,我想很好地向上和向下扩展.通过"很好",我的意思是我要求数据不会丢失(允许HDFS节点解除),并且在关闭之前运行任务的节点完成.

我注意到,一旦退役,datanode进程就会死掉,这很好.这是我删除节点的方法:

  • 将节点添加到mapred.exclude
  • 将节点添加到hdfs.exclude
  • $ hadoop mradmin -refreshNodes
  • $ hadoop dfsadmin -refreshNodes
  • $ hadoop-daemon.sh stop tasktracker

要重新添加节点(假设它已被删除,如上所述),这就是我正在做的事情.

  • 从mapred.exclude中删除
  • 从hdfs.exclude中删除
  • $ hadoop mradmin -refreshNodes
  • $ hadoop dfsadmin -refreshNodes
  • $ hadoop-daemon.sh start tasktracker
  • $ hadoop-daemon.sh start datanode

这是"很好地"向上和向下扩展的正确方法吗?按比例缩小时,我注意到某些不幸工作的工作持续时间急剧上升(因为他们在被移除的节点上运行的任务需要重新安排).

Tej*_*til 29

如果您之前没有设置dfs排除文件,请按照1-3进行操作.另外从4开始.

  1. 关闭NameNode.
  2. 将dfs.hosts.exclude设置为指向空的排除文件.
  3. 重新启动NameNode.
  4. 在dfs exclude文件中,使用完整主机名或IP或IP:端口格式指定节点.
  5. 在mapred.exclude中执行相同的操作
  6. 执行bin/hadoop dfsadmin -refreshNodes.这会强制NameNode重新读取排除文件并启动退役过程.
  7. 执行 bin/hadoop mradmin -refreshNodes
  8. 监视NameNode和JobTracker Web UI并确认停用过程正在进行中.更新可能需要几秒钟.类似的消息"Decommission complete for node XXXX.XXXX.X.XX:XXXXX"将在完成退役后显示在NameNode日志文件中,此时您可以从群集中删除节点.
  9. 当进程完成时,namenode UI将把datanode列为已停用.Jobtracker页面将显示更新的活动节点数.运行bin/hadoop dfsadmin -report以验证.停止排除节点上的datanode和tasktracker进程.
  10. 如果您不打算将计算机重新引入群集,请将其从包含和排除文件中删除.

要将节点添加为datanode和tasktracker,请参阅Hadoop FAQ页面

编辑:当要从群集中删除活动节点时,作业会发生什么?

在要退出的节点上运行的作业将受到影响,因为在该节点上调度的作业的任务将标记为KILLED_UNCLEAN(用于映射和减少任务)或KILLED(用于作业设置和清理任务).有关详细信息,请参阅JobTracker.java中的第4633行.将通知该工作失败该任务.大多数情况下,Job跟踪器将重新安排执行.但是,经过多次重复故障后,它可能会决定让整个工作失败或成功.请参阅JobInProgress.java中的第2957行.