开发者学堂课程【HBase 入门教程:HBase 优化_2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/397/detail/5094
HBase 优化_2
内容介绍
一、表的设计
二、写表操作
一、表的设计
1. Column Family
不要在一张表里定义太多的 column family。目前 Hbase 并不能很好的处理超过2~3个 column family 的表。因为某个 column family 在 flush 的时候,它邻近的 column family 也会因关联效应被触发 flush ,最终导致系统产生更多的 I/O。感兴趣的同学可以对自己的 HBase 集群进行实际测试,从得到的测试结果数据验证一下。
2. In Memory
创建表的时候,可以通过 HColumnDescriptor.setInMemory(true)将表放到 RegionServer 的缓存中,保证在读取的时候被 cache 命中。
3. Max Version
创建的时候,可以通过 HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置 setMaxVersions(1) 。
4.Time To Live
创建表的时候,可以通过 HColumnDescriptor.setTimeToLive(int timeToLive) 设置表中数据的存储生命期,过期数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置 setTimeToLive(2 * 24 * 60 * 60)。
5. Compact & Split
在 HBase 中,数据在更新时首先写入 WAL 日志(HLog)和内存(MemStore)中,MemStore 中的数据是排序的,当 MemStore 累计到一定阈值时,就会创建一个新的 MemStore,并且将老的 MemStore 添加到 flush 队列,由单独的线程 flush 到磁盘上,成为一个 StoreFile 。于此同时, 系统会在 zookeeper 中记录一个 redo point ,表示这个时刻之前的变更已经持久化了(minor compact)。
StoreFile 是只读的,一旦创建后就不可以再修改。因此 Hbase 的更新其实是不断追加的操作。当一个 Store 中的 StoreFile 达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的 StoreFile ,当 StoreFile 的大小达到一定阈值后,又会对 StoreFile 进行分割(split),等分为两个 StoreFile。
由于对表的更新是不断追加的,处理读请求时,需要访问 Store 中全部的 StoreFile 和 MemStore ,将它们按照 row key 进行合并,由于 StoreFile 和 MemStore 都是经过排序的,并且 StoreFile 带有内存中索引,通常合并过程还是比较快的。
实际应用中,可以考虑必要时手动进行 major compact ,将同一个 row key 的修改进行合并形成一个大的 StoreFile 。同时,可以将 StoreFile 设置大些,减少 split 的发生。
hbase 为了防止小文件(被刷到磁盘的 menstore)过多,以保证保证查询效率,hbase 需要在必要的时候将这些小的store file 合并成相对较大的 store file,这个过程就称之为 compaction。在 hbase 中,主要存在两种类型的compaction ; minor compaction 和major compaction。
minor compaction:的是较小、很少文件的合并。
major compaction 的功能是将所有的 store file 合并成-一个, 触发 major compaction 的可能条件有: major compact 命令、majorCompact() API、region server 自动运行(相关参数心 hbase.hreaion.majoucompaction 默认为24小时、hbase.hregion.majorcompaction.ietter 默认值为0.2防止 region server 在同一时间进行 major compaction)。
hbase.hregion.majorcompaction.ietter 参数的作用是:对参数 hbase.hregion.majou.compaction 规定的值起到浮动的作用,假如两个参数都为默认值24和0,2,那么 major compact 最络使用的数值为: 19.2~28.8 这个范围。
关闭自动 major compactione
手动编程 major compactione
Timer 类,contabe
minor compaction 的运行机制要复杂-些,它由一下几个参数共同决定:。
hbase.bstore.compaction.min :默认值为3,表示至少需要三个满足条件的 store file 时, minor compaction才会启动。
hbase.hstore.compaction.max 默认值为10,表示-次 minor compaction 中最多选取10个 store filev
hbase.hstore.compaction.min.size 表示文件大小小于该值的 store file - -定会加入到 minor compaction 的 store file 中。
hbase.hstore.compaction.max.size 表示文件大小大于该值的 store file-定会被 minor compaction 排除+
hbase.hstore.compaction.ratio 将 store file 按照文件年龄排序(older to younger),minor compaction 总是从older store file 开始选择。
二、写表操作
1. 多 HTable 并发写
创建多个 HTable 客户端用于写操作,提高写数据的吞吐量,一个例子:
static final Configuration conf =HBaseConfiguration.create();
static final String table_log_name = “user_log”;
wTableLog = new HTable[tableN];
for (int i = 0; i < tableN; i++) {
wTableLog[i] = new HTable(conf, table_log_name);
wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); //5MB
wTableLog[i].setAutoFlush(false);
}