设为首页 加入收藏

TOP

HBase数据库检索性能优化策略(四)
2015-11-21 01:37:10 来源: 作者: 【 】 浏览:1
Tags:HBase 数据库 检索 性能 优化 策略
-Xmx16000m $HBASE_REGIONSERVER_OPTS”

其中 16000m 为分配给 RegionServer 的内存大小。

写数据的备份数

备份数与读性能成正比,与写性能成反比,且备份数影响高可用性。有两种配置方式,一种是将 hdfs-site.xml 拷贝到 hbase 的 conf 目录下,然后在其中添加或修改配置项 dfs.replication 的值为要设置的备份数,这种修改对所有的 HBase 用户表都生效,另外一种方式,是改写 HBase 代码,让 HBase 支持针对列族设置备份数,在创建表时,设置列族备份数,默认为 3,此种备份数只对设置的列族生效。

WAL(预写日志)

可设置开关,表示 HBase 在写数据前用不用先写日志,默认是打开,关掉会提高性能,但是如果系统出现故障 (负责插入的 RegionServer 挂掉),数据可能会丢失。配置 WAL 在调用 Java API 写入时,设置 Put 实例的 WAL,调用 Put.setWriteToWAL(boolean)。

批量写

HBase 的 Put 支持单条插入,也支持批量插入,一般来说批量写更快,节省来回的网络开销。在客户端调用 Java API 时,先将批量的 Put 放入一个 Put 列表,然后调用 HTable 的 Put(Put 列表) 函数来批量写。

客户端一次从服务器拉取的数量

通过配置一次拉去的较大的数据量可以减少客户端获取数据的时间,但是它会占用客户端内存。有三个地方可进行配置:

在 HBase 的 conf 配置文件中进行配置 hbase.client.scanner.caching;
通过调用 HTable.setScannerCaching(int scannerCaching) 进行配置;
通过调用 Scan.setCaching(int caching) 进行配置。三者的优先级越来越高。

RegionServer 的请求处理 IO 线程数

较少的 IO 线程适用于处理单次请求内存消耗较高的 Big Put 场景 (大容量单次 Put 或设置了较大 cache 的 Scan,均属于 Big Put) 或 ReigonServer 的内存比较紧张的场景。

较多的 IO 线程,适用于单次请求内存消耗低,TPS 要求 (每秒事务处理量 (TransactionPerSecond)) 非常高的场景。设置该值的时候,以监控内存为主要参考。

在 hbase-site.xml 配置文件中配置项为 hbase.regionserver.handler.count。

Region 大小设置

配置项为 hbase.hregion.max.filesize,所属配置文件为 hbase-site.xml.,默认大小 256M。

在当前 ReigonServer 上单个 Reigon 的最大存储空间,单个 Region 超过该值时,这个 Region 会被自动 split 成更小的 Region。小 Region 对 split 和 compaction 友好,因为拆分 Region 或 compact 小 Region 里的 StoreFile 速度很快,内存占用低。缺点是 split 和 compaction 会很频繁,特别是数量较多的小 Region 不停地 split, compaction,会导致集群响应时间波动很大,Region 数量太多不仅给管理上带来麻烦,甚至会引发一些 Hbase 的 bug。一般 512M 以下的都算小 Region。大 Region 则不太适合经常 split 和 compaction,因为做一次 compact 和 split 会产生较长时间的停顿,对应用的读写性能冲击非常大。

此外,大 Region 意味着较大的 StoreFile,compaction 时对内存也是一个挑战。如果你的应用场景中,某个时间点的访问量较低,那么在此时做 compact 和 split,既能顺利完成 split 和 compaction,又能保证绝大多数时间平稳的读写性能。compaction 是无法避免的,split 可以从自动调整为手动。只要通过将这个参数值调大到某个很难达到的值,比如 100G,就可以间接禁用自动 split(RegionServer 不会对未到达 100G 的 Region 做 split)。再配合 RegionSplitter 这个工具,在需要 split 时,手动 split。手动 split 在灵活性和稳定性上比起自动 split 要高很多,而且管理成本增加不多,比较推荐 online 实时系统使用。内存方面,小 Region 在设置 memstore 的大小值上比较灵活,大 Region 则过大过小都不行,过大会导致 flush 时 app 的 IO wait 增高,过小则因 StoreFile 过多影响读性能。

HBase 配置

建议 HBase 的服务器内存至少 32G,表 1 是通过实践检验得到的分配给各角色的内存建议值。

模块 服务种类 内存需求
HDFS HDFS NameNode 16GB
HDFS DataNode 2GB
HBase HMaster 2GB
HRegionServer 16GB
ZooKeeper ZooKeeper 4GB
表 1. HBase 相关服务配置信息

HBase 的单个 Region 大小建议设置大一些,推荐 2G,RegionServer 处理少量的大 Region 比大量的小 Region 更快。对于不重要的数据,在创建表时将其放在单独的列族内,并且设置其列族备份数为 2(默认是这样既保证了双备份,又可以节约空间,提高写性能,代价是高可用性比备份数为 3 的稍差,且读性能不如默认备份数的时候。

实际案例

项目要求可以删除存储在 HBase 数据表中的数据,数据在 HBase 中的 Rowkey 由任务 ID(数据由任务产生) 加上 16 位随机数组成,任务信息由单独一张表维护。图 2 所示是数据删除流程图。

\

图 2. 数据删除流程图

最初的设计是在删除任务的同时按照任务 ID 删除该任务存储在 HBase 中的相应数据。但是 HBase 数据较多时会导致删除耗时较长,同时由于磁盘 I/O 较高,会导致数据读取、写入超时。

查看 HBase 日志发现删除数据时,HBase 在做 Major Compaction 操作。Major Compaction 操作的目的是合并文件,并清除删除、过期、多余版本的数据。Major Compaction 时 HBase 将合并 Region 中 StoreFile,该动作如果持续长时间会导致整个 Region 都不可读,最终导致所有基于这些 Region 的查询超时。

如果想要解决 Major Compaction 问题,需要查看它的源代码。通过查看 HBase 源码发现 RegionServer 在启动时候,有个 CompactionChecker 线程在定期检测是否需要做 Compact。源代码如图 3 所示。

\

图 3. CompactionChecker 线程代码图

isMajorCompaction 中会根据 hbase.hregion.majorcompaction 参数来判断是否做 Major Compact。如果 hbase.hregion.majorcompaction 为 0,则返回 false。修改配置文件 hbase.hregion.majorcompaction 为 0,禁止 HBase 的定期 Major Compaction 机制,通过自定义的定时机制 (在凌晨 HBase 业务不繁忙时) 执行 Major 操作,这个定时可以是通过 Linux cron 定时启动脚本,

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Excel读取数据库表 下一篇BIEE11GRpd合并

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: