我正在尝试将20k文件批量加载到hbase表中。平均文件大小为400kb。但是有些文件大到70mb。放在一起的所有文件的总大小为11gb。 该方法是标准的,在调用loadIncremenalFiles之后发出键值对。 当我为10个文件的随机样本运行代码时,一切正常。我注意到生成的hfiles的大小是文件本身大小的1.3倍。 但是,当我为所有20k文件运行相同的代码时,我得到的hfiles,放在一起,大小为400gb。数据本身的36倍。 除了表格数据之外,HFile还包含索引和元数据,但即便如此,可以解释这种大幅增加的原因吗?
答案 0 :(得分:1)
我发现了空间急剧增加背后的原因。
这是我的映射器发出键值对的样子(输入是序列文件)。
public void map(Text key, BytesWritable value, Context context)
....
byte[] row = Bytes.toBytes(rowID);
hKey.set(row);
kv=getKV(familyRaw, Bytes.toBytes("content"), value.getBytes());
问题在于电话value.getBytes()
。它返回一个用零填充的字节数组。将其更改为value.copyBytes()
可修复此行为。