22

我在一个有 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

这是“很好”地扩大和缩小规模的正确方法吗?当缩小规模时,我注意到某些不走运的工作的工作持续时间急剧上升(因为他们在删除的节点上运行的任务需要重新安排)。

4

3 回答 3

29

如果您之前没有设置 dfs 排除文件,请按照 1-3。否则从4开始。

  1. 关闭名称节点。
  2. 将 dfs.hosts.exclude 设置为指向一个空的排除文件。
  3. 重启NameNode。
  4. 在 dfs exclude 文件中,使用完整的主机名或 IP 或 IP:port 格式指定节点。
  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 会将数据节点列为已停用。Jobtracker 页面将显示更新的活动节点数。运行bin/hadoop dfsadmin -report验证。停止排除节点上的 datanode 和 tasktracker 进程。
  10. 如果您不打算将机器重新引入集群,请将其从包含和排除文件中删除。

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

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

在要退役的节点上运行的作业将受到影响,因为在该节点上调度的作业的任务将被标记为 KILLED_UNCLEAN(用于 map 和 reduce 任务)或 KILLED(用于作业设置和清理任务)。有关详细信息,请参见JobTracker.java中的第 4633 行。该作业将被告知该任务失败。大多数时候,Job tracker 会重新安排执行。然而,在多次重复失败之后,它可能会决定让整个作业失败或成功。请参见JobInProgress.java中的第 2957 行。

于 2013-05-27T18:11:25.420 回答
3

您应该知道,由于 Hadoop 要想表现良好,它确实希望数据在多个副本中可用。通过删除节点,您消除了数据以最佳方式可用的机会,并且您对集群施加了额外的压力以确保可用性。

即,通过删除一个节点,您确实可以在其他地方制作其所有数据的额外副本。因此,您不应该只是为了好玩而这样做,除非您使用与默认配置不同的数据管理范例(= 在集群中保留 3 个副本)。

为了让 Hadoop 集群运行良好,您需要将数据实际存储在集群中。否则,您无法真正将计算转移到数据上,因为数据也不存在。Hadoop 的大部分内容是拥有“智能驱动器”,可以在通过网络发送数据之前执行计算。

因此,为了使其合理,您可能需要以某种方式拆分集群。让一组节点保留原始数据的 3 个主副本,并有一些“附加”节点仅用于存储中间数据并在该部分上执行计算。永远不要更改主节点,因此它们不需要重新分配您的数据。仅当它们为空时才关闭附加节点?但这可能尚未实施。

于 2013-05-27T19:02:19.040 回答
0

在停用过程中,临时或暂存文件会自动清理。这些文件现在丢失了,hadoop 无法识别这些文件是如何丢失的。因此,即使所有其他文件的实际停用已完成,停用过程也会一直等待直到解决。

在 Hadoop GUI 中 - 如果您注意到参数“复制不足的块数”没有随时间减少或几乎恒定,那么这可能是原因。

所以使用下面的命令列出文件

hadoop fsck / -files -blocks -racks

如果您看到这些文件是临时文件且不需要,则删除这些文件或文件夹

示例:hadoop fs -rmr /var/local/hadoop/hadoop/.staging/* (在这里给出正确的路径)

这将立即解决问题。退役节点将在 5 分钟内转移到死节点。

于 2014-11-10T07:41:06.277 回答