强制hadoop将map任务设置为1

时间:2016-01-05 11:18:38

标签: java hadoop mapreduce

我认为我的问题让每个人都感到困惑。更清楚一点。 我正在尝试订购我的数据。 说我的数据(几条记录)就像这样

0 1 2 3 4
1 3 8 9 2
2 8 7 9 7

我的块大小为128 MB,文件大小为380 Mb(3个块) 我想给我的记录一个订单号。

1,0 1 2 3 4
2,1 3 8 9 2
3,2 8 7 9 7

为了给出正确的数字,我需要将数据输入到1个地图中,如果我得到3个地图任务,我的编号将不正确。

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

一旦我使用

将mappers设置为1
 -D mapreduce.job.maps=1

conf.setInt("mapreduce.job.running.map.limit", 1);

我的输出会生成3个部分-000 *文件

我正在使用Hadoop 2.6.0-cdh5.4.7 cloudera版本。

我做错了吗? 请建议

4 个答案:

答案 0 :(得分:1)

  • 映射器数量

    -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_MAPS是:

    public static final String NUM_MAPS = "mapreduce.job.maps";
    

    并将其设置为由writeSplits()方法计算的拆分数。

    因此,您的设置不会生效。

  • 映射器限制

    conf.setInt("mapreduce.job.running.map.limit", 1);
    

    此设置仅控制同时发布者的最大数量

答案 1 :(得分:0)

如果您想对数据进行排序,重要的是减少是您工作的一部分。 如果你想要n个已排序的文件,那么普通的reduce会这样做,如果你想要一个输出文件,那么你需要将reducers的数量设置为1(类似于你对map做的)。

将地图集的数量设置为1对您尝试实现的其他内容没有影响,然后降低作业速度!

答案 2 :(得分:0)

不是将映射器数设置为1,而是通过在Mapper端使用辅助排序以不同方式解决问题。

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

请查看此article以了解java中的工作代码示例。

也要看看这个问题:hadoop map reduce secondary sorting

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

有关详细信息,请查看此presentation

答案 3 :(得分:0)

mapreduce.job.maps here个州的说明

  

当mapreduce.jobtracker.address为“local”时忽略

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

要进行排序,编写应用程序代码的map方法适用于单个输入。所以,如果你想要排序发生地图阶段,它会变得复杂。另一方面,如果你在reduce方面进行排序,那几乎是直截了当的。