Hbase优化

本文对hbase集群进行优化,主要涵盖硬件和操作系统,网络通信,JVM,查询,写入,核心服务,配置参数,zookeeper,表设计等多方面。

我们对hbase的应用主要是用户画像,根据自身使用场景做一些优化。难免有片面之处。

一、软硬件优化:

1. 配置内存,cpu

HBase的LSM树结构,缓存机制和日志机制对内存消耗非常大,所以内存越大越好。

其中过滤器,数据压缩,多条件组合扫描等场景都是cpu密集型的,所以cpu也要够强悍

2. 操作系统

选择主流linux发行版,JVM推荐用Sun HotSpot64位的,能发挥hadoop最好的性能

使用noatime挂载磁盘:一般数据库的挂载磁盘没有特殊要求情况下最好都设置位为noatime以提高性能

关闭系统交换区: Linux内存反复交换会影响JVM性能,典型的异常就是导致zookeeper超时。所以设置vm.swappiness设置的比较低较好。

3. 网络通信

由于hdfs对集群网络吞吐有很高的要求,所以网络必须保证低延迟高吞吐

添加机架感知:机架感知是提升hadoop的写入和读取本地化。在core-site.xml中配置topology.script.file.name

4. JVM优化

根据网络上很多成熟引用验证比较优秀的垃圾回收器搭配组合CMS+ParNew

二、进入主题:Hbase本身优化

1. Hbase查询优化:

a. 设置scan缓存:scan的时候setCaching来设置缓存大小

b. 确定所需要的列:scan时候addColumn来添加所需要的列减少数据的传输

c. 如果批量进行全表扫描请禁用块缓存,因为全表扫描每条记录只读取一遍

d. 优化行键查询:全表scan时,如果只需要行键,可以使用过滤器来减少服务器返回的数据量。

e. 通过HBaseTool访问:HTable对象对于客户端读写数据来说不是线程安全的,多线程时要为每个线程创建一个HBase对象。而HBaseTool链接线程池机制可以解决线程安全问题,同事维持一定数量的HBase

f. 使用批量读:HTable.get(List<Get>)

g. 使用Coprocessor统计行数: 具体原理请看协处理器原理

h. 缓存查询结果:对于查询频繁的应用场景

2. HBase写入优化:

a. 关闭WAL日志:如果能容忍一定的数据丢失风险,则可以关闭WAL

b. 设置AutoFlush: 关闭此功能等put到达到缓存阀值时候才提交到服务器

c. 预创建Region: 预先创建region来避免写入时region到达一定阀值而split影响性能,和mongodb预分片原理一致

d. 延迟WAL flush:如果开启WAL则可以将WAL flush到磁盘的时间间隔调大一些来提高性能

e. 使用批量写HTable.put(List<Put>)

3. HBase基本核心服务优化

a. 优化分裂操作: 如果写多读少的场景则可以调高hbase.hregion.max.filesize来减少region分裂

b. 优化合并操作:大合并非常消耗资源,且合并时候会阻塞写操作。应该在集群不繁忙的时候进行大合并

4. Hbase配置参数优化:

a. 设置regionserver handler数量:如果写请求比较多则可以适当调高hbase.regionserver.handler.count的数量以提高写吞吐。此参数调高很消耗内存,请注意。

b. 调整blockCache大小:hfile.block.cache.size来设置regionserver查询的内存设置。默认0.25指读缓存占用堆内存25%。读场景比较多可以适当调高。

c. 设置MemStore的上下限:hbase.regionserver.global.memstore.upperLimit表示regionserver上所有region的Memstore的大小上限,超过上限会引发全局flush,这个参数主要防止regionserver内存占用过大被OOM Kill掉。

读为主的集群中,可以调小此参数,调高blockCache; 写则相反

d. 调整影响合并的文件数:hbase.hstore.blockingStoreFiles值用于控制超过此值的storefile则会出发合并。可以调大此值减少合并次数

e. 调整MemStore的flush因子:当Memstore占用内存大小超过hbase.hregion.memstore.flush.size倍数时将阻塞region所有请求,出发flush,释放内存。如果正常不会出现写入或写入数据量突然增大则可以保持默认,否则要调高此值。

f. 调整单个文件大小:hbase.hregion.max.filesize用于定义单个hstorefile大小,超过此值则引发region文件split。 Region比较小则合并和split都很快,当然会造成集群响应时间波动。 大合并和split则造成较长时间阻塞。应该根据自己场景来定义

5. 分布式协调系统zookeeper的优化:zookeeper的优化方法也很多,我就主要讲hbase优化。只是说明下zookeeper优化也非常重要。

6. 表设计优化

a. 开启布隆过滤器:布隆过滤器可以减少读盘次数以降低延迟。原理和redis的hyperloglog一样(我们以前有用此功能对用户数量进行估算)

b. 调整列族块大小:较小的块大小可以提高随机读的速度,同时导致块索引变大。

c. 设置in memory属性:对于经常访问的列族可以设置in memory,但是要考虑消耗内存的问题

d. 调整列族最大版本数量:数量大占用磁盘空间,且导致集群变大。根据自己应用场景来选择。像我们做画像由于要统计用户场景变化,所以版本数量有根据自己需求设置

e. 设置TTL属性:超过TTL的列将自动删除。这个也根据自己场景选择。我们做用户画像时会将某些用户行为超过时间的就认为没有必要在进行存储分析了,所以可以设置TTL来自动删除

7. 关闭mapreduce的预测执行功能:若使用mapreduce来访问hbase集群应该关闭,否则有可能导致hbase客户端链接数陡增影响集群运行

8. 修改负载均衡执行周期:当集群写入频繁时,可以调小,否则可以调大。

原文发布于微信公众号 - 奇点(qddata)

原文发表时间:2016-03-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux、Python学习

IBM技术专家教你“懒惰”Linux管理员的10个关键技巧

好的系统管理员区分在效率上。如果一位高效的系统管理员能在 10 分钟内完成一件他人需要 2 个小时才能完成的任务,那么他应该受到奖励(得到更多报酬),因为他为公...

11400
来自专栏北京马哥教育

IBM技术专家教你“懒惰”Linux管理员的10个关键技巧

作者:Vallard Benincosa, 来源: https://www.ibm.com/developerworks/cn/linux/l-10sysadt...

31450
来自专栏编程直播室

折腾git pages+hexo+NexT初识hexo开始本地试运行准备服务器准备上传工具先告一段落发表文章主题

24460
来自专栏SDNLAB

从NETCONF/YANG看网络配置自动化

1 引子 NETCONF和YANG的目的是以可编程的方式实现网络配置的自动化,从而简化和加快网络设备和服务的部署,为网络运营商和企业用户节约成本。NETCONF...

53950
来自专栏jouypub

十分钟检查Linux服务器性能

你是否遇到过:服务器负载飙升;服务被已经挂起,接口长时间没响应;服务刚重启,过一会又无法访问等等。这时下面这几条命令就可以尽快的帮你快速定位问题,找出问题的根源

42310
来自专栏月色的自留地

在Mac上使用远程X11应用

95460
来自专栏吴伟祥

web服务器集群(多台web服务器)后session如何同步和共享

在访问量上去以后,很多人会采用web集群的方式在满足逐渐增长的用户量。这时候就不得不面对一个问题,那就是在多个服务器下,每次请求都会因为负载均衡而分配到不同的服...

28830
来自专栏微服务生态

由多线程内存溢出产生的实战分析

一日凌晨,手机疯狂报警,短信以摧枯拉朽之势瞬间以百条的速度到达,我在睡梦中被惊醒,看到短信的部分内容如下:

16460
来自专栏北京马哥教育

让“懒惰” Linux 运维工程师事半功倍的 10 个关键技巧!

好的Linux运维工程师区分在效率上。如果一位高效的Linux运维工程师能在 10 分钟内完成一件他人需要 2 个小时才能完成的任务,那么他应该受到奖励(得到更...

42160
来自专栏游戏杂谈

liunx下查看服务器硬件信息

今天安装了9台Linux服务器,型号完全不一样(有DELL、HP和IBM服务器),又懒得去对清单,如何在Linux下cpu的个数和核数呢?另外,nginx的cp...

1.1K20

扫码关注云+社区

领取腾讯云代金券