为什么hadoop total order partitioner上的拆分点顺序不对?

up9lanfz  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(652)

我使用hadoop全序分割器和随机采样器作为输入采样器。
但当我增加从属节点并将任务减少到8时,会出现以下错误:

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

我不知道这个错误的原因。
如何设置上三个参数的数目 inputsampler.randomsampler 功能?

wecizke3

wecizke31#

两个可能的问题
你有重复的钥匙
对于输入采样器和运行total order partitioner的任务,您使用的是不同的比较器
您可以通过下载分区文件并检查其内容来诊断此问题。分区文件是 total.order.partitioner.path 如果设置或 _partition.lst 否则。如果键是文本,则可以运行 hdfs dfs -text path_to_partition_file | less 去看看。这可能也适用于其他键类型,但我没有尝试过。
如果分区文件中有重复的行,那么您就有重复的键,否则您可能使用了错误的比较器。

如何修复

复制密钥

我最好的猜测是,您的密钥是如此不平衡,以至于分区之间记录的均匀划分会生成具有相同分割点的分区。
要解决这个问题,您有几个选择:
选择一个值作为更好地区分输入的键(可能不可能,但如果可以的话会更好)
使用更少的分区和缩减器(不像下一个解决方案那样具有可伸缩性或确定性,但是实现起来更简单,特别是当您只有少量的重复项时)。将原始分区数除以最大重复项数(例如,如果分区密钥文件列出: a , a , b , c , c , c , d , e 作为拆分点,则有9个异径管(8个拆分点)和最多3个副本。所以,使用3个异径管(3=地板(9/3)),如果你的采样很好,你可能会得到合适的分割点。为了获得完全的稳定性,如果分区步骤有重复的条目,您需要能够重新运行分区步骤,这样您就可以防止不平衡键的偶尔过度采样,但是在这种复杂程度上,您还可以研究下一个解决方案。
读取分区文件,重写它而不重复条目,计算条目数(调用它) num_non_duplicates )使用 num_non_duplicates+1 异径管。与其他减速器相比,带有复制键的减速器将有更多的工作,并且运行时间更长。如果reduce操作是交换的和关联的,那么可以通过使用组合器来减轻这种情况。

使用错误的比较器

一定要有 mapred.output.key.comparator.class 在两个调用中设置相同 writePartitionFile 以及使用 TotalOrderPartitioner ##您不需要阅读但可能会喜欢的额外内容:
这个 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]) >= 0 意味着如果一对分割点相同或顺序不对,则它们将被拒绝。
1或2个减速机将永远不会产生此错误,因为不能有超过1个分裂点,循环将永远不会执行。

qrjkbowd

qrjkbowd2#

您确定生成了足够的密钥吗?来自javadoc:totalorderpartitioner
输入文件必须使用相同的比较器进行排序并包含

JobContextImpl.getNumReduceTasks() - 1 keys.

相关问题