Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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 为什么hbase KeyValues或Treducer需要对所有KeyValues进行排序_Hadoop_Hbase_Phoenix_Bulk Load - Fatal编程技术网

Hadoop 为什么hbase KeyValues或Treducer需要对所有KeyValues进行排序

Hadoop 为什么hbase KeyValues或Treducer需要对所有KeyValues进行排序,hadoop,hbase,phoenix,bulk-load,Hadoop,Hbase,Phoenix,Bulk Load,我最近在学习Phoenix CSV批量加载,我发现org.apache.Phoenix.mapreduce.CsvToKeyValueReducer的源代码在一行中的列较大时(在我的例子中,一行中有44列,一行的平均大小为4KB)会导致OOM(java堆出内存) 此外,该类与hbase大容量减速机类类似-KeyValuesOrtDucer。这意味着在我的情况下,在使用KeyValuesOrtDucer时可能会发生OOM 因此,我有一个问题是KeyValueSortReducer-为什么需要首先对

我最近在学习Phoenix CSV批量加载,我发现
org.apache.Phoenix.mapreduce.CsvToKeyValueReducer
的源代码在一行中的列较大时(在我的例子中,一行中有44列,一行的平均大小为4KB)会导致OOM(java堆出内存)

此外,该类与hbase大容量减速机类类似-
KeyValuesOrtDucer
。这意味着在我的情况下,在使用
KeyValuesOrtDucer
时可能会发生OOM

因此,我有一个问题是
KeyValueSortReducer
-为什么需要首先对treeset中的所有KV进行排序,然后将它们全部写入上下文?如果我删除treeset排序代码并将所有kvs直接写入上下文,结果将不同或错误?

我期待着你的答复。祝你好运

以下是KeyValuesOrtDucer的源代码:

public class KeyValueSortReducer extends Reducer<ImmutableBytesWritable, KeyValue, ImmutableBytesWritable, KeyValue> {
  protected void reduce(ImmutableBytesWritable row, java.lang.Iterable<KeyValue> kvs,
      org.apache.hadoop.mapreduce.Reducer<ImmutableBytesWritable, KeyValue, ImmutableBytesWritable, KeyValue>.Context context)
  throws java.io.IOException, InterruptedException {
    TreeSet<KeyValue> map = new TreeSet<KeyValue>(KeyValue.COMPARATOR);
    for (KeyValue kv: kvs) {
      try {
        map.add(kv.clone());
      } catch (CloneNotSupportedException e) {
        throw new java.io.IOException(e);
      }
    }
    context.setStatus("Read " + map.getClass());
    int index = 0;
    for (KeyValue kv: map) {
      context.write(row, kv);
      if (++index % 100 == 0) context.setStatus("Wrote " + index);
    }
  }
}
公共类KeyValueSortReducer扩展了Reducer{
受保护的void reduce(ImmutableBytesWritable行、java.lang.Iterable kvs、,
org.apache.hadoop.mapreduce.Reducer.Context)
抛出java.io.IOException、InterruptedException{
树集映射=新树集(KeyValue.COMPARATOR);
用于(关键值kv:kvs){
试一试{
map.add(kv.clone());
}捕获(CloneNotSupportedException e){
抛出新的java.io.IOException(e);
}
}
setStatus(“Read”+map.getClass());
int指数=0;
用于(键值kv:map){
上下文。写入(行,千伏);
如果(++索引%100==0)context.setStatus(“写入”+索引);
}
}
}

请查看。有些要求需要将键值对排序到HFile中的同一行中。

1.主要问题:为什么hbase键值或减速机需要对所有键值进行排序?

感谢RamPrasad G的回复,我们可以研究案例研究:

本案例研究将告诉我们更多有关hbase批量导入和reducer类-KeyValueSortReducer的信息。 在KeyValueSortReducer Reducer方法中对所有KeyValue进行排序的原因是HFile需要这种排序。您可以关注以下部分:

减少词法顺序是一个经常发生的问题。当要从reducer输出的keyvalue列表未排序时,会发生这种情况。一个例子是,单行的限定符名称没有按词汇递增顺序写入。另一种情况是,当多行以相同的reduce方法写入时,行id不会以词汇递增的顺序写入。这是因为减速器输出从未排序。所有排序都发生在映射器输出的keyvalue上,在它进入reduce方法之前。所以,它尝试以增量方式添加reduce方法输出的keyvalue,假设它是预排序的。所以,在将keyvalue写入上下文之前,必须将它们添加到排序列表中,如使用keyvalue.COMPARATOR作为比较器的TreeSet或HashSet,然后按照排序列表指定的顺序写入它们

因此,当列非常大时,它将使用大量内存进行排序。 作为KeyValuesOrtDucer的源代码:

/**
 * Emits sorted KeyValues.
 * Reads in all KeyValues from passed Iterator, sorts them, then emits
 * KeyValues in sorted order.  If lots of columns per row, it will use lots of
 * memory sorting.
 * @see HFileOutputFormat
 */
2.参考问题:为什么菲尼克斯CSV减重机会出现故障?

菲尼克斯CSV减速机故障原因是参考的问题。 由于比较两个CsvTableRowKeyPair并使所有行在一次reduce调用中通过一个reducer时发生比较器内部的
CsvTableRowKeyPair
错误, 对我来说,这会很快引起OOM

幸运的是,Phoenix团队在4.7版本上解决了此问题。如果您的Phoenix版本低于4.7,请注意并尝试更新您的版本, 或者,您可以对您的版本进行修补


我希望这个答案对你有帮助

谢谢你的回复。但我仍然不明白为什么需要先对treeset中的所有KV进行排序,然后将它们全部写入上下文?我真的知道树集的功能。这是否符合hbase对所有列中的一行进行排序的内部要求?我不知道hbase数据存储的内部机制。抱歉误解。我已经重写了一个案例研究的链接,也许它会回答你的问题。谢谢你,RamPrasad G。通过一些研究和您的案例研究,我想我知道了为什么需要对reduce中一行的所有kv进行排序。目的是在HFile需要此排序时进行总排序。我提到的菲尼克斯减速机是菲尼克斯发行的:菲尼克斯2649。我已发现问题并立即解决异常。非常感谢。很高兴知道你对OOM的修正是什么?我发现凤凰队已经在4.7版本中修正了OOM问题。您可以搜索链接以了解更多信息: