我有一个sequencefile,它是从以前的mapreduce作业生成的。这个sequencefile有n行,每行是一对键和值,都是文本对象。
line1: key1 \t value1
line2: key2 \t value2
line3: key3 \t value3
...
lineN: keyN \t valueN
我使用这个sequencefile作为新mapreduce作业的输入。在这个新的mapreduce作业中,我希望每个Map器处理这个sequencefile的几行,例如2行。
line1, line2 goes to mapper1
line3, line4 goes to mapper2
.....
line(N-1), lineN goes to mapperN
我不能使用nlineinputformat,因为它只用于文本文件。因此,我使用了sequencefileinputformat并让hadoop将数据拆分为每个40mb(我的blocksize=40m)。即使每个分割的大小相等,也有一些Map器比其他Map器接收更多的数据(即线)。例如,5行到mapper1,而只有1行到mapper2。因此,mapper2完成得非常快,而mapper1需要很长时间,而且很多时候由于java堆大小溢出而失败。
我尝试了以下方法,但都没有成功:
更改块大小:
增加Map绘制者的数量:问题仍然是一样的。由于没有输入行,许多Map程序完成得非常快,而有几个Map程序几乎完成了输入,这永远不会完成。
将sequencefile转换为文本文件,然后使用nlineinputformat:由于文本文件占用太多内存,我得到了java堆大小溢出。这就是为什么我要使用sequencefile,因为它支持压缩。
我的问题是:
如何使每个Map器获得一个sequencefile的相似(或等效)的输入行数?
1条答案
按热度按时间aor9mmx11#
您不能控制有多少行到特定的Map器,但可以控制哪些数据到哪个还原器。您可以更改Map器以简单地传递数据。然后创建自定义分区器,将数据均匀地拆分到缩减器。然后在reducer中执行需要大量ram的逻辑。