业务背景:由于需要将ngix日志过滤出来的1亿+条用户行为记录存入Hbase数据库,以此根据一定的条件来提供近实时查询,比如根据用户id及一定的时间段等条件来过滤符合要求的若干行为记录,满足这一场景的技术包括:Solr,Elasticsearch,hbase等,在此选用了Hbase来实践。

step 1 :

直接hbase建表,然后读取记录文件逐条写入Hbase。由于hbase实际的写入速度远远小于我的提交速度,在写入了1700条记录后,hbase出现了宕机,提交后无响应。查看hbase日志,出现 out of memory异常。

step 2:

考虑在建表的时候没有进行预分区,因此写入的时候会存在热点写的问题,同时数据持续增长,需要不断的对region进行split,实际上这一步相当消耗资源。因此对要写入的Hbase表重新预分区。好在上一步骤中写入的数据不多,因此直接删除表和数据后重新建表并预分区:
create 'user_actions', {NAME => 'info', VERSIONS=> 3},{SPLITS => ['130','140','160','170','180']}

设计预分区的时候需要有个预判,rowkey的范围及在各个区间的可能分布情况,由于我这里的rowkey是组合用户的注册电话/时间及其他字段,因此上述的预分区,可以将记录较好的散列在各个region上,对热点写有一定的减缓作用。

同时,针对out  of memory异常,修改hbase配置文件/conf/hbase-site.xml,将hbase的堆内存增加到3GB(条件有限,如果硬件条件好的话,可以增加到4-8GB)。
继续写入,但是写入速度很慢,维持在数百条/秒的样子,同时写入了20几万条后响应速度越来越慢。

STEP 3:

上述问题的根源在于高频提交小数据,导致Hbase疲于创建线程并进行资源的回收,最终甚至会出现宕机。
之后,将单条put到Hbase改为一次put多条记录到hbase,即批量提交,同时限制一秒内提交的频次。最后顺利写入。由于hbase集群只有三台机器(一台master,2台slave),进过上述优化后,写入速度基本维持在1w-2w条/秒的水平,基本满足需要了。

总结:在hbase涉及一次性写入大量数据时,有几个地方可以考虑进行优化:(1)建表的同时进行预分区 (2)修改Hbase本身的配置(能够优化写入和读取的配置项远不止修改堆内存这一项,在此不表了)  (3)尽量使用批量写入的方法,同样的道理,读取的时候,使用批量读的方法 (4)网络IO/磁盘IO

本文博客地址:hbase大规模数据写入的优化历程

hbase大规模数据写入的优化历程的更多相关文章

  1. hbase大规模数据写入的优化历程 ,ZZ

    http://blog.csdn.net/zbc1090549839/article/details/51582817

  2. 用Elasticsearch做大规模数据的多字段、多类型索引检索

    本文同时发布在我的个人博客 之前尝试了用mysql做大规模数据的检索优化,可以看到单字段检索的情况下,是可以通过各种手段做到各种类型索引快速检索的,那是一种相对简单的场景. 但是实际应用往往会复杂一些 ...

  3. HBase原理、设计与优化实践

    转自:http://www.open-open.com/lib/view/open1449891885004.html 1.HBase 简介 HBase —— Hadoop Database的简称,G ...

  4. 一种HBase表数据迁移方法的优化

    1.背景调研: 目前存在的hbase数据迁移主要分如下几类: 根据上图,可以看出: 其实主要分为两种方式:(1)hadoop层:因为hbase底层是基于hdfs存储的,所以可以通过把hdfs上的数据拷 ...

  5. HBase - 数据写入流程解析

    本文由  网易云发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻松 ...

  6. 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)

    https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...

  7. 使用bulkload向hbase中批量写入数据

    1.数据样式 写入之前,需要整理以下数据的格式,之后将数据保存到hdfs中,本例使用的样式如下(用tab分开): row1 N row2 M row3 B row4 V row5 N row6 M r ...

  8. 简单通过java的socket&serversocket以及多线程技术实现多客户端的数据的传输,并将数据写入hbase中

    业务需求说明,由于公司数据中心处于刚开始部署的阶段,这需要涉及其它部分将数据全部汇总到数据中心,这实现的方式是同上传json文件,通过采用socket&serversocket实现传输. 其中 ...

  9. HBase BulkLoad批量写入数据实战

    1.概述 在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据.使用Sqoop工具批量导数到HBase集群.使用MapReduce批量导入等.这些方式, ...

随机推荐

  1. MySQL实现全关联 full outer join

    SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键 ...

  2. laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证

    第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...

  3. 设置python爬虫IP代理(urllib/requests模块)

    urllib模块设置代理 如果我们频繁用一个IP去爬取同一个网站的内容,很可能会被网站封杀IP.其中一种比较常见的方式就是设置代理IP from urllib import request proxy ...

  4. [LeetCode] Maximum Distance in Arrays 数组中的最大距离

    Given m arrays, and each array is sorted in ascending order. Now you can pick up two integers from t ...

  5. 实验吧_程序逻辑问题(代码审计)&上传绕过

    一开始我先随便输入了几个账号名字进行测试,发现当输入的账号名为admin时会发生报错 经过测试果然是一个注入点 当拿到admin密码后发现根本没用,没办法另寻他路 审查元素时发现提示index.txt ...

  6. 属性添加get和set方法

    出错信息: Struts Problem Report Struts has detected an unhandled exception: Messages: File: com/myHibern ...

  7. [PA 2014]Lustra

    Description Byteasar公司专门外包生产带有镜子的衣柜.刚刚举行的招标会上,有n个工厂参加竞标.所有镜子都是长方形的,每个工厂能够制造的镜子都有其各自的最大.最小宽度和最大.最小高度. ...

  8. [Codeforces]856D - Masha and Cactus

    题目大意:给出一棵树和若干条可以加入的边,要求加入若干条边使图是仙人掌并且加入的边权和最大,仙人掌定义为没有一个点属于超过1个环.(n,m<=200,000) 做法:这题的仙人掌跟平时见到的不太 ...

  9. ●HDU 5608 function

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=5608 题解: 莫比乌斯反演,杜教筛 已知$$N^2-3N+2=\sum_{d|N} f(d)$$ 多次询 ...

  10. Java文件操作(新建,遍历,删除)

    //创建文件 private static void createFile(File file){ try { if(!file.exists()){ if(file.getParentFile() ...