我有一个映射器,在处理数据时,它将输出分为3种不同的类型(类型是输出键)。我的目标是通过还原器创建3个不同的csv文件,每个文件都包含一个带有头行的键的所有数据。
键值可以更改,并且是文本字符串。
现在,理想情况下,我希望有3个不同的减速器和每个减速器将只得到一个键,它的整个列表的值。
但是,这似乎不起作用,因为键没有映射到特定的减速器。
在其他地方,解决这个问题的方法是编写一个自定义分区器类,该类将每个想要的键值映射到特定的还原器。这将是很好的,除了我需要使用流与python,我不能包括一个自定义流jar在我的工作,所以这似乎不是一个选择。
我看到了在hadoop文档中,有一个可供选择的分区类可以启用二级排序,但我并不认为使用默认的或基于键字段的分区器可以确保每个键在不编写java类和使用自定义流jar的情况下在自己的还原器上结束。
如有任何建议,将不胜感激。
示例
mapper输出:
fieldB,fieldC csv1\tfieldA 1,field2,field3,field4 csv3\tfieldA红,fieldGreen .
问题是,如果我有3个减速器,我就会得到这样的密钥分配:
reducer1 reducer2 recuder3
csv1 csv2
csv3一个减速机得到两种不同的键类型,而一个减速器根本没有收到发送给它的数据。这是因为散列(键csv1) mod 3和散列(Key csv2) mod 3的值相同。
发布于 2011-10-24 21:58:09
我很确定MultipleOutputFormat 1可以在流媒体下使用。这能解决你的大部分问题。
http://hadoop.apache.org/common/docs/r0.20.1/api/org/apache/hadoop/mapred/lib/MultipleOutputFormat.html
发布于 2011-09-18 03:33:17
如果您被流所困,并且不能为自定义分区程序包含任何外部jars,那么如果没有一些黑客,这可能无法按照您希望的方式工作。
如果这些是绝对的需求,您可以绕过这些,但这是混乱的。
以下是你能做的:
默认情况下,Hadoop使用散列分配器,如下所示:
key.hashCode() % numReducers
因此,您可以选择键,使其散列为1、2和3(或三个数字,如x % 3 = 1, 2, 3)。这是一次严重的黑客攻击,除非你没有其他选择,否则我不会建议它。
发布于 2011-09-20 12:26:57
如果您想要自定义输出到不同的csv文件,您可以直接写入(使用API)到hdfs。如您所知,hadoop将带键和相关的值列表传递给单个约简任务。在减少代码,检查,而键是相同的写入相同的文件。如果另一个键出现,请手动创建新文件并写入其中。不管你有多少减速器
https://stackoverflow.com/questions/7431901
复制相似问题