`
kirayuan
  • 浏览: 38543 次
文章分类
社区版块
存档分类
最新评论

Hbase入库因素小结(停止更新)

 
阅读更多

一、硬件因素

Ø 内存

Hbase对内存有特别的嗜好,因为内存越大,regionserver接受客户端传递来的数据时可以在内存中做缓存(memstore)以及排序,分配给region等操作的限度更大,相当于利用内存作为缓冲池,组织好hbase需要的数据之后再统一写的顺序写硬盘。

*推荐32GB内存

Ø CPU

CPU参与边界计算以及数据排序等操作,当内存非常大时,CPU对内存中数据的组织,排序,边界计算等可能成为瓶颈。

*推荐8cpu,同时可满足mapreduce的需求

Ø 网络I/O

以目前的集群状况来看(10节点小集群),网络I/O没有达到瓶颈。

*推荐用千兆双网卡绑定,万兆交换机,最大限度提高网络吞吐率。

Ø 硬盘

在测试入库时需要关注硬盘的iowait情况,虽然内存往硬盘上flush数据时顺序写操作,但在某些情况下会出现硬盘iowait高,造成瓶颈。另外需要关闭swap来保证硬盘不会被频繁的调入swap使用。在配置hdfs的时候不要对多块盘坐raid,而是要直接挂载到某些目录下

*推荐使用500GBSATA/SAS盘,7200转,节点8块盘

二、Hbase配置参数

Øhbase.hregion.max.filesize

这个参数是单个region的最大字节数,当region中的数据达到这个值之后就会平均分裂成2region

Øhbase.hregion.memstore.flush.size

这个参数是每次内存能缓存的数据最大字节数,当memstore中缓存的数据达到这个值,hbase就将数据flush到硬盘上

Øhbase.regionserver.handler.count

这个参数决定了每个regionserver能够开启的最大handler数量,即接受客户端请求的句柄数,这个数量越大能接受的客户端以及线程数越多

ØHBASE_HEAPSIZE

这个参数决定了hbase最多能调用物理机的内存大小,尽量配置大一些

hbase.hregion.max.filesizehbase.hregion.memstore.flush.size参数的配置有讲究。目前有2种设计思路:

1、 建表时预划分region,对数据有清楚的把握(数据量、rowkey分布),能够进行将region分好,而无需启用hbase的自split策略,这种方式能够提高集群稳定性,缺点是操作上较困难。在此情况下hbase.hregion.max.filesize设置为1TB或更大值

2、 数据无法估量,采用hbase自身split机制。灵活性高,易操作,缺点是存在不稳定风险。在此情况下将hbase.hregion.max.filesize设置为1GB-2GB较合理

3、 无论上述哪种情况hbase.hregion.memstore.flush.size200MB左右是经过多次测试后一个较理想值

二、Hadoop配置参数

hbase是基于hadoop构建的,要调优hbase入库性能必然少不了调优hdfs。这里发现了几个比较有用的参数

dfs.replication.interval:默认为3秒,就是hadoop检查备份的时间间隔,这个时间稍微设长一点可以避免hdfs频繁备份,提高hdfs吞吐效率

dfs.datanode.handler.countdatanodehandler,增加datanodehandler

dfs.namenode.handler.countnamenodehandler数。

三、系统架构因素

Ø Client

入库时对client的数量和开启的线程数量有要求,对client机器性能也有一定的要求,因为实际测试的时候发现client端开启50个线程后机器性能占用比较满。

Ø Regionserver

Regionserver端越多,能同时接受的请求就越多,入库速度就越快。

四、配套软件

操作系统:64centOS

JDKsun64jdk

Hadoop0.20.2-cdh3

Hbase0.90.3-cdh3

五、hbase表设计因素

hbase表如果设计成多列族会比单列族的时候入库速度慢。因为多列族的时候hbasememstoreflush时对一个store文件的flush会同时触发其他storeflush,这个可能是hbase的一个bug,目前来说设计表的时候不要将列族设计到3个以上。

五、入库程序设计因素

入库程序的设计上最好在创建Htable的时候就设置好region的数量,start_keyend_key,这样就能够使程序开始运行的时候向每个regionserver传递请求。另外start_keyend_key的设计可以让数据较紧凑的平均分发到各个region上。

入库程序不要手动做table.flushcommit(),而是使用hbase自带的memstore->硬盘的写入机制,只需要table.put即可。然后设置table的自动提交功能为false(如果为true的话每次调用table.put的时候都会触发一次操作)。

数据入库时只对自动提交选项设为false,而不对writebuffersize做设置效果会比较好,看了hbase的代码不设置的话默认值是2MBwritebuffersize的设置不能太大,也不能太小,实际测试中2-5MB之间比较合理

入库程序设计要开尽可能多的线程,推荐20-25线程,在多个机器上运行,同时读取本地文件,在并发数量大的情况下入库效率会得到较大提升。

BlukLoad入库:除了client方式之外,可以通过mr来生成hfile,之后将hfile直接导入hbase的方式入库。目前以这种方式进行大文件批量入库是最为理想的方法。最近会写篇文章专门谈一下这块。

六、最新的测试情况

目前集群含有12个节点,9clientregionserver的内存设置为13000M,修改region的最大大小为400G(目的是为了不做分裂);提前划分region 200个;regionflush大小为4Gclientwritebuffersize64MB,每个开20线程。入库速度能达到30MB/shbaserequest10w。单列族的表入库速度能达到20wrequest50MB/s

2011109日:

采用单列族,单列的方式使hbase入库速度达到最快值,大约8MB/s的单节点入库速度,总集群速度达到72MB/srequest峰值80W/s。(前提是提升了内存到32GB)。

最新碰到的问题是1TB数据入库的时候,每次触发memstore flush有三个现象

1flush的文件size很小:我考察了两个触发flush的条件,一个是hbase.regionserver.global.memstore.upperLimit,一个是hbase.hregion.memstore.flush.size,都不是这两个原因。

2)耗时很高:可能是磁盘IO性能不够

3)波动较大:磁盘IO跟不上接收速度

20111128日:

目前关闭wal,入库速度终于突破100W/s,取得了阶段性的成果。

2012225日:

参与上海数据中心测试,在较好硬件支持下,集群的入库速度达到200W/s,并且持续稳定运行。入库速度达到实测中最理想情况,每台机器的硬件平均利用率指标在70-80%左右。

七、写在末尾的一段话

本篇文章的撰写背景是为了解决在大规模数据入库情况下入库性能瓶颈,适用场景为:TB级别数据,10台机器。

这里要感谢淘宝的众位大哥,很欣赏淘宝在技术上开放的心态,通过线上线下交流、技术博客学到不少。也感谢公司,能给我个人一个宽松的环境,做我自己喜欢的事情。mark一下国防科大的哥们,我是锐安科技的hbase研发。

我在2011年中hbase入库优化工作告一段落,所以如果不是有大的谬误,不会再更新本博文。2012年,开启新的征程!

分享到:
评论

相关推荐

    Hbase几种入库方式

    Hbase几种数据入库(load)方式比较

    mapreduce方式入库hbase hive hdfs

    mapreduce方式入库hbase hive hdfs,速度很快,里面详细讲述了代码的编写过程,值得下载

    hadoop+HBase+Kylin集群启动停止命令.txt

    hadoop+HBase+Kylin集群启动停止命令

    hadoop,hbase,zookeeper安装笔记

    hadoop,hbase,zookeeper安装笔记hadoop,hbase,zookeeper安装笔记hadoop,hbase,zookeeper安装笔记

    HBase数据入库

    NULL 博文链接:https://57832638.iteye.com/blog/1983143

    HbaseTemplate 操作hbase

    java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行

    pinpoint的hbase初始化脚本hbase-create.hbase

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    HBase数据库设计.doc

    HBase的模式Schema设计的一些概念和原则 5 1)模式的创建与更新 5 2)列族的数量 6 3)行键设计RowKey 6 5. HBase的拓扑结构是什么? 7 1)拓扑结构 7 2)HBase与ZooKeeper的关系是什么? 7 3)HBase的内部结构管理...

    hbase-2.3.5单机一键部署工具

    说明:使用外部zookeeper3.4.13之hbase2.3.5一键部署工具,支持部署、启动、停止、清除、连接,支持自定义服务端口,数据存储目录等功能,已在生产环境使用。 Options: deploy.sh build single 构建并启动一个hbase...

    HBase学习利器:HBase实战

    HBase开发实战,HBase学习利器:HBase实战

    HBase(hbase-2.4.9-bin.tar.gz)

    HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...

    Hbase资源整理集合

    HBase 官方文档.pdf HBase的操作和编程.pdf HBase Cpressr优化与实验 郭磊涛.pdf null【HBase】Data Migratin frm Gri t Clu Cmputing - Natural Sienes .pdf 分布式数据库HBase快照的设计与实现.pdf 【HBase】...

    hbase-2.2.2单机一键部署工具

    说明:使用外部zookeeper之hbase2.2.2一键部署工具,支持部署、启动、停止、清除、连接等功能 Options: deploy.sh build single 构建并启动一个hbase单实例 deploy.sh start single 启动hbase实例 deploy.sh stop...

    hbase资料api

    HBASE

    hbase合并小文件Demo项目包

    为解决小文件的存储Hadoop自身提供了两种机制来解决相关的问题,包括HAR和SequeueFile,这两种方式在某些方面解决了本层面的问题,单仍然存在着各自...我们在进行多次的测试实现后最终觉得Hbase合并小文件更为靠谱些,

    HBase开启审计日志

    HBase开启审计日志

    HBase3.0参考指南

    HBase3.0参考指南 This is the official reference guide for the HBase version it ships with. Herein you will find either the definitive documentation on an HBase topic as of its standing when the ...

    hive和hbase整合

    hadoop jar /usr/lib/hbase/hbase-0.90.4-cdh3u3.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY, catgyname,catgyid1,catgyname1,catgyid2,catgyname2,catgyid3,catgyname3,catgyid4,catgyname4,catgyid5,...

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架。 针对HBase各版本API(1.x~2.x)间的差异,在其上剥离出了一层统一的抽象。并提供了以类SQL的方式来读写HBase表中的数据。对...

    java大数据作业_3HBase

    1. 请用java集合的代码描述HBase的表结构 2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase...

Global site tag (gtag.js) - Google Analytics