【问题标题】:How do I correctly remove nodes in Hadoop?如何正确删除 Hadoop 中的节点?
【发布时间】:2014-11-10 15:41:06
【问题描述】:

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

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

【问题讨论】:

    标签: hadoop


    【解决方案1】:

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

    1. 关闭 NameNode。
    2. 将 dfs.hosts.exclude 设置为指向一个空的排除文件。
    3. 重启 NameNode。
    4. 在 dfs 排除文件中,使用完整的主机名或 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 page

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

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

    【讨论】:

    • 如果我有一个 MapReduce 作业,它有 M1、M2...M12 作为地图任务,并且碰巧我想删除当前正在运行 M3 和 M8 的节点,这个过程是否能保证M3 和 M8 是否正确完成?
    • @PhilippeSignoret 我不知道内部实现细节,但应该知道。即使在节点死亡的情况下(比如电源线脱落),Jobtracker 也会在剩余的活动节点上尝试失败的任务。
    • 感谢@TejasP。我将等到有人(或我自己)可以确认这一点,因为这是我问题的重点:在不影响任何正在运行的作业的情况下关闭节点。
    • @PhilippeSignoret 我很想知道您是否尝试过以及正在运行的作业发生了什么。
    • 如果我们暂时忘记 HDFS,您描述的行为是(从 JobTracker 的角度来看)TaskTracker 突然消失时发生的情况。在这种情况下,就像我拔掉了节点上的插头,并且所有正在运行的任务都必须重新启动一旦 JobTracker 通知。这使得这些作业持续额外的时间(mapred.tasktracker.expiry.interval + 重新启动的任务完成所需的时间)。我正在寻找的是如何阻止将新任务分配给 TaskTracker,然后,一旦所有正在运行的任务完成,就终止 TaskTracker 进程。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢这些 cmets Anony-Mousse。请放心,我添加或删除节点并不是为了好玩。 :) 您的 cmets 非常中肯,我一定会考虑到它们。不过,目前我的重点是如何 在不影响正在运行的作业的情况下更改集群大小。之后,我将重点考虑何时执行此操作,并考虑您的内容。
    【解决方案3】:

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

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

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

    hadoop fsck / -files -blocks -racks

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多