mapreduce中的自定义动态分区

sqougxex  于 2021-05-27  发布在  Hadoop
关注(0)|答案(2)|浏览(467)

我正在使用mapreduce处理我的数据。我需要将输出存储在日期分区下。我的排序键是一个日期字符串。现在,如果在自定义partitioner类中重写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 正因为如此,我们最终将多个日期文件放在一个日期分区中。这是不需要的。关于如何处理这个问题有什么建议吗?

5ktev3wc

5ktev3wc1#

我认为在这种情况下,您不应该探索使用分区器和多重归约器。除非您知道数据集中有多少个唯一的日期,否则将无法设置缩减器的数量。
使用multipleoutputs将输出发送到多个文件(文件,而不是目录)。如果需要跨单独的目录发送它们,那么可以在mr之后的驱动程序调用中有一个步骤,该步骤将迭代输出目录,并根据文件名开始模式(在本例中是日期值)将文件移动到目录。
有关使用mo的示例,请参见以下内容。
另一个选项是运行normalmap reduce,将输出存储到常规的o/p dir,在其上创建一个hive表,并执行动态分区,以便根据日期列将输出发送到不同的dir。

ee7vknir

ee7vknir2#

多种格式是有效的解决方案。它也适用于创建目录。权威指南帮了我。
multipleoutputs的write()方法中指定的基路径是相对于输出目录进行解释的,因为它可能包含文件路径分隔符(/),所以可以创建任意深度的子目录。例如,以下修改按站点和年份对数据进行分区,以便每年的数据都包含在以站点id命名的目录中(例如029070-99999/1901/part-r-00000)

相关问题