Hadoop MapReduce中的自定义动态分区

Hadoop MapReduce中的自定义动态分区,hadoop,hive,mapreduce,bigdata,partitioning,Hadoop,Hive,Mapreduce,Bigdata,Partitioning,我正在使用MapReduce处理我的数据。我需要将输出存储在日期分区下。我的排序键是一个日期字符串。现在,如果我在自定义分区器类中重写getPartition以返回以下内容: return (formattedDate.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 因为当我们使用hash和Mod时,在某些情况下我们返回相同的整数值 如: 比如说numReduceTasks=100 现在日期2018-01-20的散列值可能为101。所

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

return (formattedDate.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
因为当我们使用hash和Mod时,在某些情况下我们返回相同的整数值 如: 比如说
numReduceTasks=100

现在日期2018-01-20的散列值可能为101。所以101%100=1

现在将其他日期定为2018-02-20,散列值可能为201。所以201%100=1

正因为如此,我们最终将多个日期文件放在一个日期分区中。这是不可取的。关于如何处理这个问题有什么建议吗?

我认为在这种情况下,您不应该探索使用分区器和多个还原器。除非您知道数据集中有多少个唯一的日期,否则将无法设置减缩器的数量

改为使用将输出发送到多个文件。(文件,但不是目录)。如果需要跨单独的目录发送它们,可以在MR之后的驱动程序调用中设置一个步骤,该步骤将迭代输出目录,并根据文件名开始模式将文件移动到目录中,在本例中,该模式将是日期值

有关使用MO的示例,请参见


另一个选项是运行普通映射reduce,将输出存储到常规o/p dir,在其上创建一个配置单元表,并执行动态分区,以便根据日期列将输出发送到不同的dir

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

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


使用比较器怎么样?在分裂者之后?它不会创建日期分区吗?如果您想在每个减缩器处理一个日期的情况下写入n个不同的日期目录,那么问题在于确定减缩器的实际数量。如果您事先知道您的数据集上存在多少不同的日期,那么这是可行的。或者什么是最小日期和最大日期等等。使用配置单元表和动态分区方法可能比为此编写MR更好。