如何设计每个Map器来处理sequencefile的每一行?

ezykj2lf  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(399)

我有一个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的相似(或等效)的输入行数?

aor9mmx1

aor9mmx11#

您不能控制有多少行到特定的Map器,但可以控制哪些数据到哪个还原器。您可以更改Map器以简单地传递数据。然后创建自定义分区器,将数据均匀地拆分到缩减器。然后在reducer中执行需要大量ram的逻辑。

相关问题