我在拥有10台以上计算机的群集上运行Hadoop 1.1.2。对于HDFS和MapReduce,我想很好地向上和向下扩展。 “很好”,我的意思是我要求数据不会丢失(允许HDFS节点解除),并且在关闭之前运行任务的节点完成。
我注意到,一旦退役, datanode 进程就会死掉,这很好。这是我删除节点的方法:
$ hadoop mradmin -refreshNodes
$ hadoop dfsadmin -refreshNodes
$ hadoop-daemon.sh stop tasktracker
要重新添加节点(假设它已被删除,如上所述),这就是我正在做的事情。
$ hadoop mradmin -refreshNodes
$ hadoop dfsadmin -refreshNodes
$ hadoop-daemon.sh start tasktracker
$ hadoop-daemon.sh start datanode
这是“正确”向上和向下扩展的正确方法吗?按比例缩小时,我注意到某些不幸工作的工作持续时间急剧上升(因为他们在已删除节点上运行的任务需要重新安排)。
答案 0 :(得分:29)
如果您之前未设置dfs排除文件,请按照1-3进行操作。其他从4开始。
bin/hadoop dfsadmin -refreshNodes
。这会强制NameNode重新读取排除文件并启动退役过程。bin/hadoop mradmin -refreshNodes
"Decommission complete for node XXXX.XXXX.X.XX:XXXXX"
的消息将在完成退役后出现在NameNode日志文件中,此时您可以从群集中删除节点。 bin/hadoop dfsadmin -report
进行验证。停止排除节点上的datanode和tasktracker进程。 要将节点添加为datanode和tasktracker,请参阅Hadoop FAQ page
编辑:当要从群集中删除活动节点时,作业会发生什么?
要退出的节点上运行的作业会受到影响,因为在该节点上安排的作业的任务将标记为KILLED_UNCLEAN(用于映射和减少任务)或KILLED(用于作业设置和清除)任务)。有关详细信息,请参阅JobTracker.java中的第4633行。将通知该工作失败该任务。大多数情况下,Job跟踪器将重新安排执行。但是,经过多次重复故障后,它可能会决定让整个工作失败或成功。请参阅JobInProgress.java中的第2957行。
答案 1 :(得分:3)
您应该知道,由于Hadoop表现良好,它确实希望以多个副本提供数据。通过删除节点,您可以消除数据最佳可用性,并且您可以对群集施加额外的压力以确保可用性。
即。通过取下节点,您可以确保在其他地方创建所有数据的额外副本。因此,除非您使用与默认配置不同的数据管理范例(=在群集中保留3个副本),否则您不应仅仅为了好玩而这样做。
要使Hadoop集群运行良好,您需要实际存储集群中的数据。否则,您无法将计算结果移动到数据中,因为数据也不存在。很多关于Hadoop的事情是关于拥有智能驱动器"可以在通过网络发送数据之前执行计算。
因此,为了使这一点合理,您可能需要以某种方式拆分群集。让一组节点保留原始数据的3个主副本,并有一些"附加组件"仅用于存储中间数据并在该部分上执行计算的节点。永远不要更改主节点,因此他们不需要重新分配您的数据。仅在加载节点为空时才关闭它们?但这可能尚未实施。
答案 2 :(得分:0)
在退役过程中,临时或临时文件会自动清除。现在缺少这些文件,hadoop无法识别它是如何丢失的。因此,即使对所有其他文件进行了实际的解除授权,退役过程也会一直等待,直到解决为止。
在Hadoop GUI中 - 如果您注意到参数" Under-Replicated Blocks的数量"不是随着时间减少或几乎不变,那么这就是可能的原因。
所以使用以下命令列出文件
hadoop fsck / -files -blocks -racks
如果您看到这些文件是临时的而不是必需的,请删除这些文件或文件夹
示例:hadoop fs -rmr /var/local/hadoop/hadoop/.staging/*(在此处给出正确的路径)
这样可以立即解决问题。取消调试的节点将在5分钟内移动到死节点。