Hbase

一、Hbase架构

 

强制写一致(不是最终一致),写比读块,自动分片/合片。

一个RegionServer机器上有多个Region但只有一个HLog,所有Region都往这个HLog中写入数据操作,一个表对应一个或者多个Region(表按行切分为不同Region),每个Region根据列族划分为不同的Store文件。

一张表的Region经过切分和负载平衡后可能分布在不同的机器上

 

表是稀疏矩阵,很好的存储特征向量
hbase vs cassandra
hbase是主从结构,cassandra对等节点
 
rowKey:columnFamily:columnQualifier:timeStamp:value
行键:列族:列名:时间戳:值

1.Master作用

Table:create,delete,alter,list

RegionServer:分配regions到每个RegionServer,监控每个RegionServer状态

2.RegionServer作用

Data:get,put,delete

Region:splitRegion,compactRegion

3.HLog作用

预写入日志(WAL),每次操作执行之前都写入此文件

4.Region

表按行切分为不同的Region,一张表对应一个或者多个Region

5.Store

列族存储为文件夹,里面包含每次flush生成的列族文件

6.StoreFile

每次flush生成的列族文件

7.MemStore

内存中的列族文件

8.Zookeeper

处理客户端DML操作,存放meta表所在RegionServer地址(meta不走切分逻辑)

二、Hbse写数据流程

client->查询zookeeper寻找meta表所在RegionServer->访问meta表找到要写入数据的表所在RegionServer->访问数据表所在RegionServer->写入HLog和MemStore

三、Hbase读数据流程

client->查询zookeeper寻找meta表所在RegionServer->访问meta表找到要写入数据的表所在RegionServer->访问数据表所在RegionServer->从磁盘读取数据到块缓存->快缓存数据和MemStore进行Merge->返回指定时间戳数据

无论如何Hbase都会读取Region上的Hstore上的文件

四、flush流程

1.MemStore默认达到堆内存40%*0.95时候开始flush(非阻塞),当达到堆内存的40%会阻塞客户端进行flush操作

<!--一个regionServer的flush-->
<property>
<!--阻塞flush-->
<name>hbase.regionserver.global.memstore.size</name>
<value>0.4</value>
</property>
<property>
<!--非阻塞flush-->
<name>hbase.regionserver.global.memstore.size.lower.limit</name>
<value>0.95</value>
</property>
<property>
<!--region到达128M,单个regionflush-->
<name>hbase.regionserver.memstore.flush.size</name>
<value>134217728</value>
</property>

 

2.默认最后一次编辑后1小时会进行flush

<property>
<name>hbase.regionserver.optionalcacheflushinterval</name>
<value>3600000</value>
</property>

官方建议只使用一个列族,因为全局flush会将表所有region所有内存中的列族刷入磁盘,可能会生成大量小文件触发

五、compact流程

Compact分为 Minor Compact (局部合并)和 Major Compact (全局合并);Minor不会清理过期数据和删除数据而Major会。

<property>
   <!--生产环境设置为0关闭,通关手动进行Major-->
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
</property>
<property>
   <!--每个region的每个列族对应的memstoreflush为hfile时候默认超过3个文件就会进行compact-->
<name>hbase.hstore.compactionThreshold</name>
<value>3</value>
</property>

Minor Compact 超过指定HFile数后不会立刻compact,过一段时间后再进行。Minor Compact 过程先创建合并后的大文件再将各个文件写入,全部完成后再删除其余的三个文件。

Major Compact 会清理过期数据和删除数据。flush 只会删除在内存的数据,但是删除标记不会删除,等到 Major Compact 时会删除标记,因为内存中删除标记有可能针对Hfile中数据删除。

六、split过程

当某个HFile文件大小超过Min(RegionNum^2*"hbase.regionserver.memstore.flush.size","hbase.hregion.max.filesize")时split

split过程会产生数据倾斜

<property>
   <!--HFile最大大小-->
<name>hbase.hregion.max.filesize</name>
<value>10737418240</value>
</property>

七、操作

7.1 DDL

# 显示所有表
hbase> list
# 创建命名空间
hbase> create_namespace
# 建表,命名空间可以省略
hbase> create '[命名空间:]表名','列族'....
# 查看表信息
hbase> describe '表名'
# 修改表保存版本数量(版本是相同数据不同的时间戳)
hbase> alter '表名',{NAME=>'列族名',VERSIONS=>保存版本数量}
# 删除表(先停用再删除)
hbase> disble '表名'
hbase> drop '表名'
# 删除命名空间(先要将命名空间下的所有表删除)
hbase> drop_namespace '命名空间'

7.2 DML

# 添加数据
hbase> put '[namespace:]table','rowKey','columnFamily:columnName','value'
# 全表范围扫描查询数据(rowKey相同就是同一条数据)
hbase> scan
# 全表扫描所有版本数据
hbase> scan '表名',{RAW=>true,VERSION=显示的最多版本数}
# 限定条件查询数据
hbase> get '[namespace:]table','rowKey'[,'columnFamily:columnName']
# 删除数据值(在这之前的所有版本全部删除,并不会真实删除而是put一个DeleteColumn数据)
hbase> delete '[namespace:]table','rowKey','columnFamily:columnName'
# 删除整条数据
hbase> deleteall '[namespace:]table','rowKey'

hbase数据文件结构:表名为一个文件夹,下面存储一个Region文件夹,里面存放所有的列族文件夹,里面存储数据文件

删除操作是是Put一个DeleterColumn标记,将删除数据的时间戳之前的数据全部隐藏,当进行全局compact时候才会进行物理删除

原文地址:https://www.cnblogs.com/leon618/p/13783376.html