我正在使用MapReduce处理我的数据。我需要将输出存储在日期分区下。我的排序键是日期字符串。现在,如果我在自定义分区程序类中重写getPartition以返回以下内容:
return (formattedDate.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
由于我们使用哈希和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
因此,我们最终将多个日期文件移到单个日期分区。这是不希望的。有关如何处理此问题的任何指示?
答案 0 :(得分:1)
我认为在这种情况下,您不应该探索使用Partitioners和多个reducer。除非您知道数据集中有多少个唯一的日期,否则您将无法设置减速器的数量。
改为使用MultipleOutputs将输出发送到多个文件。 (文件,而不是目录)。如果需要将它们发送到单独的目录中,则可以在MR之后的驱动程序调用步骤中进行迭代,以迭代输出目录并将文件基于文件名开始模式(在本例中为日期值)移动到目录中。
有关使用MO的示例,请参见this。
另一种选择是运行法线贴图缩减,将输出存储到常规o / p目录,在其顶部创建配置单元表,并执行动态分区以根据日期列将输出发送到不同的目录。
答案 1 :(得分:0)
多种格式是有效的解决方案,它也可以用于创建目录。权威指南帮助了我。
在MultipleOutputs的write()方法中指定的基本路径是相对于输出目录解释的,并且由于它可能包含文件路径分隔符(/),因此可以创建任意深度的子目录。例如,以下修改按工作站和年份对数据进行分区,以便将每年的数据包含在以工作站ID命名的目录中(例如029070-99999 / 1901 / part-r-00000)