通过HBase Observer同步数据到ElasticSearch

转载 2015年11月20日 15:59:20

通过HBase Observer同步数据到ElasticSearch

Observer希望解决的问题

HBase是一个分布式的存储体系,数据按照RowKey分成不同的Region,再分配给RegionServer管理。但是RegionServer只承担了存储的功能,如果Region能拥有一部分的计算能力,从而实现一个HBase框架上的MapReduce,那HBase的操作性能将进一步提升。正是为了解决这一问题,HBase 0.92版本后推出了Coprocessor — 协处理器,一个工作在Master/RegionServer中的框架,能运行用户的代码,从而灵活地完成分布式数据处理的任务。

Coprocessor包含两个组件,一个是EndPoint(类似关系型数据库的存储过程),用以加快特定查询的响应,另一个就是Observer(类似关系型数据库的触发器)。Observer也分为几个类型,其中RegionObserver提供了一组表数据操作的钩子函数,覆盖了Get、Put、Scan、Delete等操作(通常有pre和post两种情况,表示在操作发生之前或发生之后),我们可以通过重载这些钩子函数,利用RegionServer实现特定的数据处理需求。

应用场景

我们在同一个主机集群上同时建立了HBase集群和ElasticSearch集群,存储到HBase的数据必须实时地同步到ElasticSearch。而恰好HBase和ElasticSearch都没有更新的概念,我们的需求可以简化为两步:

  • 当一个新的Put操作产生时,将Put数据转化为json,索引到ElasticSearch,并把RowKey作为新文档的ID
  • 当一个新的Delete操作产生时,获取Delete数据的RowKey,删除ElasticSearch中对应的ID

Java实现

Observer的Java实现并不复杂,只需要继承BaseRegionObserver的基类,并重载postPutpostDelete两个函数。考虑到未来HBase的写入会比较频繁,我们利用ElasticSearch的Bulk API做了一个缓冲池:不是每次提交HBase数据都触发索引操作,而是积累到一定数量或者到达一定时间间隔才去批量操作,从而降低了RegionServer的网络I/O压力。

完整项目请参见:HBaseObserver

Observer的部署

Observer提供了两种部署方式:

  1. 全局部署。把jar包的路径加入HBASE_CLASSPATH并且修改hbase-site.xml,这样Observer会对每一个表都生效。
  2. 单表部署。通过HBase Shell修改表结构,加入coprocessor信息。

显然后一种更加灵活。通过HBase Shell安装Observer的详细步骤如下:

  • 把Java项目打包为jar包,上传到HDFS的特定路径
  • 进入HBase Shell,disable你希望加载的表
  • 通过以下指令激活Observer:
alter 'table_name', METHOD => 'table_att', 'coprocessor' => 'hdfs:///your/jar/path/on/hdfs|com.foo.bar|1001|es_cluster=elasticsearch,es_type=video,es_index=demo,es_port=9300,es_host=localhost'

coprocessor对应的格式以|分隔,依次为:

  • jar包的HDFS路径
  • Observer的主类
  • 优先级(一般不用改)
  • 参数(对应Java项目的readConfiguration函数)

新安装的coprocessor会自动生成名称:coprocessor + $ + 序号(可通过describe 'table_name'查看)

因为一张表可能拥有多个coprocessor,卸载需要输入对应的coprocessor名称,比如:

alter 'table_name', METHOD => 'table_att_unset', NAME=> 'coprocessor$1'

需要注意的是,HBase Observer的部署有两个大坑:

  • 修改Java代码后,上传到HDFS的jar包文件必须和之前不一样,否则就算卸载掉原有的coprocessor再重新安装也不能生效
  • 如果你有多个表对多个索引/类型的映射,每个表所加载Observer对应的jar包路径不能相同,否则ElasticSearch会串数据

对:通过HBase Observer同步数据到ElasticSearch的使用情况

1、需要把client.prepareUpdate 接口 替换成 client.prepareIndex 接口 @Override public void postPut(Obser...
  • hhl2046
  • hhl2046
  • 2017年03月14日 16:14
  • 411

使用Hbase协作器(Coprocessor)同步数据到ElasticSearch

使用Hbase协作器(Coprocessor)同步数据到ElasticSearch

Hbase1.2数据同步到ElasticSearch2.x

最近公司业务调整 需要把原有的数据从关系型数据库调整到Hbase中,奈何Hbase做查询性能并不是那么优秀 所以准备集成Es做二级索引 在网上找了一大堆的资料 全部都是ElasticSearch1....
  • xj90314
  • xj90314
  • 2016年10月14日 17:14
  • 1251

面向高稳定,高性能之-Hbase数据实时同步到ElasticSearch(之二)

我在这篇focus在两个主题:如何支持多表同步共用一个jar包,如何持续稳定的与ES交互写入数据。 在 《 使用Hbase协作器(Coprocessor)同步数据到ElasticSearch》中作...

Hbase总结(八)Hbase中的Coprocessor

1.起因(Why HBase  Coprocessor) HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(统计数据表的总...

hbase-0.96.1.1-cdh5.0.0-beta2中BaseRegionObserver对应的coprocessor部署

1.将开发好的jar包,放到hdfs路径下面 2.在hbase-site.xml中配置对应的类 hbase.coprocessor.region.classes org.clo...

HBase - Coprocessor - 协处理器之观察者Observer(触发器)的介绍以及使用 | 那伊抹微笑

public class TestAddColumnBaseRegionObserver extends BaseRegionObserver{ @Override public void p...

Elasticsearch部署遇到的那些坑

最近一个项目要求部署Elasticsearch+mongdb,感觉是一个比较简单的事,却遇到了不少的坑。客户的数据库有5万多条数据,大小共60多G的文档。 先说明步骤: 1、安装Elastics...
  • csuthlb
  • csuthlb
  • 2016年08月02日 17:08
  • 795

HBase数据同步到ElasticSearch的方案

ElasticSearch的River机制 ElasticSearch自身提供了一个River机制,用于同步数据。 这里可以找到官方目前推荐的River: http://www.elasticsear...

面向高稳定,高性能之-Hbase数据实时同步到ElasticSearch(之一)

近来一直focus在构建ETL数据中心这块,需要把Hbase的若干张表数据实时同步到ElasticSearch中,调研了一段时间,在网上可参考无非就那几篇文档: 1. HBase数据同步到Elast...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过HBase Observer同步数据到ElasticSearch
举报原因:
原因补充:

(最多只允许输入30个字)