HBase概念学习(九)HTablePool为何弃用?

转载请注明出处:jiq?钦‘s technical Blog

我们先看HConnection的getTable方法描述:

  • getTable

    HTableInterface getTable(String tableName)
                             throws IOException

    Retrieve an HTableInterface implementation for access to a table. The returned HTableInterface is not thread safe, a new instance should be created for each using thread. This is a lightweight operation, pooling or caching of the returned
    HTableInterface is neither required nor desired. Note that the HConnection needs to be unmanaged (created withHConnectionManager.createConnection(Configuration)).

    Parameters:
    tableName -
    Returns:
    an HTable to use for interactions with this table
    Throws:
    IOException

上面说HTable的的父类HTableInterface是非线程安全的,针对每个线程建议都应该创建一个新的HTableInterface实例,这个创建过程是轻量的,缓存HTableInterface对象既不是必须的也不是推荐的!

然后再联想到只要HTable使用的Configuration是同一个,那么它们一定是共用一个HConnection的,HConnection才是HBase客户端到Hbase集群的真正的连接。

再想想HTablePool的作用,无非就是HTable的连接池,里面维护的HTable应该来说都是使用的同一个HConnecion。

既然HTable的创建是轻量级的,使用同一个Confuguration的HTable都会共用一个HConnection,那么HTablePool就显得那么多余!

所以Hbase抛弃了HTablePool,我们唯一要做的就是保证HConnection实例是唯一的,全局共享的。然后针对HTableInterface对象最好在每次操作HBase表的时候根据HConnection对象来重新创建,使用完成之后及时关闭即可!

通过HConnection的getTable()方法就能够获取到用户操作HBase表的HTableInterface对象了。

下面是一个使用HConnection的getTable()方法获取HTableInterface对象的例子:

public void addUser(User user) throws IOException
	{
		HTableInterface usersTable = conn.getTable(TABLE_NAME);

		Put put = makePut(user);
		usersTable.put(put);

		usersTable.close();
		log.info("Add a User:"+user.name+" successfully");
	}

至于HConnection对象如何创建,HBase推荐使用的方法是:

  • createConnection

    public static HConnection createConnection(org.apache.hadoop.conf.Configuration conf)
                                        throws IOException

    Create a new HConnection instance using the passed conf instance.

    Note: This bypasses the usual HConnection life cycle management done by getConnection(Configuration). The caller is responsible for callingCloseable.close()
    on the returned connection instance. This is the recommended way to create HConnections.HConnection connection = HConnectionManager.createConnection(conf); HTableInterface table = connection.getTable("mytable"); table.get(...); ... table.close(); connection.close();

    Parameters:
    conf - configuration
    Returns:
    HConnection object for conf
    Throws:
    ZooKeeperConnectionException
    IOException

下面代码是我按照单例模式维护HConnection对象的例子:

public class HBaseUtils {

	private static final String QUORUM = "192.168.1.100";
	private static final String CLIENTPORT = "2181";
	private static Configuration conf = null;
	private static HConnection conn = null;

	/**
	 * 获取全局唯一的Configuration实例
	 * @return
	 */
	public static synchronized Configuration getConfiguration()
	{
		if(conf == null)
		{
			conf =  HBaseConfiguration.create();
			conf.set("hbase.zookeeper.quorum", QUORUM);
			conf.set("hbase.zookeeper.property.clientPort", CLIENTPORT);
		}
		return conf;
	}

	/**
	 * 获取全局唯一的HConnection实例
	 * @return
	 * @throws ZooKeeperConnectionException
	 */
	public static synchronized HConnection getHConnection() throws ZooKeeperConnectionException
	{
		if(conn == null)
		{
			/*
			 * * 创建一个HConnection
			 * HConnection connection = HConnectionManager.createConnection(conf);
			 * HTableInterface table = connection.getTable("mytable");
			 * table.get(...); ...
			 * table.close();
			 * connection.close();
			 * */
			conn = HConnectionManager.createConnection(getConfiguration());
		}

		return conn;
	}
}

以上属于个人见解,如果有什么疑问和指教,欢迎指正。

可以联系邮箱:[email protected] 交流,季义钦

HBase概念学习(九)HTablePool为何弃用?

时间: 2024-08-07 08:25:48

HBase概念学习(九)HTablePool为何弃用?的相关文章

HBase概念学习(八)开发一个类twitter系统之表设计

这边文章先将可能的需求分析一下,设计出HBase表,下一步再开始编写客户端代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,参考HBase实战这本书实际动手做了这个例子. 2.需求 这是一个用户推特系统,用户登陆到系统,需要维护用户的基本信息,然后用户可以发帖和其他用户进行互动.用户之间可以相互关注,用户可以浏览关注用户的推文等等. 这是一个比较简单的推特系统,不考虑用户之间的私信,用户评论推特等功能. 3.概要设计 3.1表设计 首先需要设计三个表:用户表,推特表以及用户

HBase概念学习(七)HBase与Mapreduce集成

这篇文章是看了HBase权威指南之后,根据上面的讲解搬下来的例子,但是稍微有些不一样. HBase与mapreduce的集成无非就是mapreduce作业以HBase表作为输入,或者作为输出,也或者作为mapreduce作业之间共享数据的介质. 这篇文章将讲解两个例子: 1.读取存储在hdfs上的txt文本数据,简单地以json字符串的形式存储到HBase表中. 2.将第一步存储的HBase表中的json字符串读取出来,解析存储到新的HBase表中,可以进行查询. 本文详细给出了源码以及如何运行

HBase概念学习(三)Java API之扫描和过滤器

HBase基本的CRUD操作就不多介绍了,无非就是Put,Get,Delete三个类的运用. 本文相当于是阅读HBase权威指南的总结. 一.扫描(Scan) 现在看一下扫描技术,这种技术类似于关系型数据库的游标(cursor),并利用到了HBase底层顺序存储的特性. 使用扫描的一般步骤是: 1.创建Scan实例 2.为Scan实例增加扫描的限制条件 3.调用HTable的getScanner()方法获取ResultScanner对象 4.迭代ResultScanner对象中的Result对象

【甘道夫】HBase连接池 -- HTablePool被Deprecated之后

说明: 最近两天在调研HBase的连接池,有了一些收获,特此记录下来. 本文先将官方文档(http://hbase.apache.org/book.html)9.3.1.1节翻译,方便大家阅读,然后查阅了关键类HConnectionManager的Developer API(http://hbase.apache.org/devapidocs/index.html) 做了一些总结. 最后介绍一些阅读0.96.0.98及最新源码的精彩发现. 欢迎转载,请注明来源: http://blog.csdn

HBase概念学习(四)Java API之扫描和过滤器

HBase主要的CRUD操作就不多介绍了,无非就是Put,Get.Delete三个类的运用. 本文相当于是阅读HBase权威指南的总结. 一.扫描(Scan) 如今看一下扫描技术,这样的技术类似于关系型数据库的游标(cursor),并利用到了HBase底层顺序存储的特性. 使用扫描的一般步骤是: 1.创建Scan实例 2.为Scan实例添加扫描的限制条件 3.调用HTable的getScanner()方法获取ResultScanner对象,假设通过HTablePool的方式,则是调用HTable

HBase系统入门--整体介绍

转自:http://www.aboutyun.com/thread-8957-1-2.html 问题导读:1.HBase查询与写入哪个更好一些?2.HBase面对复杂操作能否实现?3.Region服务器由哪2部分构成?扩展:4.HBase能否实现join操作?5.二级索引的作用是什么? 前言如今在软件开发领域,谈及大数据已经是家常便饭.笔者相信在未来几年内,大数据的运算和存储一定会成为企业关注的核心.在此普及一个概念,什么级别的数据才能称之为大数据?如果你存储在DB中的数据达到了PB或者单表过亿

hbase性能调优(1)

hbase性能调优 标签: hbase 性能调优 | 发表时间:2014-05-17 15:10 | 作者:无尘道长 分享到: 出处:http://www.iteye.com 一.服务端调优 1.参数配置 1).hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB,比如大的put.使用缓存的scans)的时候,如果该值设置过大则会占用过多的内存,导致频繁的GC,或者出现OutOfMem

HBase与MongDB等NoSQL数据库对照

HBase概念学习(十)HBase与MongDB等NoSQL数据库对照 转载请注明出处: jiq?钦's technical Blog - 季义钦 一.开篇 淘宝之前使用的存储层架构一直是MySQL数据库,配合以MongDB,Tair等存储. MySQL因为开源,而且生态系统良好,本身拥有分库分表等多种解决方式,因此非常长一段时间内都满足淘宝大量业务的需求.可是因为业务的多样化发展,有越来越多的业务系统的需求開始发生了变化.一般来说有下面几类变化: (1)    数据量变得越来越多,其实如今淘宝

1006-HBase操作实战(JAVA API状态)

一.准备阶段 开发环境: hadoop: hadoop -2.4.0 hbase: hbase -0.94.11-security eclipse:Juno Service Release 2 二.创建 hbasedemo项目 1.通过 Eclipse 创建一个新 Java project 2.右击项目根文件夹,选择"Propertiesà> Java Build Pathà> Libraryà>  Add  External  JARs" 3.加入jar文件到 cl