两个可能的问题 你有重复的钥匙 对于输入采样器和运行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");
}
}
2条答案
按热度按时间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
错误消息来自代码:线路
comparator.compare(splitPoints[i], splitPoints[i+1]) >= 0
意味着如果一对分割点相同或顺序不对,则它们将被拒绝。1或2个减速机将永远不会产生此错误,因为不能有超过1个分裂点,循环将永远不会执行。
qrjkbowd2#
您确定生成了足够的密钥吗?来自javadoc:totalorderpartitioner
输入文件必须使用相同的比较器进行排序并包含