HBase作为列式存储,为什么它的scan性能这么低呢,列式存储不是更有利于scan操作么?Parquet格式也是列式,但它的scan这么优秀,他们的性能差异并不是因为数据组织方式造成的么?

已邀请:

hmaster

赞同来自: xiao_chenfan ruao87

HBase 本质是并不是列存,而是列簇存储。个人认为将HBase 理解为列存是不合适的。
只是不同的列簇数据才会存储在一起。而通常又不建议设置超过3个列簇。
HBase 物理存储路径  NameSpace->Table->Region->CF->HFile->Block->KeyValue.
HBase 底层存储为HFile 文件格式,HFile 存储单元为Block,Block有很多KeyValue ,一行数据对应很多KeyValue,简单理解就是一个rowkey+column(还有一些CF,时间戳等信息),可参见:http://hbase.apache.org/book.html#keyvalue
 
而Parquet /ORC 是真正意义上的列式存储。
一般情况下,相同数据记录使用Parquet 与HFile 存储相差10倍甚至上百倍都是可能的。
再加上列存可以直接从IO层面过滤掉不需要扫描的文件,所以Parquet scan性能很高效。
 
另外HFile 本身并不适合大范围全表scan,比较适合get/或者scan连续少量数据。

要回复问题请先登录注册