我在具有超线程的四核机器上运行MR程序,Hadoop 1.2.1在该机器上以伪分布式模式运行。
我有一个1GB的文件,并使用不同的地图任务和插槽设置(不减少)多次运行程序,这是我得到的结果:
split mapred.tasktracker. No. of
size map.tasks.maximum process time
--------------------------------------------------------
iGB 1 1 04m 13s
1GB 2 1 04m 10s
1GB 4 1 04m 12s
500MB 1 2 02m 14s
500MB 2 2 02m 13s
500MB 4 2 02m 13s
250MB 1 2 02m 17s
250MB 2 2 02m 16s
250MB 4 2 02m 18s
250MB 8 2 02m 16s
125MB 1 2 02m 25s
125MB 2 2 02m 23s
125MB 4 2 02m 24s
125MB 8 2 02m 24s
当分割大小设置为1GB和500MB时,结果对我有意义。但是,当分割大小= 250MB且插槽大小大于或等于4时,我希望在TOP屏幕中最多获得4个java进程。或者,当分割大小= 125MB且插槽大小大于或等于4时。 (我看到更多的java进程,但它们正在睡眠并使用0.1%的CPU)
MR程序是用Python编写的,所以我使用的是Hadoop Streaming,每次运行时我都会看到1到2个Python进程。这是否意味着2个python进程和2个java进程占用了所有可用内核?但是这台机器是超级线程的四核,所以这是否意味着我可以同时运行多达8个进程? 这是记忆问题吗? CPU使用率很低。或者我在这里遗漏了什么?
我已尝试添加此功能,但仍然无法同时看到超过2个进程运行..
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx512m</value>
</property>
当我在属性中使用mapreduce
而不是mapred
时,我会在运行时获得更多信息,但由于打印日志而减慢速度。
INFO显示如下:
mapred.MapTask: numReduceTasks: 1
mapred.MapTask: io.sort.mb = 100
streaming.PipeMapRed: PipeMapRed exec [/Users/hadoop/./map.py]
...
streaming.StreamJob: map 0% reduce 0%
mapred.MapTask: Spilling map output: record full = true
mapred.MapTask: Finished spill 0
etc...
另一件事是,当我添加更多reduce任务时,我确实在TOP屏幕中看到了更多的java进程。它只是没有添加更多的MAP流程......