本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者亲绘大数据生态圈思维导图…持续更新,欢迎star!
前言
上一篇文章已经为大家介绍了 HBase 在用户画像的标签数据存储中的具体应用场景,本篇我们来谈谈 Elasticsearch 的使用!
原著作者:赵宏田
来源:《用户画像方法论与工程化解决方案》
Elasticsearch存储
Elasticsearch简介
Elasticsearch 是一个开源的分布式全文检索引擎,可以近乎实时地存储、检索数据。而且可扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。对于用户标签查询、用户人群计算、用户群多维透视分析这类对响应时间要求较高的场景,也可以考虑选用Elasticsearch进行存储。
Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用 json 作为文档格式。为了更清晰地理解 Elasticsearch 查询的一些概念,将其和关系型数据库的类型进行对照。
Elasticsearch | MySQL | |
---|---|---|
index | database | 数据库 |
type | table | 表 |
document | row | 行 |
mapping | column | 列 |
GET http://… | SELECT * FROM … | 查询数据 |
PUT http://… | UPDATE table SET… | 插入数据 |
在关系型数据库中查询数据时可通过选中数据库、表、行、列来定位所查找的内容,在Elasticsearch中通过索引(index)、类型(type)、文档(document)、字段来定位查找内容。一个Elasticsearch集群可以包括多个索引(数据库),也就是说,其中包含了很多类型(表),这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互可以使用Java API,也可以使用 HTTP 的RESTful API方式。
应用场景
在上一节的内容中,我们谈到基于 HBase 的存储方案并没有解决数据的 高效检索 问题。在实际应用中,经常有根据特定的几个字段进行组合后检索的应用场景,而 HBase 采用 rowkey 作为一级索引,不支持多条件查询,如果要对库里的非 rowkey 进行数据检索和查询,往往需要通过 MapReduce 等分布式框架进行计算,时间延迟上会比较高,难以同时满足用户对于复杂条件查询和高效率响应这两方面的需求。
为了既能支持对数据的高效查询,同时也能支持通过条件筛选进行复杂查询,需要在HBase上构建二级索引,以满足对应的需要。在本案中我们采用Elasticsearch存储 HBase 的索引信息,以支持复杂高效的查询功能。
主要查询过程包括:
1)在Elasticsearch中存放用于检索条件的数据,并将rowkey 也存储进去;
2)使用Elasticsearch的 API 根据组合标签的条件查询出rowkey的集合;
3)使用上一步得到的 rowkey 去HBase数据库查询对应的结果
HBase存储数据的索引放在Elasticsearch中,实现了数据和索引的分离。在Elasticsearch中documentid
是文档的唯一标识,在HBase中rowkey
是记录的唯一标识。在工程实践中,两者可同时选用用户在平台上的唯一标识(如userid或deviceid)作为rowkey或documentid,进而解决 HBase 和 Elasticsearch 索引关联的问题。
下面通过使用 Elasticsearch 解决用户人群计算和分析应用场景的案例来了解这一过程。
对汇聚后的用户标签表dw.userprofile_userlabel_map_all
中的数据进行清洗,过滤掉一些无效字符,达到导入Elasticsearch的条件,如图所示:
然后将dw.userprofile_userlabel_map_all
数据写入Elasticsearch 中,Scala代码如下:
object HiveDataToEs {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.AppName("EsData")
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.config("spark.dynamicAllocation.enabled"