2017-05-08 52 views
1

我试图将20k文件批量加载到hbase表中。平均文件大小为400kb。但是有些文件大到70MB。所有文件放在一起的总大小是11GB。 该方法是标准的,在loadIncremenalFiles调用之后发送键值对。 当我运行10个文件的随机样本代码时,一切正常。我注意到生成的hfiles的大小是文件本身大小的1.3倍。 但是,当我为所有20k文件运行相同的代码时,我得到的hfiles放在一起的大小为400gb。数据本身的36倍。 除了表格数据之外,HFiles还包含索引和元数据,但即使如此,什么可以解释如此巨大的尺寸增加?hbase批量加载中的奇怪行为

回答

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()修复了此行为。

这在HADOOP-6298