本文章只针对“微型集群处理大数据”的场景。

场景描述:

硬件: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入库调优的更多相关文章

  1. hbase性能调优_表设计案例

    hbase性能调优案例 1.人员-角色   人员有多个角色  角色优先级   角色有多个人员   人员 删除添加角色   角色 可以添加删除人员   人员 角色 删除添加   设计思路 person表 ...

  2. OpenTSDB/HBase的调优过程整理

    背景 过年前,寂寞哥给我三台机器,说搞个新的openTSDB集群.机器硬件是8核16G内存.3个146G磁盘做数据盘. 我说这太抠了,寂寞哥说之前的TSDB集群运行了两年,4台同样配置的机器,目前hd ...

  3. hbase性能调优(1)

    hbase性能调优 标签: hbase 性能调优 | 发表时间:2014-05-17 15:10 | 作者:无尘道长 分享到: 出处:http://www.iteye.com 一.服务端调优 1.参数 ...

  4. hbase性能调优案例

    hbase性能调优案例 1.人员-角色   人员有多个角色  角色优先级   角色有多个人员   人员 删除添加角色   角色 可以添加删除人员   人员 角色 删除添加   设计思路 person表 ...

  5. HDP之HBase性能调优

    (官方文档翻译及整理) 一.系统级调优 1.保证充足的RAM 2.64位的操作系统 3.Linux的swappiness设置为0 : sysctl vm.swappiness=10 vim /etc/ ...

  6. hbase参数调优

    @ 目录 HBase参数调优 hbase.regionserver.handler.count hbase.hregion.max.filesize hbase.hregion.majorcompac ...

  7. HBase性能调优

    因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正. 配置优化 zo ...

  8. hbase性能调优之压缩测试

    文章概述: 1.顺序写 2.顺序读 3.随机写 4.随机读 5.SCAN数据 0 性能测试工具 hbase org.apache.hadoop.hbase.PerformanceEvaluation ...

  9. HBase性能调优(转)

    原文链接:http://www.blogjava.net/ivanwan/archive/2011/06/15/352350.html 因官方Book Performance Tuning部分章节没有 ...

随机推荐

  1. Memcache笔记03-php操作Memcached

    通过php程序操作Memcached服务几种形式 Memcache 扩展 Memcached 扩展 Socket套接字操作 memcached-client.php(函数) 对于php扩展来说,dan ...

  2. docker-4 Dockerfile的使用

    Dockerfile FROM      基础镜像 MAINTAINER  维护这信息 RUN       运行什么命令,在命令前面加上RUN ADD       往里面加点文件,copy文件,会自动 ...

  3. Spring AOP 深入剖析

    AOP是Spring提供的关键特性之一.AOP即面向切面编程,是OOP编程的有效补充.使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统.从而避免了在业务逻 ...

  4. Node.js的模块载入方式与机制

    Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...

  5. JavaScript生成GUID的算法

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  6. 虚拟机centos6.5 --设置主机名

    vi /etc/sysconfig/network #修改HOSTNAME后面的值,机器名 vi /etc/hosts #设置ip和机器名的对应关系 192.168.12.232 master 192 ...

  7. 终于完成了Josephus的C语言实现啦~~

    /*以下程序用来解决Josephus问题,现在只是完成了M>N的情况,2015-08-20 22:22:20*//*发现一个问题:数组的赋值问题:char People[N]={1};并不代表所 ...

  8. C++中对象初始化

    在C++中对象要在使用前初始化,永远在使用对象之前先将它初始化. 1.对于无任何成员的内置类型,必须手工完成此事. 例如: int x=0; double d; std::cin>>d; ...

  9. Vertica 项目常用代码

    1.查看目录下面有多少文件数 ls -l |grep "^-"|wc -l 思路很明显了,ls后通过grep进行过滤判断是文件还是文件夹, 如果是判断文件夹,可以使用ls -l | ...

  10. ETL from hadoop to vertica

    根据项目需要,我做了一个POC(proof of concept),XML TXT的数据从HADOOP 引入到VERTICA. 我采用的方案是pig,具体信息可以参加vertica官方的文档. Acc ...