作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
最近在学习Phoenix CSV Bulk Load,发现org.apache.phoenix.mapreduce.CsvToKeyValueReducer
的源码在列比较大的时候会导致OOM(java heap out of memory)一行(在我的例子中,一行 44 列,一行的平均大小为 4KB)。
此外,该类与 hbase 批量负载 reducer 类 - KeyValueSortReducer
类似。这意味着在我的情况下使用 KeyValueSortReducer
时可能会发生 OOM。
所以,我有一个关于 KeyValueSortReducer
的问题 - 为什么它需要先对 treeset 中的所有 kvs 进行排序,然后将它们全部写入上下文?如果我删除树集排序代码并将所有 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/
最近在学习Phoenix CSV Bulk Load,发现org.apache.phoenix.mapreduce.CsvToKeyValueReducer的源码在列比较大的时候会导致OOM(java
我是一名优秀的程序员,十分优秀!