Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Hadoop total order partitioner上的拆分点出现故障?_Hadoop_Split_Mapreduce_Partitioner - Fatal编程技术网

为什么Hadoop total order partitioner上的拆分点出现故障?

为什么Hadoop total order partitioner上的拆分点出现故障?,hadoop,split,mapreduce,partitioner,Hadoop,Split,Mapreduce,Partitioner,我使用Hadoop total order partitioner和random sampler作为输入采样器 但是,当我增加从属节点并将任务减少到8时,会出现以下错误: Caused by: java.io.IOException: Split points are out of order 我不知道这个错误的原因 如何设置inputsampler.randomsampler函数中三个参数的数量?您确定生成了足够的键吗? 从javadoc: 输入文件必须使用相同的比较器排序并包含 JobCo

我使用Hadoop total order partitioner和random sampler作为输入采样器

但是,当我增加从属节点并将任务减少到8时,会出现以下错误:

Caused by: java.io.IOException: Split points are out of order
我不知道这个错误的原因


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

您确定生成了足够的键吗? 从javadoc:

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

JobContextImpl.getNumReduceTasks() - 1 keys.
两个可能的问题

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

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

如何修复 复制钥匙 我最好的猜测是,您的键是如此不平衡,以至于分区之间记录的均匀划分正在生成具有相同分割点的分区

要解决此问题,您有几个选项:

  • 选择一个值用作更好地区分输入的键(可能不可能,但如果可以,效果会更好)
  • 使用更少的分区和缩减器(不像下一个解决方案那样具有可伸缩性或确定性,但更易于实现,尤其是在只有少量重复项的情况下)。将原始分区数除以最大重复项数。(例如,如果您的分区密钥文件列出:
    a
    a
    b
    c
    c
    d
    e
    作为拆分点,则您有9个异径管(8个拆分点)和最多3个副本。因此,请使用3个异径管(3=地板(9/3))如果你的采样很好,你可能会得到适当的分割点。为了完全稳定,如果分区步骤有重复的条目,你需要能够重新运行分区步骤,这样你就可以防止偶尔对不平衡的键进行过度采样,但在这种复杂程度上,你还可以研究下一个解决方案
  • 读取分区文件,在没有重复项的情况下重写它,计算条目数(称之为
    num\u non\u duplicates
    )并使用
    num_non_duplicates+1
    减速机。具有重复键的减速机将比其他减速机有更多的工作,并且运行时间更长。如果减速机操作是可交换和关联的,则可以使用组合器来缓解此问题
使用错误的比较器 确保在调用
writePartitionFile
和使用
TotalOrderPartitioner

您不需要阅读但可能会喜欢的额外内容:
拆分点出现故障
错误消息来自代码:

  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");
    }
  }
RawComparator比较器=
(RawComparator)作业。getOutputKeyComparator();
对于(int i=0;i=0){
抛出新IOException(“拆分点出现故障”);
}
}
comparator.compare(splitPoints[i],splitPoints[i+1])>=0
表示如果一对分割点相同或顺序错误,则拒绝它们


1或2个还原器将永远不会生成此错误,因为拆分点不能超过1个,循环将永远不会执行。

缺少键将生成错误消息:“键集中的分区数错误”。这不是问题所在。