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

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 面对海量数据的低成本存储+高效检索需求,业界通常使用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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
2月前
|
存储 监控 分布式数据库
百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现
本文介绍了百亿级数据存储架构的设计与实现,重点探讨了ElasticSearch和HBase的结合使用。通过ElasticSearch实现快速检索,HBase实现海量数据存储,解决了大规模数据的高效存储与查询问题。文章详细讲解了数据统一接入、元数据管理、数据一致性及平台监控等关键模块的设计思路和技术细节,帮助读者理解和掌握构建高性能数据存储系统的方法。
百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现
|
存储 运维 自然语言处理
【教程】Hbase+ElasticSearch构建海量数据检索平台
【教程】Hbase+ElasticSearch构建海量数据检索平台
1383 0
【教程】Hbase+ElasticSearch构建海量数据检索平台
|
SQL 消息中间件 自然语言处理
使用ElasticSearch赋能HBase二级索引 | 实践一年后总结
前言:还记得那是2018年的一个夏天,天气特别热,我一边擦汗一边听领导大刀阔斧的讲述自己未来的改革蓝图。会议开完了,核心思想就是:我们要搞一个数据大池子,要把公司能灌的数据都灌入这个大池子,然后让别人用 各种姿势 来捞这些数据。
1842 0
|
分布式数据库 索引 Hbase
使用elasticsearch提高hbase基于列的查询效率
使用elasticsearch提高hbase基于列的查询效率 网上能查到的hbase提高基于列的查询效率基本上是建立二级索引的方法,介绍另外一种方法,使用分布式索引技术elasticsearch来提高效率, 基本思路和二级索引差不多,都是通过对要查询的列建立索引,先根据建立的列索引查询到rowkey,再根据rowkey查询到需要的数据,步骤如下: 1.
4405 0
|
分布式计算 Java Hadoop
Elasticsearch+Hbase实现海量数据秒回查询
---------------------------------------------------------------------------------------------[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/53966430作者:朱培      ID:sdksdk0  
3065 0
|
分布式数据库 Hbase API
HBase数据同步到ElasticSearch的方案
ElasticSearch的River机制 ElasticSearch自身提供了一个River机制,用于同步数据。 这里可以找到官方目前推荐的River: http://www.elasticsearch.org/guide/en/elasticsearch/rivers/current/ 但是官方没有提供HBase的River。
2639 0
|
1月前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
54 5
|
2月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
241 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
3月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
4月前
|
数据可视化 Docker 容器
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
这篇文章提供了通过Docker安装Elasticsearch和Kibana的详细过程和图解,包括下载镜像、创建和启动容器、处理可能遇到的启动失败情况(如权限不足和配置文件错误)、测试Elasticsearch和Kibana的连接,以及解决空间不足的问题。文章还特别指出了配置文件中空格的重要性以及环境变量中字母大小写的问题。
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】