我正在测试一个MapReduce程序,看看当我更改映射器的数量时执行时间是如何变化的。
Hadoop 1.2.1安装在具有超线程的四核机器上。 MR程序是用Python编写的,所以我使用Hadoop-streaming来运行这个程序。 文件大小约为500MB。
在mapred-site.xml文件中,我添加了以下配置:
mapred.max.split.size : 250MB
mapred.tasktracker.map.tasks.maximum : 1 //1, 2, 4, 8, 16, 32
mapred.tasktracker.reduce.tasks.maximum : 2
由于我将分割大小设置为文件大小的一半,因此map任务的数量应为2.
我的理解是,最多有2个map任务读取和解析分配给它们的数据。
当有一个映射器时: Maptask1和Maptask2同时解析数据,但只有一个映射器可以映射。所以映射器需要做两次波。 (工作两次)
现在,我的假设是当映射器的数量增加时: Maptask1和Maptask2同时解析数据,mapper1可以处理Maptask1的输出,mapper2可以处理Maptask2的输出,因此两个映射器可以同时处理。
但是,我发现执行时间没有区别。 我尝试了1,2,4,8,16,32,时差在1秒内完成。
有人可以解释一下原因吗?
答案 0 :(得分:0)
问题是我认为你是否有足够的工作线程。您需要一个用于jobtracker,namenode,tasktracker和datanode的线程。我不认为根据您当前的配置,如果您的硬件不支持它,您可以期望加速。例如,如果在具有4个内核的计算机上运行1000个线程,则最大加速比仍为4.检查是否所有内容都已正确配置的方法是在map任务中添加日志语句并检查是否1,2,4 ,...同时启动。
答案 1 :(得分:0)
我猜你的单个输入文件已经使用gzip压缩了,而你遇到的事实是gzip不可拆分。一个gzip压缩文件仅限于一个映射器,不再需要。