如何在reducer中用同一个键输出多个值?

y53ybaqx  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(333)

我有一个分类的文本文件,我想为每个类别创建一个序列文件,其中键是类别名称,值由该类别的所有文件的所有文本内容组成。
我有一个只有两列的nosql数据库。每行表示一个文件,第一列是类别名称,第二列是存储在hdfs上的文本文件的绝对地址。我的Map器读取数据库和输出对,其中键是类别,值是绝对地址。在reducer中,我有每个类别的所有文件的地址,我想为每个类别创建一个序列文件,其中键是类别名称,值由属于该类别的所有文件的所有文本内容组成。
一个简单的解决方案是遍历这些对(在reducer中)并逐个打开文件,将其内容附加到字符串变量,最后使用 MultipleOutputs . 但是,由于文件大小可能很大,将内容附加到单个字符串可能是不可能的。有没有不使用字符串变量的方法?

jtoj6r0c

jtoj6r0c1#

然后,由于reducer中包含所有文件,因此可以获取这些文件的内容,并使用stringbuilder进行附加以节省内存,然后丢弃该stringbuilder引用。如果避免使用字符串是您的问题,那么stringbuilder是一种快速的方法。涉及文件访问和读取的io操作是资源密集型的。不过,考虑到hadoop中的reducer架构,数据本身应该是可以的。
你也可以考虑使用组合器。但是,这主要是用来减少Map和Map之间的流量。您可以利用在combiner上准备部分序列文件,然后在reducer级别保留。当然,这是有效的,只有当内容可以添加,因为它来了,而不是基于特定的顺序。

相关问题