MapReduce中的自定义动态分区

问题描述 投票:0回答:2

我正在使用MapReduce来处理我的数据。我需要将输出存储在日期分区下。我的排序键是日期字符串。现在,如果我在自定义分区器类中重写getPartition以返回以下内容:

return (formattedDate.hashCode() & Integer.MAX_VALUE) % numReduceTasks;

因为我们使用hash和Mod,在某些情况下我们返回一个相同的整数值,例如:让我们说numReduceTasks=100

Now the date 2018-01-20 might have hash value as 101. so 101%100 = 1

Now take other date as 2018-02-20 and might have hash value as 201. so 201%100 = 1因此我们最终将多个日期文件转到单日期分区。这是不希望的。关于如何处理这个的任何指针?

hadoop hive mapreduce bigdata partitioning
2个回答
1
投票

我想在这种情况下你不应该探索使用Partitioners和多个reducer。除非您知道数据集中有多少个唯一日期,否则您将无法设置减速器的数量。

使用MultipleOutputs代替将输出发送到多个文件。 (文件,但不是目录)。如果你需要在不同的目录中发送它们,你可以在MR之后进行驱动程序调用,这将迭代输出目录并根据文件名开始模式将文件移动到目录,在这种情况下将是日期值。

有关使用MO的示例,请参阅this

另一个选项是运行法线贴图reduce,将输出存储到常规o / p目录,在其上创建一个hive表,并执行动态分区,根据日期列将输出发送到不同的dirs。


0
投票

多种格式是有效的解决方案。它也适用于创建目录。权威指南帮助了我。

MultipleOutputs的write()方法中指定的基本路径相对于输出目录进行解释,并且因为它可能包含文件路径分隔符(/),所以可以创建任意深度的子目录。例如,以下修改按站和年分区数据,以便每年的数据包含在由站ID命名的目录中(例如029070-99999 / 1901 / part-r-00000)

© www.soinside.com 2019 - 2024. All rights reserved.