1.简述hbase读写流程
1.1 读流程
- 客户端与zk进行连接;从zk找到meta表的region的位置,即meta表的数据存储在某个HReginServer上;客户端与这个HRegionServer建立连接,然后读取meta表中的数据;
- 根据要查询的namespace、表名、rowkey信息。找到对应的的region信息
- 找到相应的HRegionServer
- 找到对应的region
- 先从memstore里面查找数据,如果没有再到BlockCache上读取
- 如果BlockCache上也没有找到再到StoreFile上仅从读取
- 从StoreFile中读取数据到数据后,先写入到BlockCache中然后再返回给客户端
1.2 写流程
- client与zk建立链接,从zookeeper中找到meta表中region的位置,然后读取meta表中的数据
- meta表中存储了用户表的region信息,根据要查询的namespace、表名、rowkey信息。找到写入数据对应的的region信息
- 找到对应的HRegionServer然后发送写请求
- 把数据写入到HLog和memstore中
- memstore中的数据到达阀值后会把数据刷写到磁盘,生成一个storeFile,即一个HFile
- 当达到一定条件后,会把小的HFile合并成大的HFile,避免hdfs有大量的小文件
1.3 文件合并的逻辑
- hbase中有两种类型的合并
- minor compaction 小合并
- major compaction 大合并
1.3.1 minor compaction 小合并
-
多个StoreFile合并成一个更大的StoreFile
这个过程是将多个小的、相近的StoreFile合并成一个更大的StoreFile,对于超过TTL(Time To Live)的数据、更新的数据和删除的数据仅仅做个了标记(即新增了一个带有标记的版本号),并没有进行物理删除,一次minor compaction的结果会得到更少、更大的StoreFile。这种合并的触发频率很高
-
minor compaction触发的条件
<!--表示至少需要三个满足条件的store file时,minor compaction才会启动--> <property> <name>hbase.hstore.compactionThreshold</name> <value>3</value> </property> <!--表示一次minor compaction中最多选取10个store file--> <property> <name>hbase.hstore.compaction.max</name> <value>10</value> </property> <!--默认值为128m, 表示文件大小小于该值的store file 一定会加入到minor compaction的store file中 --> <property> <name>hbase.hstore.compaction.min.size</name> <value>134217728</value> </property> <!--默认值为LONG.MAX_VALUE,表示文件大小大于该值的store file 会被minor compaction排除--> <property> <name>hbase.hstore.compaction.max.size</name> <value>9223372036854775807</value> </property>
1.3.2 major compaction 大合并
-
讲一个Store中的所有StoreFile合并成一个HFile
这个过程会把已经删除的、TTL过期的数据,版本号超过设定版本号的数据(版本太多的老数据)。这种合并频率比较低,默认是7天执行一次,并且性能消耗很大,一般都是手动控制合并,防止自动合并出现在业务高峰期
-
major compactiom的触发条件
<!--默认值为7天进行一次大合并,--> <property> <name>hbase.hregion.majorcompaction</name> <value>604800000</value> </property>
-
手动触发
##使用major_compact命令 major_compact tableName