mapreduce-如何用较小的输入文件获得比工作节点多的Map任务

zaq34kh6  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(438)

我想为一个非常大的区域生成数字高程模型数据。至少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

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

因此,我想知道如何获得比工作节点更多的Map任务。因为输入的文件很小。
我不确定我误解了这些概念,但是如果程序在一个节点上运行,那么使用集群是没有用的,这里只使用map阶段生成数据,我使用的是zero reducer。
实际上,我正在用另一个mr程序分析这些数据,目前用外部程序生成数据,效率不高。所以我需要用mr程序生成这些数据。
我在集群中有5个节点,输入文件的大小非常小,可以生成至少5个map任务。如何使用mr并行生成这些数据?
1解决方案
我在map()中将大区域划分为几个子区域,并将这些子区域分配给reducer。

d8tt03nd

d8tt03nd1#

尽管参数 mapred.reduce.tasks 请求hadoop框架创建多个map任务,不保证运行。因此,map任务的数量取决于输入拆分的数量,而输入拆分的数量取决于泛型公式。下面是有关作业客户端如何为文本文件计算输入拆分的链接
hadoop中的作业客户端如何计算inputsplits
根据上面的说明,如果需要为小的输入文件创建更多的Map任务。你可能必须遵循这两种方法中的任何一种。
将输入文件拆分为5个小的输入文件,以便为5节点群集或应用程序创建至少5个Map任务
调整参数,如 mapred.min.split.size 以及 dfs.block.size 以便为输入文件创建更多的Map任务。

jtw3ybtb

jtw3ybtb2#

这里有一个很小的解决方案,但它可能有用:
您可以重复相同的输入文件,或者在每个文件中使用不同的值进行单行输入!
如果您想在开始时添加一个计数器值,以便在Map器中检测并相应地进行处理
使文件成为gzip文件,这将强制hadoop拥有与文件数量相同的Map器。
对于上面的最后一点,您需要将以下属性添加到core-site.xml文件中:

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

并将以下属性Map到mapred-site.xml:

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

相关问题