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

首先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是一个基于大量数据的数据库,在进行大量数据计算时先要进行大量的网络数据重新传输然后再计算,这个结论显然是不对的
请问我哪里理解错误了呢?
求大神解答

hbase的region是按行划分,而非按列,如果你读取指定一行的所有列数据,regionServer虽然无法保证你的所有数据都在一个HFile中,但是至少是在一个Region中。但是具体的HFile所在的hdfs的节点那就不是HBase关心的事了,因为HBase的存储是依赖与hdfs,所以底层存储读取的事会由NameNode操心,NameNode会考虑就近原则,而提供最高效的数据读取策略。
你的数据传输是必然,但是HBase不会计算,计算是发生在你将想要的数据获取到之后再自行进行计算的。你读取大量数据必然会有大量数据传输,HBase只是将提供了一种高效的数据读取策略,尽量减小数据传输量
温馨提示:内容为网友见解,仅供参考
无其他回答

hbase 的存储是排序存储的吗
visit[h连向的点]) dfs(h连向的点) stack[++]=h } for(所有点) if(!visit[这个点]) dfs(这个点) 然后按栈输出即可,这个一定是对的,因为我们每次把这个点加入栈之前都已经把这个点连向的点加入栈了,所以满足拓扑序! ”软盘是顺序存储的存储媒体吗 问题叙述的不详细,也没...

列式数据库和行式数据库的区别
查询时需要整行扫描,即使只查询某一列数据,也会额外获取其他数据。列式数据库如HBase,数据以列形式存贮,每一列存储相同属性的数据,查询某列数据时,仅需获取该列,减少磁盘IO,提高查询效率。行式数据库常用于传统业务场景,而列式数据库适用于海量数据分析等场景。在查询方面,行式数据库需要整行...

HBase数据结构是什么?
全表扫描(scan)RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10-100bytes),在HBASE内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)Column Family...

为什么说HBase是列式数据库?
Hbase是一个面向列存储的分布式存储系统,它的优点在于可以实现高性能的并发读写操作,同时Hbase还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性。通常,顺序读取数据要比随机访问更快。而且,硬盘寻址时间的提升比起CPU速度的进步要慢得多 (参看摩尔定律),在使用硬盘作为存储媒介的系统上这...

hbase和传统数据库的区别
HBase采用了列式存储的方式,将数据按列存储,适合存储大规模、稀疏的数据。传统数据库则采用了行式存储,将数据按行存储,适合存储结构化的数据。由于存储方式的不同,HBase在读取和查询大规模数据时具有较高的性能优势,而传统数据库在处理事务和复杂查询时较为擅长。此外,HBase和传统数据库在适用场景...

传统的行存储和(HBase)列存储的区别
按列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量,一个字段的数据聚集存储,那就更容易为这种聚集存储设计更好的压缩\/解压算法。传统的(Oracle)行存储和(Hbase)列存储的区别 这里写图片描a 1、数据是按行存储的 2、没有索引的查询使用大量I\/O 3、建立...

什么是列式存储?
列式存储则是按列分隔数据,如将数据按不同列复制、粘贴到不同文件。MySQL等传统数据库采用行式存储,适用于在线事务处理(OLTP),而ClickHouse、Hive和HBase等数据库则更多采用列式存储,适用于在线分析处理(OLAP)场景。列式存储的优势在于能够快速读取特定列。例如,计算平均成绩时,行式存储需要从...

HBase存储格式
每个Data Block,作为I\/O的基本单元,可通过表创建时指定大小,以平衡顺序Scan和随机查询的效率。每个KeyValue对由固定结构的byte数组组成,包括Key和Value的长度、RowKey、Family、Qualifier、Timestamp和KeyType等信息。Value部分为二进制数据。HLog FileHLog File是HBase Write Ahead Log(WAL)的存储格式...

HBase 底层原理详解(深度好文,建议收藏)
HBase中表的特点是行键用于检索记录,支持三种访问方式:按行键、按行键范围和通过Zookeeper。行键可以是任意字符串,长度为64KB,实际应用中长度一般为10-100bytes,存储为字节数组。行键排序存储,设计时应考虑经常一起读取的行应放在一起。存储时数据按字典顺序排序,读写操作是原子的。列族是表的...

HBase scan命令详解
查询方式通过rowKey进行查询是最快的,因此rowkey的设计一定要合理,否则会影响查询速度。但有时确实无法完全通过rowkey进行查询,这时就需要借助scan命令。scan命令支持的修饰词除了列(COLUMNS)修饰词外,HBase还支持Limit(限制查询结果行数)、STARTROW(ROWKEY起始行)、STOPROW(结束行)、TIMERANGE(限定...

相似回答