Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制hadoop将映射任务的编号设置为1_Java_Hadoop_Mapreduce - Fatal编程技术网

Java 强制hadoop将映射任务的编号设置为1

Java 强制hadoop将映射任务的编号设置为1,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我想我的问题会让每个人都感到困惑。再清楚一点。 我正在尝试整理我的数据。 假设我的数据(很少记录)是这样的 0 1 2 3 4 1 3 8 9 2 2 8 7 9 7 我的块大小是128MB,文件大小是380MB(3个块) 我想给我的记录一个订单号 1,0 1 2 3 4 2,1 3 8 9 2 3,2 8 7 9 7 为了给出正确的编号,我需要将数据放入1个地图中,否则如果我得到3个地图任务,我的编号将不正确 所以,如果我这样做,我会得到完整的数据,因为它是正确的? 输入到我的mapper

我想我的问题会让每个人都感到困惑。再清楚一点。 我正在尝试整理我的数据。 假设我的数据(很少记录)是这样的

0 1 2 3 4
1 3 8 9 2
2 8 7 9 7
我的块大小是128MB,文件大小是380MB(3个块) 我想给我的记录一个订单号

1,0 1 2 3 4
2,1 3 8 9 2
3,2 8 7 9 7
为了给出正确的编号,我需要将数据放入1个地图中,否则如果我得到3个地图任务,我的编号将不正确

所以,如果我这样做,我会得到完整的数据,因为它是正确的? 输入到我的mapper类的数据不会发生任何更改,它将是我的原始数据,不是吗

一旦我使用

 -D mapreduce.job.maps=1

我的输出生成3个part-m-000*文件

我使用的是Hadoop 2.6.0-cdh5.4.7 cloudera版本

我做错什么了吗?
如果您想对数据进行排序,请给出建议,重要的是减少数据量是您工作的一部分。 如果您想要有n个排序文件,那么纯reduce就可以了,如果您想要有一个单独的输出文件,那么您需要将reducer的数量设置为1(类似于您对map所做的)


将映射器的数量设置为1不会影响您试图实现的目标,否则会减慢工作速度

不要将映射器的数量设置为1,而是通过在映射器端使用二次排序以不同的方式解决问题

通过对键对象的格式进行轻微的操作,二次排序使我们能够在排序阶段将值考虑在内

看看这个java工作代码示例

再看看这个问题:

如果您仍然只需要一个映射任务,并且框架忽略了您的参数,请选择不可拆分的hadoop压缩文件类型,如gzip(对于小于1GB的未压缩数据)


有关更多详细信息,请查看此文档。

mapreduce.job.maps的说明

当mapreduce.jobtracker.address为“本地”时忽略

因此,如果您在本地计算机上运行,这可能解释了为什么您有3个映射器

说到排序,一个map方法,其中应用程序代码是在单个输入上编写的。因此,如果您想要排序发生映射阶段,它会变得复杂。另一方面,如果在reduce侧进行排序,则几乎是直接的。

  • 制图员人数

    -Dmapreduce.job.maps=1
    
    这可用于指定每个作业的默认映射器任务数

    但是,提交作业时,
    JobSubmitter
    会根据拆分的数量覆盖此参数:

    LOG.debug("Creating splits at " + jtFs.makeQualified(submitJobDir));
    int maps = writeSplits(job, submitJobDir);
    conf.setInt(MRJobConfig.NUM_MAPS, maps);
    
    在上面的代码中,
    MRJobConfig.NUM\u MAPS
    是:

    public static final String NUM_MAPS = "mapreduce.job.maps";
    
    它被设置为拆分的数量,由
    writeSplits()
    方法计算

    因此,您的设置不会生效

  • 映射器极限

    conf.setInt("mapreduce.job.running.map.limit", 1);
    
    此设置仅控制同时映射器的最大数量


那么,您的意思是,即使设置了mapreduce.job.maps=1,您也会得到3个映射器?这是你的担忧吗?@ManjunathBallur:是的,我的目的不是整理数据。我需要提供我的数据的订单号好的,我明白了。您是否也关闭了reduce?我想您需要将reducer的数量设置为0:conf.setNumReduceTasks(0)好的,您不能这样设置映射的数量,因为这取决于InputFormat为作业创建的拆分数量。如果它创建了3个拆分,那么它的3个任务,因此通常InputFormats会以配置的映射器数量作为提示,但这并不能保证。因此,如果您真的想强制地图任务计数为1,请查看输入格式及其选项。也应该有类似于CombinedInputFormat的东西。然而,问题是,使用Hadoop完成该任务是否仍然有益,因为您删除了所有并行性!是的,你说得对。但是我想尝试矩阵乘法。对于普通的2个大矩阵,我们不能进行矩阵乘法,因为我们不能进行计算,因为数据的顺序不同(因为它来自不同的拆分)。为此,我尝试向数据中添加行-列维度,但这仍然是对值进行排序的情况,对吗?我的意图是我需要在地图中获取全部数据。数据集的大小是多少?使用不可拆分的压缩文件。在本例中,只有一个映射器处理数据。大小大约为380 MB,足以进行压缩,因此一个映射器将处理数据。请看一看gzip fomat的示例:我在集群下运行了它。还有哪些方法可以将映射器设置为1I,我将检查并确认。我需要检查Hadoop代码。我会更新答案,一旦我发现了什么,我想你不能改变它。即使是
Job
对象也有
setNumReduceTasks()
方法。但是,它没有
setNumMapTasks()
方法。
conf.setInt("mapreduce.job.running.map.limit", 1);