仅将 Hadoop MapReduce 输出写入 2 个平面文件
Posted
技术标签:
【中文标题】仅将 Hadoop MapReduce 输出写入 2 个平面文件【英文标题】:Writing Hadoop MapReduce output to just 2 flat files 【发布时间】:2013-06-19 06:22:44 【问题描述】:所以我有一个 MapReduce 作业,它接收多篇新闻文章并输出以下键值对。
.
.
.
<article_id, social_tag.name, social_tag.isCompany, social_tag.code>
<article_id2, social_tag2.name, social_tag2.isCompany, social_tag.code>
<article_id, topic_code.name, topic_code.isCompany, topic_code.rcsCode>
<article_id3, social_tag3.name, social_tag3.isCompany, social_tag.code>
<article_id2, topic_code2.name, topic_code2.isCompany, topic_code2.rcsCode>
.
.
.
如您所见,我目前正在输出两种主要不同类型的数据行,而现在,它们在 mapreduce 输出的平面文件中混合在一起。无论如何我可以简单地将social_tags输出到file1,将topic_codes输出到file2,或者将social_tags输出到指定的文件组(social1.txt,social2.txt ..etc),将topic_codes输出到另一组(topic1.txt,topic2.txt。 ..等)
我问这个的原因是我以后可以轻松地将所有这些存储到 Hive 表中。我最好希望为每种不同的数据类型(topic_code、social_tag 等)创建一个单独的表也很有帮助。
提前致谢!
【问题讨论】:
***.com/questions/10436811/… 您可以使用自定义Partitioner
【参考方案1】:
您可以按照已经建议的方式使用 MultipleOutputs。 正如您所要求的那样,您需要一种简单的方法来实现这一点,而无需将 mapreduce 输出分离到不同的文件中。如果数据量不是很大,这是一种快速方法!并且区分数据的逻辑并不太复杂。
首先将混合输出文件加载到配置单元表中(比如 main_table)。然后可以创建两个不同的表(topic_code、social_tag),将主表中的数据通过where子句过滤后插入。
hive > insert into table topic_code
> select * from main_table
> where $condition;
// $condition = the logic you would use to differentiate the records in the MR job
【讨论】:
【参考方案2】:我认为您可以尝试 hadoop API 中的 MultipleOutputs。 MultipleOutputs 允许您将数据写入其名称派生自 输出键和值,或者实际上来自任意字符串。这允许每个减速器(或 mapper 在仅映射作业中)创建多个文件。文件名的格式为 name-m-nnnnn 用于 map 输出, name-r-nnnnn 用于 reduce 输出,其中 name 是 由程序设置的任意名称,并且 nnnnn 是指定零件的整数 数字,从零开始。
在生成输出的 reducer 中,我们在 setup() 方法中构造了一个 MultipleOutputs 实例并将其分配给一个实例变量。然后我们使用 reduce() 方法中的 MultipleOutputs 实例写入输出,代替 语境。 write() 方法接受键和值以及名称。
您可以查看以下链接了解详情
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/lib/MultipleOutputs.html
【讨论】:
以上是关于仅将 Hadoop MapReduce 输出写入 2 个平面文件的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop MapReduce 作业成功完成,但未向 DB 写入任何内容