MapReduce - 如何获得比具有小输入文件的工作节点更多的映射任务

时间:2013-04-30 10:58:52

标签: hadoop 3d mapreduce

我想为非常大的区域生成数字高程模型数据。至少18 x 10 ^ 12个样本。要生成这些数据,我只需要开始位置,域大小和分辨率。

例如

输入:

ORIGIN_LAT=33.663901;ORIGIN_LON=-117.894687;ORIGIN_DEPTH =0.000000
SIZE_DOMAIN_LAT=4000.000000;SIZE_DOMAIN_LON=4000.000000;SIZE_DOMAIN_DEPTH =1600.000000

输出:

-117.894687,  33.663901, 0.000000  

-117.894687 ,    33.663901 ,     -200.000000 

-117.894687     , 33.663901 ,    -300.000000 

-117.894687 ,    33.663901  , -400.000000 

-117.894687     , 33.663901 ,    -500.000000 

-117.894687 ,    33.663901 ,     -600.000000 

-117.894687     , 33.663901     , -700.000000 

-117.894687 ,    33.663901  , -800.000000 

-117.894687     , 33.663901     , -900.000000 

-117.894687 ,    33.663901 ,     -1000.000000

.....................

所以我想知道如何获得比工作节点更多的地图任务。因为输入文件非常小。

我不确定我是否误解了这些概念,但如果程序在一个节点上运行就没有使用群集,这里只有地图阶段生成数据,我使用零减速器。

实际上我正在用另一个MR程序分析这些数据,这个程序目前用外部程序生成数据并且效率不高。所以我需要用MR程序生成这些数据。

我在群集中有5个节点,输入文件的大小非常小,无法生成至少5个地图任务。如何使用MR并行来生成这些数据?

1解决方案

我将大区域划分为map()中的几个子区域,并将它们分配给reducer。

2 个答案:

答案 0 :(得分:0)

这是一个小解决方案,但可能会有效:

  • 您可以重复相同的输入文件,或者在每个文件中使用不同的值进行单行输入!
  • 如果你想在开始时添加一个计数器值,以便在mapper中检测到并相应地处理
  • 使文件成为一个gzip文件,这将迫使hadoop拥有与文件数量一样多的映射器。

对于上面的最后一点,您需要将以下属性添加到core-site.xml文件中:

<property>
    <name>io.compression.codecs</name>
    <value>org.apache.hadoop.io.compress.GzipCodec</value>
  </property>

以下属性为mapred-site.xml:

<property>
    <name>mapred.output.compression.codec</name>
    <value>org.apache.hadoop.io.compress.GzipCodec</value>
</property>

答案 1 :(得分:0)

虽然参数mapred.reduce.tasks要求Hadoop框架创建多个map任务,但不能保证操作。因此,映射任务的数量由输入拆分的数量决定,这取决于通用公式。以下是有关作业客户端如何计算文本文件

的输入拆分的链接

How job client in hadoop compute inputSplits

通过上述说明,如果需要为小输入文件创建更多数量的地图任务。您可能必须遵循这些方法中的任何一种。

  1. 将输入文件拆分为5个小输入文件,以便为5节点群集创建至少5个地图任务或

  2. 调整mapred.min.split.sizedfs.block.size等参数,以便为输入文件创建更多数量的地图任务。