我有一个映射器,它在处理数据时将输出分类为 3 种不同的类型(类型是输出键)。我的目标是通过 reducer 创建 3 个不同的 csv 文件,每个文件都包含一个键的所有数据,并带有标题行。
键值可以更改并且是文本字符串。
现在,理想情况下,我想拥有 3 个不同的减速器,每个减速器只能获得一个键,它的整个值列表。
除了,这似乎不起作用,因为键没有映射到特定的减速器。
在其他地方对此的答案是编写一个自定义分区器类,它将每个所需的键值映射到特定的减速器。这会很棒,除了我需要在 python 中使用流式传输并且我无法在我的工作中包含自定义流式传输 jar,因此这似乎不是一个选项。
我在 hadoop 文档中看到有一个可用的备用分区器类可以启用二级排序,但对我来说并不是很明显可以使用基于默认或键字段的分区器来确保每个键结束无需编写 java 类并使用自定义流 jar 就可以使用它自己的 reducer。
任何建议将不胜感激。
例子:
映射器输出:
csv2\tfieldA,fieldB,fieldC csv1\tfield1,field2,field3,field4 csv3\tfieldRed,fieldGreen ...
问题是,如果我有 3 个减速器,我最终会得到这样的密钥分配:
reducer1 reducer2 recuder3
csv1 csv2
csv3
一个 reducer 获得两种不同的 key 类型,一个 reducer 根本没有收到任何数据。这是因为 hash(key csv1) mod 3 和 hash(key csv2) mod 3 产生相同的值。