如何破解HBase+Elasticsearch组合使用遇到的难题

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 面对海量数据的低成本存储+高效检索需求,业界通常使用HBase+ElasticSearch的组合方案,本文将介绍该方案的常见实现架构及其痛点,并提出一种更好的解决方法Lindorm Searchindex

一、背景介绍

HBase与ElasticSearch是现代应用在处理海量数据的技术架构会经常被使用的两款产品,其中HBase是一个分布式KV系统,具有灵活Schema、水平扩展、低成本、高并发的优势,但在复杂查询、分析能力方面相对比较弱,特别适合海量半结构化、结构化数据的低成本存储和在线高并发查询。而ElasticSearch是一个分布式搜索引擎,具有灵活Schema、水平扩展、检索快的优势,但在成本、查询并发、一致性方面相对不足,特别适合海量半结构化、结构化数据的复杂查询和全文检索。

HBase与ElasticSearch两者有类似的灵活数据结构和分布式扩展性,又有各自鲜明的特点,一个擅长存,一个擅长取,为了取长补短,所以业界会经常将两者结合使用,把Elasticsearch作为HBase中部分字段的索引存储,从而同时实现低成本存储+高并发吞吐+高效检索的效果,典型场景如日志、监控、账单、用户画像等。

二、HBase与ES的组合使用

当应用决定组合使用HBase+ES的时候,核心要解决数据写入、数据查询这两个问题,即数据如何准确写入到两个系统,数据又如何从两个系统查询合并,目前常见的方案有三种:

1)应用双写双读:应用需要同时与HBase、ElasticSearch独立交互,其优点是不需要引入额外依赖,应用可以根据自身需求,定制或简化写入分发和查询合并的逻辑,但缺点也比较多,包括开发成本高、维护复杂、写入Latency增大、可用性下降、一致性解决困难等。

image.png


2)数据自动复制,应用双读:应用在写入链路只与HBase交互,在查询链路仍与两个系统交互,其优点是写入过程对应用保持透明,较容易保证最终一致性,ES系统异常后也不会影响写入,但缺点是需要额外开发维护一套数据同步服务,应用查询数据的复杂性仍然较高

image.png


3)利用触发器,应用只读写HBase:应用在读写链路只与HBase交互,利用HBase Coprocessor功能,在HBase表上挂载读写触发器,其中写触发器负责数据写入HBase的同时自动往ElasticSearch写入,读触发器负责解析Scan语句中的查询表达,自动根据存储在ElasticSearch的索引字段进行加速,并与HBase中查询到的整行数据进行合并后,返回给客户端。所以,总的来说,这套方案的优点是应用的读写逻辑比较简单,只需要和HBase交互,但其缺点是其开发非常复杂,需要对HBase及其Coprocessor功能有深入理解,开发足够健壮的读写触发器,并将复杂多条件查询和数据检索的需求嵌入到HBase的查询框架中。同时,一致性、可用性、写入Latency这几个问题也依然存在。

image.png


通过上述三个方案的介绍,我们可以发现HBase+Elasticsearch的组合使用过程中会碰到以下几个痛点:

1) 开发维护成本巨大,需要开发和维护数据实时同步、数据查询合并、索引字段增删管理、历史数据索引构建等多个能力,这依赖于开发者对HBase和ES系统的深入掌握,否则很容易造成数据错误。

2) 数据一致性弱,由于数据写入ES后无法立即可见,并且HBase到ES之间的异步数据复制,所以会造成应用侧的数据不一致性,导致出现数据从HBase可以查到,但从ES查不到的现象。

3) 部署成本高昂,HBase与Elasticsearch都是分布式架构,但前者使用存储计算分离架构,后者使用存储计算耦合架构,使得两个系统间的资源无法共享复用,碎片化浪费加大。

4) 可用性和吞吐下降,由于HBase的并发吞吐能力远大于Elasticsearch,对于数据串行写HBase、Elasticsearch两个系统的方案,会导致写入延迟上升,吞吐下降到ES水平,并且可用性也随之下降。

5) 部分功能失效或衰退,数据生命管理周期(TTL)是一个HBase与ES都具备的常用功能,但两者对其执行有一定的差异化,会导致部分数据在一个系统中已经过期淘汰,但在另一个系统还保留着的间歇性现象。多版本是HBase中的常用功能,可以还原乱序写入数据的顺序性,但Elasticsearch并不支持,所以两者组合后就无法继续使用该功能,否则会出现不可预测的奇怪现象。

6) 非Java开发者使用困难,两个系统的服务端都是使用Java开发,上述方案二和方案三中的数据同步组件和触发器,都需要Java开发,对非Java开发者并不友好。

三、Lindorm Searchindex介绍

除了HBase+Elasticsearch的组合,Elasticsearch与MySQL、MongoDB、Cassandra等系统的组合也经常被用在各个业务场景中,这种数据库+搜索引擎的多套系统组合方案普遍具有类似的开发维护复杂、成本高昂、一致性弱等痛点。基于此情况,阿里云数据库Lindorm着力打造了企业级特性Searchindex,帮助用户更加简单、高效、低成本地应对海量数据的存储检索需求。

云原生多模数据库 Lindorm 是一个适用于任何规模、多种模型的数据库服务平台,支持海量多样化数据的低成本、实时在线的存储检索分析,提供宽表、时序、搜索、文件等多种数据模型,兼容HBase/Cassandra、OpenTSDB、Solr、SQL、HDFS等多种开源接口,是互联网、IoT、车联网、广告、社交、监控、游戏、风控等场景首选数据库,也是为阿里巴巴核心业务提供支撑的数据库之一。

image.png


Searchindex是Lindorm宽表提供的一种新型索引,用户只需简单的SQL语句即可管理索引的增删和构建,数据读写也可以使用统一的SQL访问,在使用体验上与传统数据库的二级索引一致,但其具备强大的全文索引和复杂条件查询能力,这背后是因为相关索引数据由基于Lucene的分布式搜索引擎LindormSearch管理,通过倒排索引、BKD-Tree、Bitmap等数据结构大幅提升海量数据的筛选速度。

让我们看一个具体的使用例子:

  • 原始表

image.png

CREATE TABLE myTable (
    id bigint,
    name text,
    age int,
    sex text,
    city text,
    address text,
    PRIMARY KEY (id)
) ;
  • 需求对 姓名(name)、年龄(age)、性别(sex)、城市(city)、地址(address) 建立全文索引
CREATE SEARCH INDEX myIndex ON myTable WITH COLUMNS (name, age, sex, city, address);
注意:索引列的先后顺序不影响,即索引列(c3, c2, c1)与索引列(c1, c2, c3)最终的效果是一致的。
  • 查询

1)标准查询语句

模糊查询:SELECT * FROM myTable WHERE name LIKE '小%'
多维查询排序:SELECT * FROM myTable WHERE city='杭州' AND age>=18 ORDER BY age ASC
多维查询翻页:SELECT * FROM myTable WHERE name='小刘' AND sex=false OFFSET 100 LIMIT 10 ORDER BY age DESC

2)高级查询语句

多维查询排序:SELECT * FROM myTable WHERE search_query='+city:杭州 +age:[18TO*]ORDERBYageASC'文本检索:SELECT *FROMmyTableWHEREsearch_query='address:西湖区'


从上面的例子可以看到,用户只要了解基本SQL,无需开发,即可使用Lindorm Searchindex。通过该特性,可以完全解决HBase+Elasticsearch组合使用遇到的难题,具体来说,有如下优势:

1) 简单易用,作为一个数据库特性,开箱即用,索引增删、索引构建、存储优化等全部通过SQL命令控制,无需额外的开发和维护。

2) 统一SQL访问,数据的读写都通过SQL进行,并且服务端会自动选择最合适的索引,加速查询。

3) 数据多一致,相比于Elasticsearch的数据写入后无法实时可见的缺点,LindormSearch支持数据写入后立即可见,所以Lindorm Searchindex提供强一致和最终一致两种模式

4) 低成本,表的原始数据和索引数据共享存储,大幅减少资源碎片

5) 功能完整,TTL、多版本等核心功能可以在Searchindex中继续正常使用

6) 支持多种开发语言,应用可以通过Java、C++、Python、Go等主流开发语言,使用该特性


关于Lindorm Searchindex的更多技术实现,可以参考文章深度解析Lindorm全文索引(SearchIndex)技术

四、总结

面对海量数据的低成本存储+高效检索的需求,业界通常使用HBase+ElasticSearch的组合方案,但该方案存在开发维护复杂、数据一致性弱、部署成本高、原功能失效等难题,其他常见的MySQL/MongoDB/Cassandra的组合使用也有类似的痛点。基于此情况,阿里云数据库Lindorm着力打造了企业级特性Searchindex,可以完美解决HBase+ElasticSearch组合使用遇到的难题,帮助用户更加简单、高效、低成本地应对海量数据的存储检索需求。

感谢您的阅读也欢迎试用体验SearchIndex,可参考使用手册,技术交流欢迎加入钉群:35977898

image.png


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
存储 运维 自然语言处理
【教程】Hbase+ElasticSearch构建海量数据检索平台
【教程】Hbase+ElasticSearch构建海量数据检索平台
1072 0
【教程】Hbase+ElasticSearch构建海量数据检索平台
|
SQL 消息中间件 自然语言处理
使用ElasticSearch赋能HBase二级索引 | 实践一年后总结
前言:还记得那是2018年的一个夏天,天气特别热,我一边擦汗一边听领导大刀阔斧的讲述自己未来的改革蓝图。会议开完了,核心思想就是:我们要搞一个数据大池子,要把公司能灌的数据都灌入这个大池子,然后让别人用 各种姿势 来捞这些数据。
1772 0
|
分布式数据库 索引 Hbase
使用elasticsearch提高hbase基于列的查询效率
使用elasticsearch提高hbase基于列的查询效率 网上能查到的hbase提高基于列的查询效率基本上是建立二级索引的方法,介绍另外一种方法,使用分布式索引技术elasticsearch来提高效率, 基本思路和二级索引差不多,都是通过对要查询的列建立索引,先根据建立的列索引查询到rowkey,再根据rowkey查询到需要的数据,步骤如下: 1.
4325 0
|
分布式计算 Java Hadoop
Elasticsearch+Hbase实现海量数据秒回查询
---------------------------------------------------------------------------------------------[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/53966430作者:朱培      ID:sdksdk0  
3024 0
|
分布式数据库 Hbase API
HBase数据同步到ElasticSearch的方案
ElasticSearch的River机制 ElasticSearch自身提供了一个River机制,用于同步数据。 这里可以找到官方目前推荐的River: http://www.elasticsearch.org/guide/en/elasticsearch/rivers/current/ 但是官方没有提供HBase的River。
2547 0
|
4月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
84 0
|
8月前
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
143 0
|
1天前
|
存储 分布式计算 Hadoop
基于Hadoop分布式数据库HBase1.0部署及使用
基于Hadoop分布式数据库HBase1.0部署及使用
|
4月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
53 0
|
3月前
|
存储 分布式计算 Hadoop
Hadoop中的HBase是什么?请解释其作用和用途。
Hadoop中的HBase是什么?请解释其作用和用途。
40 0