我最近正在学习 Phoenix CSV Bulk Load,我发现当一行中的列很大时,org.apache.phoenix.mapreduce.CsvToKeyValueReducer 的源代码会导致 OOM(java 堆内存不足)(在我的情况下,一行中有 44 列,平均大小为 1行是 4KB)。

更重要的是,这个类与 hbase 批量加载 reducer 类 - KeyValueSortReducer 类似。这意味着在我的情况下使用 KeyValueSortReducer 时可能会发生 OOM。

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

我期待着您的回复。给你最好的祝愿!

这是 KeyValueSortReducer 的源代码:

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);
    }
  }
}

最佳答案

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

关于hadoop - 为什么 hbase KeyValueSortReducer 需要对所有 KeyValue 进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37047145/

10-13 04:47