【从HBase 应用程序设计与开发的角度,总结几种常用的性能优化方法,此为第一篇HBase性能优化之表的设计,欢迎读者朋友们阅读、转发和收藏!】
1. 表的设计
1.1 Pre-Creating Regions
默认情况下,在创建 HBase 表的时候会自动创建一个 region 分区,当导入数据的时候,所有的 HBase 客户端都向这一个 region 写数据,直到这个 region 足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的 regions ,这样当数据写入 HBase 时,会按照 region 分区情况,在集群内做数据的负载均衡。
1.2 Row Key
HBase 中 row key 用来检索表中的记录,支持以下三种方式:
通过单个 row key 访问:即按照某个 row key 键值进行 get 操作;
通过 row key 的 range 进行 scan :即通过设置 startRowKey 和 endRowKey ,在这个范围内进行扫描;
全表扫描:即直接扫描整张表中所有行记录。
在 HBase 中, row key 可以是任意字符串,最大长度 64KB ,实际应用中一般为 10~100bytes ,存为 byte[] 字节数组,一般设计成定长的。
row key 是按照字典序存储,因此,设计 row key 时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。
举个例子:如果最近写入 HBase 表中的数据是最可能被访问的,可以考虑将时间戳作为 row key 的一部分,由于是字典序排序,所以可以使用 Long.MAX_VALUE – timestamp 作为 row key ,这样能保证新写入的数据在读取时可以被快速命中。
1.3 Column Family
不要在一张表里定义太多的 column family 。目前 Hbase 并不能很好的处理超过 2~3 个 column family 的表。因为某个 column family 在 flush 的时候,它邻近的 column family 也会因关联效应被触发 flush ,最终导致系统产生更多的 I/O 。
1.4 In Memory
创建表的时候,可以通过
HColumnDescriptor.setInMemory(true) 将表放到 RegionServer 的缓存中,保证在读取的时候被 cache 命中。
1.5 Max Version
创建表的时候,可以通过
HColumnDescriptor.setMaxVersions(int maxVersions) 设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置 setMaxVersions(1) 。
1.6 Time To Live
创建表的时候,可以通过
HColumnDescriptor.setTimeToLive(int timeToLive) 设置表中数据的存储生命期,过期数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置 setTimeToLive(2 * 24 * 60 * 60) 。
1.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 的发生。
我知道你在看哟
领取专属 10元无门槛券
私享最新 技术干货