hadoop流媒体确保每个减速机一个密钥

hadoop流媒体确保每个减速机一个密钥,hadoop,amazon-emr,hadoop-streaming,Hadoop,Amazon Emr,Hadoop Streaming,我有一个映射器,在处理数据时,它将输出分为3种不同的类型(类型是输出键)。我的目标是通过Reducer创建3个不同的csv文件,每个文件都包含一个键的所有数据,并带有一个标题行 键值可以更改,并且是文本字符串 现在,理想情况下,我希望有3个不同的减缩器,每个减缩器只会得到一个键和它的整个值列表 除此之外,这似乎不起作用,因为键没有映射到特定的还原器 在其他地方的答案是编写一个自定义分区器类,将每个所需的键值映射到特定的缩减器。这将是伟大的,除了我需要使用python流,我不能在我的工作中包括一个

我有一个映射器,在处理数据时,它将输出分为3种不同的类型(类型是输出键)。我的目标是通过Reducer创建3个不同的csv文件,每个文件都包含一个键的所有数据,并带有一个标题行

键值可以更改,并且是文本字符串

现在,理想情况下,我希望有3个不同的减缩器,每个减缩器只会得到一个键和它的整个值列表

除此之外,这似乎不起作用,因为键没有映射到特定的还原器

在其他地方的答案是编写一个自定义分区器类,将每个所需的键值映射到特定的缩减器。这将是伟大的,除了我需要使用python流,我不能在我的工作中包括一个自定义流jar,所以这似乎不是一个选项

我看到有一个备用的分区器类可以启用二次排序,但我并不清楚是否可以使用默认分区器或基于键字段的分区器来确保每个键最终都位于它自己的缩减器上,而无需编写java类和使用自定义流jar

如有任何建议,将不胜感激

示例

映射器输出:

csv2\t字段a、字段b、字段c csv1\t字段1、字段2、字段3、字段4 csv3\t字段化,字段绿色

问题是,如果我有3个减缩器,我的密钥分配结果如下:

reducer1        reducer2        recuder3
csv1            csv2
csv3

一个reducer获得两种不同的键类型,而一个reducer根本没有数据发送到它。这是因为hash(键csv1)mod 3和hash(键csv2)mod 3产生相同的值。

如果您一直使用流式处理,并且无法为自定义分区器包含任何外部jar,那么如果没有一些技巧,这可能无法按您希望的方式工作

如果这些是绝对的要求,你可以绕开它,但它很混乱

以下是您可以做的:

默认情况下,Hadoop使用哈希分区器,如下所示:

reducer1        reducer2        recuder3
csv1            csv2
csv3
key.hashCode()%numReducers


因此,您可以选择键,使其散列为1、2和3(或三个数字,使
x%3=1、2、3
)。这是一个令人讨厌的黑客行为,除非你没有其他选择,否则我不会建议你这么做。

如果你想自定义输出到不同的csv文件,你可以直接(用API)写入hdfs。正如您所知,hadoop将键和关联值列表传递给单个reduce任务。在reduce代码中,选中,而键是相同的,则写入相同的文件。如果出现另一个密钥,请手动创建新文件并写入其中。不管你有多少个减缩器,我很确定在流媒体下可以使用MultipleOutputFormat[1]。那会解决你的大部分问题


默认情况下,Hadoop将使用同一个键将所有数据发送到同一个reducer。你能举一些例子说明你正在尝试做什么以及它是如何不起作用的吗?这就是我决定要实现这一目标所需要做的。但是它太麻烦了,我决定使用一个减速机输出带有最终csv行的原始密钥,然后通过
cat part-00000 | grep key | cut-f2>key.csv为每个密钥运行我的输出文件。我在我的减速器中失去了并行性,我必须对我的输出进行后期处理,但我所做的一切似乎都很粗糙和丑陋。这似乎不是一个坏主意。。。谢谢你的建议!好电话。使用Python流化还原程序,他可以使用-file参数将(压缩的)Python HDFS库发送到任务节点,然后使用Python zipimport模块导入它们。这正是我所需要的,可以完全解决我的问题,但我不知道如何将其用于流化。有人建议创建一个包含MultipleOutputFormat代码的新streaming.jar文件,但我还没有找到任何好的教程,如果可以避免的话,我真的不想走那么远。我正在回答这个问题——如果您使用MultipleOutputFormat的子类创建自己的jar,您可以在streaming下使用这个根据键创建目录/文件名,并生成空的实际键。我想避免使用java,幸运的是,有一个clojure项目正好满足了我的需要:。。。关于如何构建/使用它的说明在github页面上。嘿,链接好像断了。这个答案已经有7年了,所以我想你不想再使用r0.20了。