HBase入库调优
本文章只针对“微型集群处理大数据”的场景。
场景描述:
硬件:5个节点,每个节点可用硬盘1块(700G、500G等)、8核cpu,实验室环境(有时候还要跑其他程序跟你抢占资源),16G内存。
软件:hadoop-0.20.2-cdh3u2,hbase-0.90.4-cdh3u2。
业务:sina微博12亿转发微博,700w用户信息。bzip压缩后共150G。要求就是将这些数据入库并且恢复关注和粉丝列表,建立userId与昵称映射,找出Message的转发关系等等。
上述业务实际上比描述的复杂,后续需要做各种分析,再次略去,只说明一下跟入库效率相关的影响因素:
1.批量导入数据,需要入库一定要均衡
2.恢复关注和粉丝列表,需要在入库时遍历其中的一个来恢复另一个(因为只给出了关注列表),也就是说入库一条用户信息可能会随之入库千百条信息。
分析:
1.入库均衡。首先要使rowkey均衡,原始数据只能顺序读取,若id连续则会产生hot region的问题,所以方案就是:rowkey=md5(id)+id。我并没有做简单的md5,而是用了另一种方式,详细可见文章:http://www.cnblogs.com/colorfulkoala/archive/2013/05/14/3077390.html
2.避免region split。入库是持续进行的,region入库过程region过大则会导致region的分裂,另外,集群的数量一定,预切分region可以保证初始rigion个数,这样我们就可以了解每个节点支持并发的能力了。所以我的做法是:设置region的hbase.hregion.max.filesize 为100g,基本可以保证region不再分裂,保证平均每个节点有1000region。
3.本地入库客户端。为了节约磁盘,客户端选择了直接读取压缩文件,读取原始数据完全不会成为入库的瓶颈。应该采用多点入库,然是事实上,带宽并不是瓶颈,所以从一个zk入库完全够用了。对于客户端采取多线程入库,建议最好打印读取记录的位置(可以每隔1000个打印一次),这样使入库程序支持断点。
4.hbase配置
开启lzo压缩
为确保并发支持hbase.regionserver.handler.count设置为100.
zookeeper.session.timeout 180000000
hbase.rpc.timeout 180000000 为了建表时不超时。
hfile.block.cache.size 0.1 可以设置小一些,因为入库主要是写操作。
hbase.regionserver.global.memstore.upperLimit 0.5
hbase.regionserver.global.memstore.lowerLimit 0.45 这两个参数要尽量大(upperLimit+block.cache<=0.6),因为写效率提升需要很大的内存,如果设置的过小,会造成内存中的memstore过快的flush到硬盘,从而短时间内产生很多的storefiles,超过阈值后会触发compaction,compaction的瓶颈在硬盘,如果硬盘不给力,compaction时间过长就是造成dn和rs的连接一直占用。一方面storfiles会逐渐增高(因为compact没完又flush进来很多的storefiles),一方面连接数越来越多,导致too many openfiles错误的发生。
hbase.zookeeper.property.maxClientCnxns 500 同一个ip与zk连接数限制
hbase.hregion.memstore.flush.size 默认是64m,可以翻倍,也可以不变,如果内存小基本上用不到这个配置,如果入库过快,没等到攒到64m就开始强制flush,最终你会看到flush进去的全是5m、6m等等。这对不给力的硬盘上的compaction是致命的。
5.关闭autoflush, 设置buffersize(10*1024*1024)。
运行状况
消息入库设置了50个线程,每次1000条(可能要比1000多,因为需要恢复转发关系)
用户信息50个线程,每次100条。(可能一条会连续入库上千条,因为user可能关注了很多人)
运行时发现,内存和硬盘的瓶颈非常大,内存小导致强制flush,产生storefiles的速度很快。从而导致需要更多的compaction操作。dn rs 连接数以及storefiles的数量持续增加。后来每写500w条就休息一个小时,可以保证入库程序的良好运行。
需要指出的是,150G(user3G,message120g)的压缩数据入库之后居然快接近1T,2备份。说明数据结构占用了不少空间。
HBase入库调优的更多相关文章
- hbase性能调优_表设计案例
hbase性能调优案例 1.人员-角色 人员有多个角色 角色优先级 角色有多个人员 人员 删除添加角色 角色 可以添加删除人员 人员 角色 删除添加 设计思路 person表 ...
- OpenTSDB/HBase的调优过程整理
背景 过年前,寂寞哥给我三台机器,说搞个新的openTSDB集群.机器硬件是8核16G内存.3个146G磁盘做数据盘. 我说这太抠了,寂寞哥说之前的TSDB集群运行了两年,4台同样配置的机器,目前hd ...
- hbase性能调优(1)
hbase性能调优 标签: hbase 性能调优 | 发表时间:2014-05-17 15:10 | 作者:无尘道长 分享到: 出处:http://www.iteye.com 一.服务端调优 1.参数 ...
- hbase性能调优案例
hbase性能调优案例 1.人员-角色 人员有多个角色 角色优先级 角色有多个人员 人员 删除添加角色 角色 可以添加删除人员 人员 角色 删除添加 设计思路 person表 ...
- HDP之HBase性能调优
(官方文档翻译及整理) 一.系统级调优 1.保证充足的RAM 2.64位的操作系统 3.Linux的swappiness设置为0 : sysctl vm.swappiness=10 vim /etc/ ...
- hbase参数调优
@ 目录 HBase参数调优 hbase.regionserver.handler.count hbase.hregion.max.filesize hbase.hregion.majorcompac ...
- HBase性能调优
因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正. 配置优化 zo ...
- hbase性能调优之压缩测试
文章概述: 1.顺序写 2.顺序读 3.随机写 4.随机读 5.SCAN数据 0 性能测试工具 hbase org.apache.hadoop.hbase.PerformanceEvaluation ...
- HBase性能调优(转)
原文链接:http://www.blogjava.net/ivanwan/archive/2011/06/15/352350.html 因官方Book Performance Tuning部分章节没有 ...
随机推荐
- Effective Java 63 Include failure-capture information in detail message
Principle To capture the failure, the detail message of an exception should contain the values of al ...
- leveldb源码分析--Iterator遍历数据库
在DBImpl中有一个函数声明为Iterator* DBImpl::NewIterator(const ReadOptions& options) ,他返回一个可以遍历或者搜索数据库的迭代器句 ...
- JS 日期对象在浏览器间的若干差异
JS中 ,通过 new Date() 可以获取当前时间 也可以通过 new Date("2013/12/12 8:00:00")的方式,创建某个指定时间对象 在Chrome和FF下 ...
- Python常见数据结构--列表
列表 Python有6个序列的内置类型,但最常见的是列表和元组. 序列都可以进行的操作包括索引,切片.加.乘.检查成员. 此外,Python已经内置确定序列的长度以及确定最大和最下的元素的方法. ...
- cxf构建webservice的两种方式
一.简介 对于基于soap传输协议的webservice有两种开发模式,代码优先和契约优先的模式.代码优先的模式是通过编写服务器端的代码,使用代码生成wsdl:契约优先模式首先编写wsdl,再通过ws ...
- cocos2d-x之Box2d初试
物理引擎:用来模拟一套物理事件的物理代码. #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "c ...
- cocos2d-x之单点触碰初试
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size size=Director::getInstance()- ...
- fork函数
在Unix/Linux中用fork函数创建一个新的进程.进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程.该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程. ...
- 【C#】1.算法温故而知新 - 简单的桶排序
该算法的时间复杂度是O(M+N),M为桶的个数,N为待排序的个数 缺点: 1.不适用于小数 2.当数值过多,太浪费空间,比如数值范围为0~99999,那需申请100000个变量,也就是要写成a[100 ...
- HDU 4454 Stealing a Cake --枚举
题意: 给一个点,一个圆,一个矩形, 求一条折线,从点出发,到圆,再到矩形的最短距离. 解法: 因为答案要求输出两位小数即可,精确度要求不是很高,于是可以试着爆一发,暴力角度得到圆上的点,然后求个距离 ...