【问题标题】:Hadoop Job - Using all the cores in my machineHadoop 作业 - 使用我机器中的所有内核
【发布时间】:2013-12-01 12:39:32
【问题描述】:

我使用默认配置的 hadoop 作业 -> 本地文件系统上的本地模式没有使用我系统中的所有核心 (16) -> 通过使用所有核心,我的意思是,我可以在各种情况下看到所有核心的活动。但是,我的 CPU 使用率 [来自 top] 从未超过 200%,因此我在 conf 中更改了这些配置。

mapred.tasktracker.map.tasks.maximum 将其设置为 8,mapred.tasktracker.reduce.tasks.maximum 也将其设置为 8。

我的内核使用率仍然低于 300%。如何通过使用所有内核从机器获得最大吞吐量?

另外,我的文件大小约为 1TB。这是作业运行的示例日志。我看到它在运行作业时创建了多个(临时)拆分。这个创建拆分和处理它的循环继续(重复)。我的预感是,在每个周期中,它都会创建一个临时文件并最终将它们合并。有没有办法我们可以增加一些缓冲区大小来处理更大的块(对于我的大输入文件)?

13/12/01 12:58:10 INFO mapred.MapTask: io.sort.mb = 100
13/12/01 12:58:10 INFO mapred.MapTask: data buffer = 79691776/99614720
13/12/01 12:58:10 INFO mapred.MapTask: record buffer = 262144/327680
13/12/01 12:58:10 INFO mapred.MapTask: Spilling map output: record full = true
13/12/01 12:58:10 INFO mapred.MapTask: bufstart = 0; bufend = 16702718; bufvoid = 99614720
13/12/01 12:58:10 INFO mapred.MapTask: kvstart = 0; kvend = 262144; length = 327680
13/12/01 12:58:11 INFO mapred.MapTask: Finished spill 0
13/12/01 12:58:11 INFO mapred.MapTask: Spilling map output: record full = true
13/12/01 12:58:11 INFO mapred.MapTask: bufstart = 16702718; bufend = 33439467; bufvoid = 99614720
13/12/01 12:58:11 INFO mapred.MapTask: kvstart = 262144; kvend = 196607; length = 327680
13/12/01 12:58:11 INFO mapred.MapTask: Starting flush of map output
13/12/01 12:58:12 INFO mapred.MapTask: Finished spill 1
13/12/01 12:58:12 INFO mapred.MapTask: Finished spill 2
13/12/01 12:58:12 INFO mapred.Merger: Merging 3 sorted segments
13/12/01 12:58:12 INFO mapred.Merger: Down to the last merge-pass, with 3 segments left of total size: 36912217 bytes
13/12/01 12:58:12 INFO mapred.Task: Task:attempt_local1988835396_0001_m_000543_0 is done. And is in the process of commiting
13/12/01 12:58:12 INFO mapred.LocalJobRunner: 
13/12/01 12:58:12 INFO mapred.Task: Task 'attempt_local1988835396_0001_m_000543_0' done.
13/12/01 12:58:12 INFO mapred.LocalJobRunner: Finishing task: attempt_local1988835396_0001_m_000543_0
13/12/01 12:58:12 INFO mapred.LocalJobRunner: Starting task: attempt_local1988835396_0001_m_000544_0
13/12/01 12:58:12 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@17aee8b0

请建议我可以遵循的其他tuning techniques 以改进流程。

【问题讨论】:

    标签: optimization hadoop configuration mapreduce


    【解决方案1】:

    我假设您使用的是伪发行版,所以您的问题(猜测)是 Hadoop 有这么多可用的进程槽,您现在受到磁盘 IO 的限制 - 这意味着您的硬盘(以及我假设您只有一个 HDD)只能并行读取这么多数据 - 在这种情况下,您的进程被称为 IO 绑定。

    如何使用所有可用的 CPU - 你可以编写一个不受 IO 限制的作业,并且为每个输入记录执行一些复杂的计算(可能是一些矩阵乘法,或 Pi Estimator 示例 - 但我不确定CPU 密集程度如何)。

    【讨论】:

    • 似乎配置/代码没有问题。是硬件内部造成了瓶颈以减慢进程?
    • 硬盘有一个特定的带宽,它可以从磁盘读取数据。 CPU 可以以相当高的带宽传输、处理和写出这些数据。对于单个磁盘,您还会在读取和写入结果之间发生争用(磁盘“抖动”)
    • 不知道该进程有一个术语 - 抖动。学到了 :) computerhope.com/jargon/t/thrash.htm 链接表明增加 RAM 将解决问题,我有一个大小为 64GB 的 RAM,这是它所能得到的最高值。即便如此,我也面临着这个问题。我可以更改一些配置以要求 Hadoop 使用比现在更多的 RAM 吗?
    • 没关系 - 你的磁盘有一个固定的带宽,它可以将数据读入内存。例如,从 1 个磁盘读取 1TB 文件有理论时间(取决于磁盘),但从 10 个磁盘读取相同的 1TB 文件理论上应该快 10 倍
    • 理论上,绕过的唯一方法是拥有多个磁盘。使用带有单个多核处理器的并行文件系统会有帮助吗?
    【解决方案2】:

    根据您的描述,在我看来您受 I/O 限制。这仅仅意味着您的磁盘无法提供足够的数据来保持所有 CPU 忙碌。

    基本上有两种方法可以改变这一点

    1. 您在系统中增加了 io 容量。 IE。放入更多单独的磁盘,并确保输入文件均匀分布在这些磁盘上。
    2. 让您的 CPU 使用相同的数据执行更多操作。

    【讨论】:

    • 有没有办法(不添加额外硬件)绕过 IO 限制并增加吞吐量?也许,阅读更大的块或类似的东西。如果我错了,请纠正我
    • 您可以做的“最好”的事情是尽量减少硬盘磁头的移动。瞄准“顺序”读/写。所以更少的映射器/减少器可能会提高性能。
    • 啊,我明白了!我正在使用默认数量的映射器/减速器(我猜是 2 个)进行测试,然后更改为当前的 8M 和 8R 方法。对于大小为 5GB 的文件(用于测试),使用 8M/8R 方法时,我的运行时间从 8 分钟减少到 3 分钟。在这两者之间是否有可以提高性能的数字。
    • 最佳位置取决于您正在运行的工作。本质上,它与您尝试执行的每“兆字节数据”的 CPU 周期有关。
    猜你喜欢
    • 2015-12-29
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多