文档章节

HBase 大吞吐系统HTablePool和HTable使用技巧

蓝狐乐队
 蓝狐乐队
发布于 2014/06/04 12:06
字数 763
阅读 195
收藏 1

这2周主要将项目中写hbase的模块中原来的异步hbaseclient改写成了使用hbase原生的HTable对象。大概总结下改写过程中和hj,xingchao发现的问题和解决方法。

1.HTablePool的基本使用方式:

由于HTable对象不是线程安全的,因此HBase提供HTablePool来支持多线程写入hbase,多线程同时从HTablePool 中取出HTable并写入是安全的。HTablePool的使用方法类似数据库连接,使用时从HTablePool中取出一个HTable,使用完后再 close放回HTablePool中。

Put put = new Put(rowkey);
        put.add(LOG_COLUMN_FAMILY,HOST_NAME_QUALIFIER,values[0]);
        HTableInterface table = HBaseClientFactory.getHTableByName(RAW_LOG_TABLE);        try {
            table.put(put);
        } catch (IOException e) {            throw new RuntimeException("Put Log meet exception",e);
        }finally {

 

HBaseClientUtil.closeHTable(table);
        }

 

2.HTablePool的maxsize。

HTablePool有一个maxsize,HTablePool针对每个表都有一个Pool,maxsize表示这个Pool的最大大小,在使用HTablePool的过程中我们发现这个值还是有需要注意的地方。

在多线程使用HTablePool拿到同一个表的HTable时,如果线程个数大于maxsize会导致写入始终是autoflush!

public HTableInterface getTable(String tableName) {    // call the old getTable implementation renamed to findOrCreateTable
    HTableInterface table = findOrCreateTable(tableName);    // return a proxy table so when user closes the proxy, the actual table
    // will be returned to the pool
    return new PooledHTable(table);
  }

 

当拿到HTable时会创建一个HTable对象并包装成一个PooledHTable对象。Pooled做了什么纳,其他方法都没变,只是在close时有所不同:

public void close() throws IOException {
      returnTable(table);
    }

 

private void returnTable(HTableInterface table) throws IOException {    // this is the old putTable method renamed and made private
    String tableName = Bytes.toString(table.getTableName());    if (tables.size(tableName) >= maxSize) {      // release table instance since we're not reusing it
      this.tables.remove(tableName, table);      this.tableFactory.releaseHTableInterface(table);      return;
    }
    tables.put(tableName, table);
  }

 

可以看到如果tables.size大于maxsize,此时会去掉一个保存的HTable对象,而releaseHTableInterface实际调 用的就是HTable的close方法,close方法又会强制flushHTable的buffer,因此,如果我们想不使用autoflush提升写 入速度失效。    
 

3.HTablePool type。

HTablePool提供了几种方式:ReusablePool,RoundRobinPool,ThreadLocalPool。默认的是 reusable,由于2的原因,我们也可以考虑使用ThreadLocal的Pool,这样多线程写入时分别取自己线程的Pool,这样互不影响,写入 的效率也会比较高。

static class ThreadLocalPool<R> extends ThreadLocal<R> implements Pool<R> {
    private static final Map<ThreadLocalPool<?>, AtomicInteger> poolSizes = new HashMap<ThreadLocalPool<?>, AtomicInteger>();    public ThreadLocalPool() {
    }    @Override
    public R put(R resource) {
      R previousResource = get();      if (previousResource == null) {
        AtomicInteger poolSize = poolSizes.get(this);        if (poolSize == null) {
          poolSizes.put(this, poolSize = new AtomicInteger(0));
        }
        poolSize.incrementAndGet();
      }      this.set(resource);      return previousResource;
    }

 

4.HTable的WriteBufferSize和autoflush

如果想追求写入的速度我们可以设置setWriteBufferSize为一个比较大的大小比如1M并autoflush为false,这样写 入的速度会有几十倍的提升,但如果BufferSize比较大也会带来写入不够实时的问题,尤其有些表的数据很小会很久都不flush。因此,我们可以添 加按时间间隔的flush方式。

@Override
    public void put(final List<Put> puts) throws IOException {        super.put(puts);
        needFlush();
    }    private void needFlush() throws IOException {        long currentTime = System.currentTimeMillis();        if ((currentTime - lastFlushTime.longValue()) > flushInterval) {            super.flushCommits();
            lastFlushTime.set(currentTime);
        }
    }

 

HTablePool可以设置自定义的HTableFactory来创建我们自定义的HTable。

pool = new HTablePool(conf, maxSize, tableFactory, PoolMap.PoolType.ThreadLocal);


本文转载自:http://www.tuicool.com/articles/IRBn2e

共有 人打赏支持
蓝狐乐队
粉丝 98
博文 321
码字总数 89120
作品 0
昌平
程序员
加载中

评论(1)

晓阳
晓阳
HTablePool有一个maxsize,HTablePool针对每个表都有一个Pool,maxsize表示这个Pool的最大大小,在使用
maxsize:表示当HTablePool中空闲的HTable数量达到HTABLE_POOL_MAX_SIZE,则直接释放HTable
新浪微博数据解析与java操作Hbase实例

之前发过一篇开发新浪微博的文章,对于大家比较感兴趣的内容之一便是如何解析新浪微博的JSON。 其实一开始的时候,也遇过一些挫折,比如直接用JsonArray和JsonObject去解析JSON内容的话,是解...

yunpiao
2014/12/09
0
0
Hbase源码之RPC机制(1)

从源代码学习Hbase: Hbase的RPC: hadoop.hbase.ipc 是一些用来区分网络中的clients和 servers得一些工具。 包中有七个Interface ,它们分别是: 1.HBaseRPCErrorHandler:它是一个接口,在...

lixiyuan
2014/05/19
0
0
(转载)Hbase -- Java客户端编程

本文以HBase 0.90.2为例,介绍如何在Windows系统,Eclipse IDE集成环境下,使用Java语言,进行HBase客户端编程,包含建立表、删除表、插入记录、删除记录、各种方式下的查询操作等。 1. 准备...

遵从本心
2013/08/15
0
0
Hbase Java API详解

HBase是Hadoop的数据库,能够对大数据提供随机、实时读写访问。他是开源的,分布式的,多版本的,面向列的,存储模型。 在讲解的时候我首先给大家讲解一下HBase的整体结构,如下图: HBase ...

凡16
2013/12/26
0
0
HBase在阿里搜索中的应用实践

李钰,花名绝顶,WOTA全球架构与运维技术峰会分享嘉宾,现任阿里巴巴搜索事业部高级技术专家,HBase开源社区PMC & committer。开源技术爱好者,主要关注分布式系统设计、大数据基础平台建设等...

雪夜凋零
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(一)软件测试专题——之Linux常用命令篇01

本文永久更新地址:https://my.oschina.net/bysu/blog/1931063 【若要到岸,请摇船:开源中国 不最醉不龟归】 Linux的历史之类的很多书籍都习惯把它的今生来世,祖宗十八代都扒出来,美其名曰...

不最醉不龟归
22分钟前
6
0
蚂蚁金服Java开发三面

8月20号晚上8点进行了蚂蚁金服Java开发岗的第三面,下面开始: 自我介绍(要求从实践过程以及技术背景角度着重介绍) 实习经历,说说你在公司实习所做的事情,学到了什么 关于你们的交易平台...

edwardGe
29分钟前
7
0
TypeScript基础入门 - 函数 - this(三)

转载 TypeScript基础入门 - 函数 - this(三) 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.4 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
39分钟前
0
0
Spark core基础

Spark RDD的五大特性 RDD是由一系列的Partition组成的,如果Spark计算的数据是在HDFS上那么partition个数是与block数一致(大多数情况) RDD是有一系列的依赖关系,有利于Spark计算的容错 RDD中每...

张泽立
46分钟前
0
0
如何搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已...

Java大蜗牛
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部