你好,游客 登录 注册 搜索
背景:
阅读新闻

Spring For Hadoop--Working With HBase(一)

[日期:2016-01-25] 来源:博客园精华区  作者: [字体: ]

最近在做web项目使用到了Hadoop,HBase,在这里对Spring For Hadoop(SHDP)的使用做个总结,主要使用了SHDP中提供的一些封装好的HBase模块。本博客将分两部分写:

  1. 对Spring For Hadoop--Working With HBase的基本认识(结合官方文档和自己的使用心得)
  2. 项目中的使用案例

1.对Spring For Hadoop--Working With HBase的基本认识

SHDP对HBase和Spring进行了整合,开发者可以通过这个框架可以很轻易地对HBase进行操作。 (可以联想使用Spring+Hibernate那样来操作数据库)

SHDP提供了通过hbase-configuration来设置HBase的配置文件:如:

<!-- default bean id is 'hbaseConfiguration' that uses the existing 'hadoopCconfiguration' object -->
<hdp:hbase-configuration configuration-ref="hadoopCconfiguration" />

通过上面的声明可以更容易的创建HBase的Configrution对象,除此之外还支持管理HBase的连接:

当application Context关闭时,HBase中所有打开的连接都可以通过stop-proxy和delete-connetcion属性来调整。

<!-- delete associated connections but do not stop the proxies --><hdp:hbase-configuration stop-proxy="false" delete-connection="true">
  foo=bar
  property=value
</hdp:hbase-configuration>

另外,还可以通过指定zk的端口号来让客户端连接HBase

<!-- specify ZooKeeper host/port -->
<hdp:hbase-configuration zk-quorum="${hbase.host}" zk-port="${hbase.port}">

当然也通过引入其他配置文件的属性来为这个配置文件添加配置,如:

<hdp:hbase-configuration properties-ref="some-props-bean" properties-location="classpath:/conf/testing/hbase.properties"/>
DAO的支持
SHDP通过org.springframework.data.hadoop.hbase包为HBase提供为DAO的支持,通过HbaseTemplate 和其他几个回调函数如TableCallback, RowMapperResultsExtractor可以轻易的实现HBase表的查询,数据的查询,扫描器的准备和一些结果的分析,极大的提高了开发效率
此DAO的核心是HbaseTemplate ,一个与HBase进行交互的高层抽象类,这个类的使用需要设置HBase的配置,一旦设置成功后就HbaseTemplate就是线程安全的,可以在同一时间内被多个实例重复使用(间接的达到了HBase连接池的效果,HBase连接池在一些需要频繁的访问HBase的web项目非常重要!!!!)
// default HBase configuration
<hdp:hbase-configuration/>

// wire hbase configuration (using default name 'hbaseConfiguration') into the template
<bean id="htemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate" p:configuration-ref="hbaseConfiguration"/>
HbaseTemplate 还为表的执行逻辑或者结果及行的提取提供了通用的回调函数
// writing to 'MyTable'
template.execute("MyTable", new TableCallback<Object>() {
  @Overridepublic Object doInTable(HTable table) throws Throwable {
    Put p = new Put(Bytes.toBytes("SomeRow"));
    p.add(Bytes.toBytes("SomeColumn"), Bytes.toBytes("SomeQualifier"), Bytes.toBytes("AValue"));
    table.put(p);
    return null;
  }
});

这段代码展示了 TableCallback  的使用,它完成了表的查找和资源的清理,而无需使用者里显式的处理,注意,在用不用回调函数时,HBase API抛出的异常都将被自动捕捉并且转换为Spring DAO的异常,而资源的清理也将被显式的调用 。

此外 HbaseTemplate 还为一些常用的操作提供了已经包装好的方法,用户可以直接使用而无需自己写回调函数

// read each row from 'MyTable'
List<String> rows = template.find("MyTable", "SomeColumn", new RowMapper<String>() {
  @Override
    public String mapRow(Result result,int rowNum) throws Exception{
    return result.toString();
  }
}));

(上面两段代码熟悉Spring和Hibernater可以轻易地联想到Spring提供的HibernateCallback和HibernaterTemplate)

除了 HbaseTemplate 外, org.springframework.data.hadoop.hbase 通过HbaseInterceptor  HbaseSynchronizationManager

类支持自动将HBase表绑定给当前线程,也就是说,每个在HBase上执行的DAO操作的类都会被 HbaseInterceptor

包装,因此一旦发现有在使用的表都将被绑定给当前线程,之后再使用这张表时就无需再查找表了(同样也达到了

HBase连接池的效果),调用结束后,表将被自己关闭。





收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款