【问题标题】:Why split points are out of order on Hadoop total order partitioner?为什么 Hadoop 全序分区器上的分割点出现故障?
【发布时间】:2015-06-22 11:00:30
【问题描述】:

我使用 Hadoop 全序分区器和随机采样器作为输入采样器。

但是当我增加我的从节点并将任务减少到 8 个时,我收到以下错误:

Caused by: java.io.IOException: Split points are out of order

我不知道这个错误的原因。

inputsampler.randomsampler函数上如何设置三个参数的个数?

【问题讨论】:

    标签: hadoop split mapreduce partitioner


    【解决方案1】:

    两个可能的问题

    • 您有重复的键
    • 您正在为输入采样器和运行全序分区器的任务使用不同的比较器

    您可以通过下载分区文件并检查其内容来诊断此问题。如果设置了分区文件,则为total.order.partitioner.path 的值,否则为_partition.lst。如果您的密钥是文本,您可以运行hdfs dfs -text path_to_partition_file | less 来查看。这可能也适用于其他密钥类型,但我还没有尝试过。

    如果分区文件中有重复的行,则说明您有重复的键,否则您可能使用了错误的比较器。

    如何解决

    重复键

    我的最佳猜测是您的键非常不平衡,以至于分区之间的记录均匀划分会生成具有相同分割点的分区。

    要解决这个问题,您有多种选择:

    • 选择一个值作为键来更好地区分您的输入(可能不可能,但如果可以的话会更好)
    • 使用更少的分区和reducer(不像下一个解决方案那样可扩展或确定,但实现起来更简单,特别是如果您只有几个重复项)。将原始分区数除以最大重复条目数。 (例如,如果您的分区键文件列出:aabcccde 作为拆分点,那么您有 9 个减速器(8 个分割点)和最大重复 3 个。所以,使用 3 个减速器(3=floor(9/3)),如果你的采样很好,你最终可能会得到适当的分割点。为了完全稳定,你会如果它有重复的条目,则需要能够重新运行分区步骤,这样您就可以防止偶尔对不平衡键进行过度采样,但是在这种复杂程度下,您不妨考虑下一个解决方案。李>
    • 读取分区文件,在没有重复条目的情况下重写它,计算条目数(称之为num_non_duplicates)并使用num_non_duplicates+1减速器。具有重复键的减速器将比其他减速器做更多的工作并且运行时间更长。如果 reduce 操作是可交换和关联的,您可以通过使用组合器来缓解这种情况。

    使用了错误的比较器

    确保在对writePartitionFile 的调用和使用TotalOrderPartitioner 的作业中设置相同的mapred.output.key.comparator.class

    您不需要阅读但可能会喜欢的额外内容:

    Split points are out of order 错误信息来自代码:

      RawComparator<K> comparator =
        (RawComparator<K>) job.getOutputKeyComparator();
      for (int i = 0; i < splitPoints.length - 1; ++i) {
        if (comparator.compare(splitPoints[i], splitPoints[i+1]) >= 0) {
          throw new IOException("Split points are out of order");
        }
      }
    

    comparator.compare(splitPoints[i], splitPoints[i+1]) &gt;= 0 行表示如果一对分割点相同或无序,则拒绝它们。

    1 或 2 个 reducer 永远不会产生此错误,因为分割点不能超过 1 个,并且循环永远不会执行。

    【讨论】:

      【解决方案2】:

      您确定生成了足够的密钥吗? 来自 javadoc:TotalOrderPartitioner

      输入文件必须用相同的比较器排序并包含

      JobContextImpl.getNumReduceTasks() - 1 keys.
      

      【讨论】:

      • 缺少密钥会生成错误消息:“密钥集中的分区数错误”。这不是问题。
      猜你喜欢
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2016-09-16
      相关资源
      最近更新 更多