HBase 的那一点知识
Posted 架构师Java之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase 的那一点知识相关的知识,希望对你有一定的参考价值。
1、HBase的存储结构是什么?该结构有什么优势?
HBase是列式存储数据库,列式存储数据库的出现主要基于这样一种假设:对于特定的查询,而不是所有的值都是必须的(即:可以只查询特定的列)。
另外,列式存储结构由于是基于列存储的,而列的数据类型天生是相似的,更加有利于压缩。
2、什么是HBase的短网址,举个栗子?
HBase短网址,即Hush,Hush允许用户将长网址映射为短网址(short URL)。现在国内有很多短网址提供商,比如新浪短网址,我输入:
http://www.chenjt.info/wp-login.php?redirect_to=http%3A%2F%2Fwww.chenjt.info%2Fwp-admin%2Fthemes.php&reauth=1
这么长的一个URL,然后通过短网址映射为:http://t.cn/RJPIcs2
其实这个原理很简单,就是让第三方做一个简单的映射关系,从而将长网址转为短网址。
3、HBase中的列族与列的特点,它们的个数有什么限制吗?列值有数据类型和长度限制吗?
一行有若干列,若干列又构成一个列族(column family),这不仅有助于构建数据的语义边界,还有助于设置某些特性(比如压缩),或者指示它们存储在内存中。
一个列族的所有列存储在同一底层的存储文件里,这个存储文件叫做HFile。
列族的数量是有限制的:原因是,当前的实现中有少许的缺陷,使得列族的数量只限于几十或者更少。(注意:不要为一张表设置过多的列族,特别是当数据量大的列族和数据量小的列族混用)。
与列族的数量有限制相反,列的数量没有限制:一个列族里可以有数百万个列,列值也没有类型和长度的限定。
4、在HBase中如果某个列的之前存入了值,后面有些列没有存储值,数据会存储NULL值吗?还是没有占存储空间呢?
在某些固定模式的数据库中,如果没有值的地方必须存储NULL值,但是在HBase的存储架构中,可以干脆省略整个列,换句话说,空值是没有任何消耗的:它们不占用任何存储空间。
举个栗子:
Row Key |
TimeStamp |
Column “data:” |
Column “meta:” “minetype” “size” |
Column “counters:” “updates” |
|
“row1” |
t3 |
“{“name”:”lars”,”address”:…}” |
“2323” |
“1” |
|
t4 |
“{“name”:”lars”}” |
“2” |
|||
t5 |
“application/json” |
||||
t6 |
“{“name”:”lars,”address”:…}” |
“3” |
上面的这些值由于插入的次数不同,并且存储在多个版本中,但是仍然能够看作是所有列以及这些列的最新版本(即每一列的最大tn)的组合。
5、HBase读取数据的模式?
(Table,RowKey, Family, Column, Timestamp) -> Value
通常,我们没有去指定Timestamp这时候,默认是用最新的时间戳(如果版本号大于1,即存储了多个时间戳的数据)。
6、关于HBase中的HFile和region
HFile:一个列族的所有列存储在同一个底层的存储文件里,这个存储文件叫做HFile(默认是64KB,涉及到HBase架构)。
Region:HBase中的region等同于数据库分区中的范围划分(range partion),它们可以被分配到若干台物理服务器上以均摊负载,因此提供了较强的扩展性。一个表初始的时候只有一个region,当用户开始向表中插入数据(这里应该是针对一个列族的存储单元,当已使用的存储空间大小超过了大小限制,region将发生拆分),系统会检查这个region的大小,如果超过最大值(默认是256M:如果表的数据量非常大,可以将该值提高),会将region将发生拆分操作。
8、HBase中数据更新的流程
HBase中的预写日志(write-ahead log, WAL),即每次更新数据时,都会将数据记录在提交日志(commit log)中,然后才将这些数据写入内存中的memstore(默认大小是64M)中,一旦内存保存的写入数据的累计大小超过了一个给定的最大值,系统就会将这些数据移出内存作为HFile文件刷写到磁盘中。数据移出内存之后,系统会丢失对应的提交日志,只保留未持久化到磁盘中的提交日志。
9、HBase中数据的读取是从哪里读取的?
HBase中数据的读取是两部分数据合并的结果:(1)memstore中还没有写入磁盘的数据;(2)磁盘上的存储文件。
10、HBase中memstore中数据刷写磁盘的方式
随着memstore中的数据不断的刷写到磁盘中,会产生越来越多的HFile文件,在HBase中,会将多个文件合并成一个较大的文件,而合并有两种类型:
minor合并(minor compaction)和major合并(major compaction)。
minor合并:将多个小文件重写为数量较大的大文件,减少存储文件的数量。major合并:将一个region中一个列族的若干个HFile重写为一个新HFile,该合并能够扫描所有的键/值对,顺序重写全部数据,重写数据的过程中略过了删除标记的数据(如果没有合并前,进行删除数据,只是将该数据标记为删除,在客户端读取时,会略过,但是实际上未删除)。上述的major合并,对于那些超过版本号限制的数据以及生存时间到期的数据,在重写数据时就不再写入磁盘中。
11、什么是大数据
“数十亿行×数百万列×数千个版本=TB级或PB级的存储”
12、集群中时间同步的方法
方法:在集群中运行NTP或同等功能的应用来同步集群的功能。
13、Linux文件句柄是什么?在HBase中需要注意什么?
命令:ulimit -n 可以查看一个进程中允许打开的最大文件句柄数量(系统默认值是1024)
看完本文有收获?请转发分享给更多人
关注 架构师Java之路,提升Java 技能
以上是关于HBase 的那一点知识的主要内容,如果未能解决你的问题,请参考以下文章