如果您有一个 200 节点的 mapreduce 作业,并且只有 3 个运行的 reduce 作业仍然存在,那么关闭除 master 和 3 个正在运行的作业之外的所有节点是否安全?如果出现需要更换的坏节点,可能还会增加一些?
如果这个问题的答案是“是”,那么奇怪的是 emr 在大多数节点不使用时不会自动关闭它们。
请记住,EMR 是 Hadoop 上的一个非常薄的层。如果您在 Amazon 的结构上进行分布式计算,您可能会更高效地使用针对其特定需求定制的东西,这些东西根本不像 Hadoop 或 Map/Reduce。如果您正在使用 Hadoop 做大量繁重的工作,您通常最好使用自己的集群,或者至少使用云中的专用集群(这样数据已经在本地磁盘上切片,输出只需要持久保存到本地磁盘)。EMR 的主要优点是它快速而肮脏,并且可以很好地连接到 AWS 的其他部分(如 S3)。
最近有几项工作大部分都完成了,但有一些减少了挥之不去。我认为这让我们付出了代价,因为未使用的节点一直存在。
它绝对会让你付出代价,特别是在运行时间方面。我首先会担心为什么完成时间如此不统一。
我能想到的有这些问题:
-- 数据何时被复制到 S3?如果一个节点在运行reduce方面没有被使用,是否仍然需要它来复制到S3?在这种情况下,我的问题的答案是你基本上永远不会安全地关闭节点
如果您指的是作业的输出,如果您将 S3 作为作业配置的输出路径,则给定任务的数据将在任务退出之前写入 S3。
-- 如果 3 个工作中的一个失败了怎么办?主/作业协调员应将其重新分配给另一个节点。我想你是安全的,只要它可以跟踪哪些盒子正在运行,并且不会错误地分配给已关闭的盒子。
嗯......它比这更复杂......当新节点被分配工作时,它必须从某个地方提取数据。这通常来自首先生成数据的映射器。如果它们不再存在,则可能需要重新运行地图任务(或者更有可能:作业将失败)。通常地图输出的复制因子是 1,所以这是一个完全合理的场景。这是 Hadoop 作业可以使其“完成百分比”倒退的几个原因之一……映射器甚至可以从 100% 倒退到 <100%。
与此相关:可以想象,根据这些 reducer 作业所处的阶段,它们还没有收到所有输入给它们的 map 输出。显然在那种情况下杀死错误的映射器是致命的。
我认为强调仅脱机 TaskTracker 节点与运行 TaskTracker + DataNode 服务的节点之间的区别很重要。如果你取消了超过后者,你将丢失 HDFS 中的块,这通常对你的工作来说不是一件好事(除非你真的不将 HDFS 用于分配你的工作之外的任何事情)。您可以一次关闭几个节点,然后运行重新平衡器以“鼓励”HDFS 将所有块的复制因子恢复到 3。当然,这会触发网络流量和磁盘 I/O,这可能减慢你剩余的任务。
tl; dr:杀死节点可能会出现问题。虽然您可以确信,在通知 JobTracker 任务已完成时,将其输出写入 S3 的已完成任务已完全写出其所有输出,但对于 map 任务则不能这样说,它写入输出到他们的本地目录并将数据异步传输到reducer。即使所有映射输出都已传输到它们的目标减速器,如果你的减速器失败(或者如果推测执行触发另一个节点上的任务启动),你真的需要那些其他节点,因为 Hadoop 可能会转向它们用于重新分配的减速器的输入数据。
- 克里斯
PS 这实际上也可能是非 EMR Hadoop 设置的一大痛点(而不是为节点支付比您需要的时间更长的时间,它表现为当您有工作时节点处于空闲状态,以及大量的计算时间节点故障造成的损失)。作为一般规则,避免这个问题的技巧是:保持你的任务大小相当一致,并在 1-5 分钟的范围内,启用推测执行(在节点性能几乎一致的 EMR 世界中非常重要),保持复制因素远高于给定作业的预期节点损失(取决于您的节点可靠性,一旦您在一天的作业运行中跨越 >400 个节点,您就会开始考虑复制因子 4),并使用一个作业调度程序,允许新作业在旧作业仍在完成时启动(现在这通常是默认设置,但它是引入的全新事物~Hadoop 0.20 IIRC)。我什至听说过一些疯狂的事情,比如将 SSD 用于 mapout dirs(虽然它们可以从所有写入中快速磨损,但它们的失败场景对于 Hadoop 作业来说往往不是灾难性的)。