首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HBase性能优化之表的设计

【从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 的发生。

我知道你在看

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200611A0HFOL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券