我想为一个非常大的区域生成数字高程模型数据。至少18 × 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程序分析这些数据,目前使用外部程序生成数据,效率不高。所以我需要用磁共振程序生成这些数据。
我在Cluster中有5个节点,并且输入文件的大小非常小,以生成至少5个map任务。如何使用MR并行来生成这些数据?
1的解决方案
我在map()中将大区域划分为几个子区域,并将它们分配给reducer。
这是一个小的解决方案,但它可能工作:
- 您可以重复相同的输入文件或在每个文件中使用不同值的单行输入!
- 如果你想在开始时添加计数器值,以便在映射器中检测并相应地处理
- 将文件压缩为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>
虽然参数mapred.reduce.tasks
请求Hadoop框架创建一些map任务,但不能保证运行。因此,映射任务的数量由依赖于泛型公式的输入分割的数量控制。下面是关于作业客户端如何计算文本文件
hadoop中的job client如何计算inputSplits
根据上面的解释,如果需要为小的输入文件创建更多的map任务。您可能必须遵循这两种方法中的任何一种。
将你的输入文件分成5个小的输入文件,这样至少可以为你的5个节点集群创建5个地图任务或
调整
mapred.min.split.size
和dfs.block.size
等参数,以便为您的输入文件创建更多的地图任务。