EMR之HBASE集群参数调优与压测

0. 概述

HBase 是Hadoop生态里重要一员。对HBase的调优,对节约成本,提升用户体验有重要意义。

然而,对一个复杂系统而言,参数调整是否有效,是否符合预期,需要时间来验证,这个过程可能漫长。为了快速验证参数调整是否符合预期,我们可以通过压测集群的方法,模拟上层业务对集群的访问,从而加快验证参数调整是否符合预期。

因此,本文首先给出HBase参数调优原则,接着给出压测方法,检验参数调优是否合理。

1. HBase 参数调优

在EMR实例中的HBase集群默认参数,并没有调为最优。我们强烈推荐用户在使用前,根据自己使用场景,调整参数。

1.0 基础优化

  • 1) 确保负载均衡,主要有如下手段:
  • a) 创建表时候预先分配Region,使得Region均匀分布在不同的RegionServer上。
  • b) 合理设计RowKey, 避免数据倾斜。
  • c) 适当重新调整分裂热点Region, 将子Region调整到不同数据节点上,保持集群负载均衡。
  • 2) 数据压缩:数据压缩是一种节约存储空间可行方案,我们推荐使用Snappy 数据压缩算法;
  • 3) 评估集群负载,适时扩容集群;

1.1 客户端优化

客户端优化通常考虑如下方面:

  • 1) 批量读写,节约网络带宽,提高吞吐量;
  • 2) 增大Scan缓存,使得一次RPC返回更多数据量,道理同1)。
  • 3) 避免全表扫描,这是非常耗时的动作;
  • 4) 离线任务,关闭BlockCache, 节约内存;

1.2 服务端写操作优化

HBase是基于LSM-Tree模型实现的。在Server端处理写请求路径上,依次需要写WAL日志、写MemTable。 除了基础优化步骤外,还可以从如下方面着手:

  • 1) 调整WAL:写WAL日志,涉及IO操作,关闭WAL日志,将提升集群写性能;
  • 2) 增大MemTable内存: 增大MemTable的内存,避免频繁刷盘阻塞写操作。

1.3 服务端读操作优化

在HBase集群Server端处理读请求的路径上,BlockCache 内存容量、HFile文件数量对读请有影响。除了基本的优化操作外,还可以从如下方面着手:

  • 1) 集群请求低峰期,执行Majar Compaction,降低HFile数量,消除脏数据;
  • 2) 增大BlockCache 内存,增大热点数据命中率,避免不必要的IO操作;

1.4 服务端读写分离优化

在HBase设计中,提供了读写分离的机制。所谓读写分离,即读写请求分别有不同线程池处理,从而避免相互影响。这样将资源合理分配给不同类型操作,从而满足复杂的业务需求。

具体而言,HBase 提供了Read\Write\Scan三种类型的操作,这三种类型操作可以委托给不同类型的线程池,通过参数来控制每个线程池中线程数量,从而起到分配资源的目的。参数说明如下:

  • 1) hbase.ipc.server.callqueue.handler.factor: 设置为1,HBase将Read\Write\Scan分别由单独线程池处理;
  • 2) hbase.ipc.server.callqueue.read.ratio: 取值介于0与1直接。表示Read\Scan操作占用线程数量与Write操作线程数量比值;
  • 3) hbase.ipc.server.callqueue.scan.ratio: 表示在Read\Scan操作占用线程数量比值;

例如,hbase.ipc.server.callqueue.handler.factor = 1 hbase.ipc.server.callqueue.read.ratio = 0.6 hbase.ipc.server.callqueue.scan.ratio = 0.5配置下,表示有60%的线程处理Read\Scan操作(其中30%处理Read操作,30%处理Scan操作),40%线程处理Write操作。

1.5 服务端GC优化

HBase 进程运行在JVM中,JVM 内存回收机制对Java进程有着重要影响。由于GC优化和具体业务场景息息相关,并没有一种“合理的”参数,满足一切使用场景。在这里,推荐一些基本的参数

  • -XX:+UseG1GC: 使用G1GC垃圾回收器,适合服务端大内存java进程;
  • -Xms,-Xmx: 为Hbase进程分配合理的内存量。注意要为系统、其他进程预留一定物理内存;
  • -XX:MaxDirectMemorySize:启用堆外内存。
  • -XX:G1HeapRegionSize=32m: 默认值1m, 推荐32m

2. 压测准备工作

在正式压测HBase集群前,需要完成一些准备工作,包括压测节点,压测集群,压测工具。

YCSB(Yahoo! Cloud Serving Benchmark)是雅虎开源的用于测试新式数据库(主要为 NoSQL)性能的框架。

2.0 准备压测节点

所谓压测节点,就是运行压测工具,向HBase集群发起请求的节点。通常,根据HBase集群规模,选择适当的压测节点数量。强烈建议,不要在部署有HBase 集群进程的节点充当压测节点,因为压测节点本身将占用部分资源,影响最终压测结果。

2.1 准备压测HBase集群

根据您业务需求,购买合适规格的EMR实例,并选择HBase组件。我们推荐使用高IO机型,配本地磁盘。

2.2 压测工具

  • 1) YCSB官网下载可执行程序包,选择0.13.0版本;
  • 2) 解压可执行程序包,假设解压后目录名称为ycsb-0.13.0
  • 3) 复制腾讯云EMR实例中的HBase集群配置到ycsb-0.13.0/hbase12-binding。EMR实例的HBase集群配置在master节点的/usr/local/server/hbase/conf

3. 压测与结果分析

压测过程重要分两步,加载数据阶段,和压测阶段。

3.0 创建数据表

首先,要创建数据表,需要预先分配region到每一个RegionServer节点上。具体执行如下命令:

create 't', 'c', {SPLITS => (1..n_splits).map {|i| "user#{1000+i*(9999-1000)/n_splits}"}} ```


### 3.1 加载数据

在ycsb工作目录运行命令加载数据到HBase集群。进入ycsb工作目录,执行如下命令:


```bin/ycsb load hbase12 -P workloads/workloada  -threads 32 -p table=t -p columnfamily=c -s```

3.2 选择Workload

YCSB提供了6中不同类型的Workload. 这些Workload通过参数化不同请求类型,以及读写比,模拟HBase 常见的使用场景。例如,有读写比为1:1的Workload, 有只读不写的Workload, 有read-update-wrie 的Workload等。

可以更加自己需求,调整workload文件中参数取值。

3.3 配置其他参数

YCSB提供了丰富的参数配置接口。诸如压测节点工作线程数量,是否在控制台打印压测日志等。

3.4 执行压测

执行压测命令和加载数据命令很相似:

bin/ycsb run hbase12 -P workloads/workloada -threads 32 -p table=t -p columnfamily=c -s3.5 分析结果在压测任务结束后,ycsb工具会输出如下数据:

OVERALL, RunTime(ms), 2097940

OVERALL, Throughput(ops/sec), 4766.580550444722

TOTAL_GCS_PS_Scavenge, Count, 3108

TOTAL_GC_TIME_PS_Scavenge, Time(ms), 9733

TOTALGC_TIME%_PS_Scavenge, Time(%), 0.4639312849747848

TOTAL_GCS_PS_MarkSweep, Count, 0

TOTAL_GC_TIME_PS_MarkSweep, Time(ms), 0

TOTALGC_TIME%_PS_MarkSweep, Time(%), 0.0

TOTAL_GCs, Count, 3108

TOTAL_GC_TIME, Time(ms), 9733

TOTALGC_TIME%, Time(%), 0.4639312849747848

READ, Operations, 4466688

READ, AverageLatency(us), 6131.758938614024

READ, MinLatency(us), 137

READ, MaxLatency(us), 781823

READ, 95thPercentileLatency(us), 8695

READ, 99thPercentileLatency(us), 18527

READ, Return=OK, 4466688

READ, Return=NOT_FOUND, 534718

CLEANUP, Operations, 64

CLEANUP, AverageLatency(us), 552.96875

CLEANUP, MinLatency(us), 3

CLEANUP, MaxLatency(us), 34687

CLEANUP, 95thPercentileLatency(us), 17

CLEANUP, 99thPercentileLatency(us), 187

READ-FAILED, Operations, 534718

READ-FAILED, AverageLatency(us), 5304.548231030188

READ-FAILED, MinLatency(us), 233

READ-FAILED, MaxLatency(us), 767999

READ-FAILED, 95thPercentileLatency(us), 7539

READ-FAILED, 99thPercentileLatency(us), 16247

UPDATE, Operations, 4998594

UPDATE, AverageLatency(us), 7364.818844259005

UPDATE, MinLatency(us), 660

UPDATE, MaxLatency(us), 799231

UPDATE, 95thPercentileLatency(us), 10583

UPDATE, 99thPercentileLatency(us), 26927

UPDATE, Return=OK, 4998594

通过输出信息,可以看到此次压测情况。

参考文献

1(https://cloud.tencent.com/developer/article/1005560)

2(https://hbase.apache.org/book.html)

3(https://github.com/brianfrankcooper/YCSB/wiki)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MySQL实战分享

【数据库评测报告】第三期:innodb、tokudb压缩性能

这一期的数据库测评报告让咱们一起来讨论下数据压缩这一话题。

48360
来自专栏信安之路

一道 CTF 题 get 到的新姿势

本文是从一个 CTF 题目中学到的一个新姿势,下面对我的学习做一个记录总结,给大家分享一下,希望大家多多参与一起分享学习。

11600
来自专栏Petrichor的专栏

git:git commit 书写格式

  正如 git add 的作用是将文件放入暂存区, git commit 的作用是将修改提交到分支上。

47720
来自专栏码洞

短小精悍之 Redis 命令行工具有趣的罕见用法

我们天天都在使用 Redis 内置的命令行工具 redis-cli,久而久之以为它就是一个简单的交互式 Redis 数据结构手工操作程序,但是它背后强大的功能绝...

12710
来自专栏Jaycekon

Python-WXPY实现微信监控报警

概述:   本文主要分享一下博主在学习wxpy 的过程中开发的一个小程序。博主在最近有一个监控报警的需求需要完成,然后刚好在学习wxpy 这个东西,因此很巧妙的...

2.7K80
来自专栏pangguoming

Java后端WebSocket的Tomcat实现

文章摘要随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与...

71360
来自专栏小灰灰

QuickTask动态脚本支持框架整体介绍篇

一个简单的动态脚本调度框架,支持运行时,实时增加,删除和修改动态脚本,可用于后端的进行接口验证、数据订正,执行定时任务或校验脚本

13520
来自专栏程序员叨叨叨

compileSdkVersion 'android-24' requires JDK 1.8 or later to compile

今天,好久没有写Android程序的我突发奇想,想简单写一个每日任务APP。好的!新建工程->写好代码框架->开启模拟器->运行!哎哎哎?!那啥!咋报错了嘞?!...

12840
来自专栏杨建荣的学习笔记

crontab设置导致的服务器进程异常问题 (r10笔记第4天)

前几天的时候,有个同事问我一个问题,大体的意思是突然收到报警,服务器的进程数翻了好几倍,其实那个服务器也没有任何操作。所以想让我帮忙看看。 他自己也做...

37260
来自专栏杨建荣的学习笔记

oracle的TAF浅析 (r6笔记第37天)

在使用rac的时候,有几个很闪亮的使用特性,一个就是load balance,这块毋庸置疑,确实做了很大的改进,从10g版本开始的多个vip地址的load b...

49550

扫码关注云+社区

领取腾讯云代金券