为了账号安全,请及时绑定邮箱和手机立即绑定

HBase的列式存储在查询时如何读取

/ 猿问

HBase的列式存储在查询时如何读取

MMTTMM 2018-10-09 09:13:09

首先HBase是列式存储,也就是说在一个HFILE(Storefile)中存放着一个列族,在HFILE大小达到阈值后会触发split操作将原Region下线分裂成两个等同的region并取其一发送到新的regionserver,这个理解应该是正确的吧?
然而很明显,一个列族中,不同的列根据数据类型不同,所占空间大小也一样,比如cf:a中存放int,一个值只占1K(假设,大小不要在意)而cf:b中存放bigint,一个值占1M(还是假设)而cf2:c中存放string,一个值占10M,而HFILE则是以大小为标准而非条目数为标准,所以每个HFILE中存储的条目数势必是不相等的
那么同一个datanode中的HFILE,可能存储了cf:a到100w列,而cf:b则存到了第50w列,cf2:c中则仅存储了10w列就存完了(请不要在意条目数与HFILE分裂阈值的关系,这里的数值为了让差距明显而刻意改变)
这时我的问题来了:当我需要第90000列进行cf:a+cf:b+cf2:c运算的时候,cf:a的第9w列在datanode1上,cf:b的第9w列在datanode2上,而cf2:c的第9w列在datanode3上。
这时HBASE会通过网络传输这些列到任意机器上吗?
上面只是一个数据量极小的假设,那么将数据量同步扩大
我需要批量计算共计10w列的cf:a+cf:b+cf2:c运算,而这10w列很可能将分布在不同的datanode中,这时会造成网络堵塞吗?(或者最起码,要把这些数据读出来进行网络传输,总要进行IO吧)
而HBASE是一个基于大量数据的数据库,在进行大量数据计算时先要进行大量的网络数据重新传输然后再计算,这个结论显然是不对的
请问我哪里理解错误了呢?
求大神解答

查看完整描述

目前暂无任何回答

  • 0 回答
  • 0 关注
  • 573 浏览

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信