1-预分区
- 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。
- 具体方法Hbase--基础知识点总结(扫盲篇)中预分区操作
2-RowKey设计
- 参考连接 Hbase--RowKey设计原则
3-列族数
- 不要在一张表里定义太多的 column family。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候,它邻近的column family也会因关联效应被触发flush,最终导致系统产生更多的I/O。
- 具体参考连接 Hbase--为什么不建议在Hbase中使用过多列族
4-In Memory
- 创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放到RegionServer的缓存中,保证在读取表的时候被cache命中;
5-Max Version
- 创建表的时候,可以通过HColumnDesriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本数,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1);
6-Time To Live
- 创建表的时候,可以通过HColumnDescriptor.setTimeToLive(int timeToLive)设置表中的数据的存储生命期,过期的数据自动被删除,例如如果只需要存储最近两天的数据,那么可以设置setTimeToLive(22460*60);
7-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的发生。
参考链接:https://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section1.html