在 Apache Spark 中利用 HyperLogLog 函数实现高级分析

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 预聚合是高性能分析中的常用技术,通过预先聚合降低纬度,从而在查询时大幅减少计算量,提升响应速度。本文介绍了 spark-alchemy 这个开源库中的 HyperLogLog 这一个高级功能,并且探讨它是如何解决大数据中数据聚合的问题。

编译:辰山 阿里巴巴计算平台事业部 EMR 高级开发工程师,目前从事大数据存储方面的开发和优化工作


预聚合是高性能分析中的常用技术,例如,每小时100亿条的网站访问数据可以通过对常用的查询纬度进行聚合,被降低到1000万条访问统计,这样就能降低1000倍的数据处理量,从而在查询时大幅减少计算量,提升响应速度。更高层的聚合可以带来进一步的性能提升,例如,在时间维按天聚合,或者通过站点而不是URL聚合。
本文,我们将介绍 spark-alchemy 这个开源库中的 HyperLogLog 这一个高级功能,并且探讨它是如何解决大数据中数据聚合的问题。首先,我们先讨论一下这其中面临的挑战。

再聚合(Reaggregation)的挑战

预聚合是数据分析领域的一个强大的技术手段,前提就是所要计算的指标是可重聚合的。聚合操作,顾名思义,是满足结合律的,所以很容易引入再聚合操作,因为聚合操作可以再被进一步聚合。Counts 可以在通过 SUM 再聚合,最小值可以通过 MIN 再聚合,最大值也可以通过 MAX 再聚合。而 distinct counts 是特例,无法做再聚合,例如,不同网站访问者的 distinct count 的总和并不等于所有网站访问者的 distinct count 值,原因很简单,同一个用户可能访问了不同的网站,直接求和就存在了重复统计的问题。
Distinct count 的不可再聚合的特性造成了很大的影响,计算 distinct count 必须要访问到最细粒度的数据,更进一步来说,就是计算 distinct count 的查询必须读取每一行数据。

image.png

当这个问题遇上大数据,就会产生新的挑战:计算过程所需的内存和 distinct count 的结果数量是成正比的。近年来,诸如 Apache Spark 的大数据系统以及诸如 Amazon Redshift 的分析型数据库都引入了 distinct count 的近似计算功能——基数估计(cardinality estimation),利用 HyperLogLog(HLL)概率数据结构来实现。在 Spark 中使用近似计算,只需要将 COUNT(DISTINCT x) 替换为 approx_count_distinct(x [, rsd]),其中额外的参数 rsd 表示最大允许的偏差率,默认值为 5%。Databricks 给出的 HLL 性能分析表明,只要最大偏差率大于等于 1%,Spark 的 distinct count 近似计算的运行速度比精确计算高2~8倍。不过,如果我们需要更小的偏差率,近似计算可能会比精确计算耗时更长。
2~8倍的性能提升是相当可观的,不过它牺牲的精确性,大于等于 1% 的最大偏差率在某些场合可能是无法被接受的。另外,2~8倍的性能提升在预聚合所带来的上千倍的性能提升面前也是微不足道的,那我们能做什么?

HyperLogLog 算法回顾

答案其实就在 HyperLogLog 算法本身,Spark 通过 partition 分片执行 MapReduce 实现 HLL 算法的伪代码如下所示:

  1. Map (每个 partition)

    • 初始化 HLL 数据结构,称作 HLL sketch
    • 将每个输入添加到 sketch 中
    • 发送 sketch
  2. Reduce

    • 聚合所有 sketch 到一个 aggregate sketch 中
  3. Finalize

    • 计算 aggregate sketch 中的 distinct count 近似值

值得注意的是,HLL sketch 是可再聚合的:在 reduce 过程合并之后的结果就是一个 HLL sketch。如果我们可以将 sketch 序列化成数据,那么我们就可以在预聚合阶段将其持久化,在后续计算 distinct count 近似值时,就能获得上千倍的性能提升!
另外这个算法还能带来另一个同样重要的好处:我们不再限于性能问题向估算精度妥协(大于等于1%的估算偏差)。由于预聚合能够带来上千倍的性能提升,我们可以创建估算偏差非常低的 HLL sketch,因为在上千倍的查询性能提升面前,我们完全能够接受预聚合阶段2~5倍的计算耗时。这在大数据业务中基本相当于是免费的午餐:带来巨大性能提升的同时,又不会对大部分业务端的用户造成负面影响。

Spark-Alchemy 简介:HLL Native 函数

由于 Spark 没有提供相应功能,Swoop 开源了高性能的 HLL native 函数工具包,作为 spark-alchemy 项目的一部分,具体使用示例可以参考 HLL docs。提供了大数据领域最为齐全的 HyperLogLog 处理工具,超过了 BigQuery 的 HLL 支持。
下图所示为 spark-alchemy 处理 initial aggregation (通过 hll_init_agg), reaggregation (通过 hll_merge) 和 presentation (通过 hll_cardinality)。

image.png

如果你想了解 HLL sketch 的内存使用量,可以遵循这样一个准则,HLL cardinality estimation 精度每提升2倍, HLL sketch 所需内存提升4倍。大部分场景下,数据行数的较少所带来的受益远超过 HLL sketch 带来的额外存储。

error sketch_size_in_bytes
0.005 43702
0.01 10933
0.02 2741
0.03 1377
0.04 693
0.05 353
0.06 353
0.07 181
0.08 181
0.09 181
0.1 96

HyperLogLog 互通性

通过近似计算 distinct count 代替精确计算,并且将 HLL sketch 保存成列式数据,最终的查询阶段可以不再需要处理每一行最细粒度的数据,但是仍旧有一个隐性的需求,那就是使用 HLL 数据的系统需要访问所有最细粒度的数据,这是因为目前还没有工业标准来序列化 HLL 数据结构。大部分实现,例如 BigQuery,使用了不透明的二进制数据,也没有相关文档说明,这使得跨系统互通变得困难。这个互通性的问题极大增加了交互式分析系统的成本和复杂度。
交互式分析系统的一个关键要求是快速的查询响应。而这并不是很多诸如 Spark 和 BigQuery 的大数据系统的设计核心,所以很多场景下,交互式分析查询通过关系型或者 NoSQL 数据库来实现。如果 HLL sketch 不能实现数据层面的互通性,那我们又将回到原点。
为了解决这个问题,在 spark-alchemy 项目里,使用了公开的 存储标准,内置支持 Postgres 兼容的数据库,以及 JavaScript。这样使得 Spark 能够成为全局的数据预处理平台,能够满足快速查询响应的需求,例如 portal 和 dashboard 的场景。这样的架构可以带来巨大的受益:

  • 99+%的数据仅通过 Spark 进行管理,没有重复
  • 在预聚合阶段,99+%的数据通过 Spark 处理
  • 交互式查询响应时间大幅缩短,处理的数据量也大幅较少

总结

总结一下,本文阐述了预聚合这个常用技术手段如何通过 HyperLogLog 数据结构应用到 distinct count 操作,这不仅带来了上千倍的性能提升,也能够打通 Apache Spark、RDBM 甚至 JavaScript。虽然有些难以置信,但通过 HLL sketch 以及 Spark 强大的扩展能力,我们确确实实能够得到这样一份免费的午餐。

原文链接:https://databricks.com/blog/2019/05/08/advanced-analytics-with-apache-spark.html


阿里巴巴开源大数据技术团队成立Apache Spark中国技术社区,定期推送精彩案例,技术专家直播,问答区数个Spark技术同学每日在线答疑,只为营造纯粹的Spark氛围,欢迎钉钉扫码加入!
二维码.JPG

相关实践学习
基于EMR Serverless StarRocks一键玩转世界杯
基于StarRocks构建极速统一OLAP平台
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
相关文章
|
3月前
|
机器学习/深度学习 分布式计算 算法
Spark快速大数据分析PDF下载读书分享推荐
《Spark快速大数据分析》适合初学者,聚焦Spark实用技巧,同时深入核心概念。作者团队来自Databricks,书中详述Spark 3.0新特性,结合机器学习展示大数据分析。Spark是大数据分析的首选工具,本书助你驾驭这一利器。[PDF下载链接][1]。 ![Spark Book Cover][2] [1]: https://zhangfeidezhu.com/?p=345 [2]: https://i-blog.csdnimg.cn/direct/6b851489ad1944548602766ea9d62136.png#pic_center
124 1
Spark快速大数据分析PDF下载读书分享推荐
|
2月前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
108 2
|
21天前
|
存储 JSON 物联网
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
本文我们将聚焦企业最普遍使用的 JSON 数据,分别介绍业界传统方案以及 Apache Doris 半结构化数据存储分析的三种方案,并通过图表直观展示这些方案的优势与不足。同时,结合具体应用场景,分享不同需求场景下的使用方式,帮助用户快速选择最合适的 JSON 数据存储及分析方案。
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
|
28天前
|
存储 大数据 数据挖掘
【数据新纪元】Apache Doris:重塑实时分析性能,解锁大数据处理新速度,引爆数据价值潜能!
【9月更文挑战第5天】Apache Doris以其卓越的性能、灵活的架构和高效的数据处理能力,正在重塑实时分析的性能极限,解锁大数据处理的新速度,引爆数据价值的无限潜能。在未来的发展中,我们有理由相信Apache Doris将继续引领数据处理的潮流,为企业提供更快速、更准确、更智能的数据洞察和决策支持。让我们携手并进,共同探索数据新纪元的无限可能!
81 11
spark3.5.1中内置函数大全
spark3.5.1中内置函数大全
|
3月前
|
弹性计算 分布式计算 Serverless
全托管一站式大规模数据处理和分析Serverless平台 | EMR Serverless Spark 评测
【7月更文挑战第6天】全托管一站式大规模数据处理和分析Serverless平台 | EMR Serverless Spark 评测
23687 42
|
2月前
|
存储 运维 数据处理
Apache Paimon:重塑阿里智能引擎数据处理新纪元,解锁高效存储与实时分析潜能!
【8月更文挑战第2天】探索 Apache Paimon 在阿里智能引擎的应用场景
171 2
|
2月前
|
分布式计算 Hadoop 大数据
大数据处理框架在零售业的应用:Apache Hadoop与Apache Spark
【8月更文挑战第20天】Apache Hadoop和Apache Spark为处理海量零售户数据提供了强大的支持
40 0
|
3月前
|
分布式计算 大数据 Spark
Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享
《Spark大数据处理:技术、应用与性能优化》深入浅出介绍Spark核心,涵盖部署、实战与性能调优,适合初学者。作者基于微软和IBM经验,解析Spark工作机制,探讨BDAS生态,提供实践案例,助力快速掌握。书中亦讨论性能优化策略。[PDF下载链接](https://zhangfeidezhu.com/?p=347)。![Spark Web UI](https://img-blog.csdnimg.cn/direct/16aaadbb4e13410f8cb2727c3786cc9e.png#pic_center)
103 1
Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享
|
2月前
|
分布式计算 Serverless 数据处理
EMR Serverless Spark 实践教程 | 通过 Apache Airflow 使用 Livy Operator 提交任务
Apache Airflow 是一个强大的工作流程自动化和调度工具,它允许开发者编排、计划和监控数据管道的执行。EMR Serverless Spark 为处理大规模数据处理任务提供了一个无服务器计算环境。本文为您介绍如何通过 Apache Airflow 的 Livy Operator 实现自动化地向 EMR Serverless Spark 提交任务,以实现任务调度和执行的自动化,帮助您更有效地管理数据处理任务。
157 0

推荐镜像

更多
下一篇
无影云桌面