本文已收录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,也可以使用 HTTPRESTful 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", "false").config("es.index.auto.create", "true").config("es.nodes", "10.xx.xx.xx").config("es.batch.write.retry.count", "3")    // 默认重试3次.config("es.batch.write.retry.wait", "5")   // 每次重试等待时间为5秒.config("thread_pool.write.queue_size", "1000").config("thread_pool.write.size", "50").config("thread_pool.write.type", "fixed")   .config("es.batch.size.bytes", "20mb")  .config("es.batch.size.entries", "2000")  .config("es.http.timeout","100m").enableHiveSupport().getOrCreate()val data_date  = args(0).toStringimport spark.sqlval hiveDF = sql(s"""| SELECT userid, tagsmap FROM dw.userprofile_userlabel_map_all where data_date = '${data_date}'""".stripMargin)    // dw.userprofile_userlabel_map_all 是聚合用户标签的表val rdd = hiveDF.rdd.map {row => {val userid = row.getAs[String]("userid")val userlabels = row.getAs[Map[String, Object]]("userlabels")Map("userid" -> userid, "userlabels" -> userlabels)}}EsSpark.saveToEs(rdd , "userprofile/tags", Map[String,String]("es.mApping.id"->"userid")   spark.stop()}
}

工程依赖如下:

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch-hadoop</artifactId><version>6.4.2</version>
</dependency>

将该工程打包之后提交任务,传入日期分区参数 “20190101”执行。提交命令“spark-submit--class com.example.HiveDataToEs--master yarn--deploy-mode client--executor-memory 2g--num-executors 50--driver-memory 3g--executor-cores 2 spark-hive-to-es.jar 20190101”

任务执行完毕后,当日 userid 维度的用户标签数据全部导入Elasticsearch中。使用RESTfulAPI查询包含某个标签的用户量,可实时得到返回结果。

# 查询命令
GET userprofile/tags/_search
{"size":0,"aggs": {"tagcounts": {"terms": {"field": "tags.ACTION_U_01_003"}}}
}


        从返回结果中可以看到,用户总量(total)为100000000人,包含标签“ACTION_U_01_003”的用户有2500000人(doc_count)。

查询人群 index 查看标签总量:

# 查询命令
GET userprofile/_search
{"query":{"match_all": {}}
}

查询结果如图所示:

        在人群的计算和分析场景中,经过产品的迭代,前期采用 Impala 进行计算,一般耗费几十秒到几分钟的时间,在使用 Elasticsearch 后,实现了对人群计算的秒级响应。

工程化案例

下面通过一个工程案例来讲解实现画像产品中“用户人群”和“人群分析”功能对用户群计算秒级响应的一种解决方案。

在每天的 ETL 调度中,需要将 Hive 计算的标签数据导入Elasticsearch中。如图所示,在标签调度完成且通过校验后(图中的“标签监控预警”任务执行完成后),将标签数据同步到Elasticsearch中。


        在与 Elasticsearch 数据同步完成并通过校验后,向在 MySQL 中维护的状态表中插入一条状态记录,表示当前日期的 Elasticsearch 数据可用,线上计算用户人群的接口则读取最近日期对应的数据。如果某天因为调度延迟等方面的原因,没有及时将当日数据导入Elasticsearch中,接口也能读取最近一天对应的数据,是一种可行的灾备方案。

例如,数据同步完成后向MySQL状态表“elasticsearch_state”中插入记录(如图所示),当日数据产出正常时,state字段为“0”,产出异常时为“1”。图3-29中1月20日导入的数据出现异常,则“state”状态字段置1,线上接口扫描该状态记录位后不读取1月20日数据,而是取用最近的1月19日数据。


        为了避免从 Hive 向 Elasticsearch 中灌入数据时发生数据缺失,在向状态表更新状态位前需要校验 Elasticsearch 和 Hive 中的数据量是否一致。下面通过Python脚本来看数据校验逻辑

# 查询Hive中的数据
def monitor_hive_data(data_date):hive_user = " select count(1) from dw.userprofile_userlabel_map_all where data_date='{}' ".format(data_date)user_count = os.popen("hive -S -e \"" + hive_user + "\"").read().strip()return user_count# 查询es中的数据
def monitor_es_data(data_date):userid_search = "curl http://10.xxx.xxx.xxx:9200/_cat/count/" + data_date + "_userid/"userid_num = str(os.popen(userid_search).read()).split(' ')[-1].strip()return userid_num# 比较Hive和es中的数据,如通过校验,更新MySQL状态位
def update_es_data(data_date):'''data_date: 查询数据日期'''esdata = monitor_es_data(data_date)    # 查询es中的数据hivedata = monitor_hive_data(data_date)  # 查询Hive中的数据print("esdata ======>{}".format(esdata))print("hivedata ======>{}".format(hivedata))# 更新MySQL状态位 if (esdata[0] == hivedata[0] ):db = MySQLdb.connect(host="10.xx.xx.xx", port=3306, user="username", passwd="password",db="userprofile", charset="utf8")cursor = db.cursor()try:select_command = "INSERT INTO `elasticsearch_state` VALUES ('"+ str(data_date) +"', 'elasticsearch', '0', '2');"cursor.execute(select_command)db.commit()except Exception as e:db.rollback()exit(1)

上面介绍了在工程化调度流中何时将Hive中的用户标签数据灌入Elasticsearch中,之后业务人员在画像产品端计算人群或透视分析人群时(如图所示),

通过RESTful API访问 Elasticsearch 进行计算

小结

结合前面几期文章,分别为大家讲解了使用 Hive、MySQL、HBase 和 Elasticsearch 存储标签数据的解决方案,包括:Hive存储数据相关标签表、人群计算表的表结构设计以及ID-Mapping的一种实现方式;MySQL存储标签元数据、监控数据及结果集数据;HBase存储线上接口实时调用的数据;Elasticsearch存储标签用于人群计算和人群多维透视分析。存储过程中涉及如下相关表。

  • dw.userprofile_attritube_all:存储人口属性维度的标签表;
  • dw.userprofile_action_all:存储行为属性维度的标签表;
  • dw.userprofile_consume_all:存储用户消费维度的标签表;
  • dw.userprofile_riskmanage_all:存储风险控制维度的标签表;
  • dw.userprofile_social_all:存储社交属性维度的标签表;
  • dw.userprofile_userlabel_map_all:汇聚用户各维度标签的表;
  • dw.userprofile_usergroup_labels_all:存储计算后人群数据的表。

好了,本篇文章就到这里,更多干货文章请关注我的公众号。你知道的越多,你不知道的也越多。我是Alice,我们下一期见!

用户画像 | 标签数据存储之Elasticsearch真实应用相关推荐

  1. 用户画像标签数据存储之Elasticsearch存储

    目录 0. 相关文章链接 1. Elasticsearch简介 2. 应用场景 3. 工程化案例 4. 用户画像标签数据存储总结 注:此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一 ...

  2. 用户画像 | 标签数据存储之MySQL真实应用

    本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者 ...

  3. 用户画像 | 标签数据存储之HBase真实应用

    本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者 ...

  4. 用户画像 | 标签数据存储之Hive真实应用

    本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者 ...

  5. 用户画像标签数据存储之MySQL存储

    目录 0. 相关文章链接 1. 元数据管理 2. 监控预警数据 2.1. 标签计算数据监控 2.2. 服务层同步数据监控 2.3. 结果集存储 注:此博文为根据 赵宏田 老师的 用户画像·方法论与工程 ...

  6. 用户画像标签数据存储之Hive存储

    目录 0. 相关文章链接 1. Hive数据仓库 2. 分区存储 3. 标签汇聚 4. ID-Mapping 注:此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一书读后笔记而来,仅供 ...

  7. 用户画像标签数据开发之组合标签计算

    目录 0. 相关文章链接 1. 什么是组合标签计算 2. 应用场景 3. 数据计算 注:此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一书读后笔记而来,仅供学习使用 0. 相关文章链 ...

  8. 用户画像标签数据开发之标签相似度计算

    目录 0. 相关文章链接 1. 什么是标签相似度计算 2. 案例场景 3. 数据开发 注:此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一书读后笔记而来,仅供学习使用 0. 相关文章 ...

  9. 用户画像标签数据开发之用户特征库开发

    目录 0. 相关文章链接 1. 什么是用户特征库 2. 特征库规划 3. 数据开发 4. 其他特征库规划 注:此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一书读后笔记而来,仅供学习 ...

最新文章

  1. 如何在Spring和Spring MVC项目中进行测试
  2. 锋利的jQuery--关于$(document).ready()函数及jQuery代码风格
  3. pyspark distinct代码示例
  4. App-V 4.6中文版首测体验
  5. POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》
  6. 判断表达式值是否为空_如何在 Python 中判断列表是否为空
  7. 微信公众号服务器模式,微信公众平台的两种模式
  8. JavaScript:Functions
  9. java m e 获取公钥_Java如何生成公钥和私钥?
  10. git pull使用【转】
  11. 快速排序算法--两个小人扔萝卜
  12. Win11桌面便签小工具下载 支持与手机同步的桌面便签工具下载
  13. 熵的性质:可加性和强可加性
  14. 无PS只需几步操作轻松改变图片尺寸大小,而且一点都不失真!
  15. 手把手教你用UNet做医学图像分割系统
  16. 樊登读书会掌控读后感_在樊登读书会读《掌控习惯》(读后感)
  17. moss2007安装部署历程 .
  18. linux怎么创建牡蛎_牡蛎的意思
  19. 中易浏览器(enjoyie) v3.0.1.15 完整绿色版 免费
  20. 【TensorFlowKeras】基于卷积神经网络CNN的猫狗分类

热门文章

  1. 【新观点】孙悟空其实是太上老君炼的丹药变成的
  2. 怎么让上下两排对齐_如何快速调整WORD里上下两行名字对齐 - 卡饭网
  3. 电脑桌面有HTML一直删除不了,程序员电脑桌面是什么样的? 网友: IE浏览器必删, 不能留!...
  4. 学习笔记:Recyclerview、SwipeRefreshLayout、Cardview的使用
  5. OSChina 周六乱弹 —— 下次又带妹子来吃猪蹄了
  6. FPV入坑前传(20211227)(未完)
  7. iCloud如何只清理本地缓存而不删除云端文件
  8. 打开设备管理器的快捷方式
  9. 一文彻底搞懂MySQL基础:B树和B+树的区别
  10. 企业微信可以取消实名认证吗?如何操作