我认为我的问题让每个人都感到困惑。更清楚一点。 我正在尝试订购我的数据。 说我的数据(几条记录)就像这样
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版本。
我做错了吗? 请建议
答案 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方面进行排序,那几乎是直截了当的。