我的hadoop作业使用默认配置->本地文件系统上的本地模式并没有使用我系统中的所有核心(16)->通过使用所有核心,我的意思是,我可以在各种情况下看到所有核心中的活动。但是,我的CPU使用率(来自top
])从未超过200%,因此我在conf
中更改了这些配置。
CCD_ 3将其设置为8并且CCD_。
我的核心使用率仍然低于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
来改进流程。
我假设您使用的是伪分布,所以您的问题(猜测)是Hadoop有这么多进程插槽可用,您现在受到磁盘IO的限制-这意味着您的硬盘(我再次假设您只有一个HDD)只能并行读取这么多数据-在这种情况下,您的进程被称为受IO限制。
你如何使用所有可用的CPU?你可以写一个不受IO限制的作业,并为每个输入记录执行一些复杂的计算(可能是一些矩阵乘法,或Pi Estimator的例子,但我不确定这是多么占用CPU)。
根据您的描述,我觉得您受I/O限制。这只是意味着您的磁盘无法提供足够的数据来保持所有cpu的繁忙。
本质上有两种方法可以改变
- 您在系统中增加了io容量。也就是说,放入更多单独的磁盘,并确保输入文件均匀地分布在这些磁盘上
- 雄性CPU在相同的数据下做得更多