【问题标题】:Custom Dynamic Partitions in MapReduceMapReduce 中的自定义动态分区
【发布时间】:2019-02-06 19:38:31
【问题描述】:

我正在使用 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 正因为如此,我们最终将多个日期文件转到单个日期分区。这是不希望的。有关如何处理此问题的任何指示?

【问题讨论】:

    标签: hadoop hive mapreduce bigdata partitioning


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 使用比较器怎么样?分区后?它不会创建日期分区吗?
    • 如果你想写入n个不同的日期目录,每个reducer处理一个日期,问题将是确定reducer的实际数量。如果您事先知道您的数据集上有多少不同的日期,那将是实用的。或者什么是最小和最大日期等。使用配置单元表和动态分区方法可能比为此编写 MR 更好。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      相关资源
      最近更新 更多