Hadoop作业 - 使用我机器中的所有核心

时间:2013-12-01 12:39:32

标签: optimization hadoop configuration mapreduce

我的默认配置的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来改进流程。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

从您的描述中我觉得您受I / O约束。这只是意味着您的磁盘无法提供足够的数据来保持所有cpus忙碌。

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

  1. 您在系统中添加了更多io容量。即将更多单独的磁盘放入其中并确保输入文件均匀分布在这些磁盘上。
  2. 男性你的CPU使用相同的数据做更多事情。