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

本文涉及的产品
EMR Serverless Spark 免费试用,1000 CU*H 有效期3个月
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

相关文章
|
28天前
|
人工智能 自然语言处理 数据挖掘
Apache Doris 4.0 AI 能力揭秘(一):AI 函数之 LLM 函数介绍
在即将发布的 Apache Doris 4.0 版本中,我们正式引入了一系列 LLM 函数,将前沿的 AI 能力与日常的数据分析相结合,无论是精准提取文本信息,还是对评论进行情感分类,亦或生成精炼的文本摘要,皆可在数据库内部无缝完成。
80 0
Apache Doris 4.0 AI 能力揭秘(一):AI 函数之 LLM 函数介绍
|
6月前
|
存储 SQL Apache
为什么 Apache Doris 是比 Elasticsearch 更好的实时分析替代方案?
本文将从技术选型的视角,从开放性、系统架构、实时写入、实时存储、实时查询等多方面,深入分析 Apache Doris 与 Elasticsearch 的能力差异及性能表现
489 17
为什么 Apache Doris 是比 Elasticsearch 更好的实时分析替代方案?
|
3月前
|
人工智能 运维 监控
Aipy实战:分析apache2日志中的网站攻击痕迹
Apache2日志系统灵活且信息全面,但安全分析、实时分析和合规性审计存在较高技术门槛。为降低难度,可借助AI工具如aipy高效分析日志,快速发现攻击痕迹并提供反制措施。通过结合AI与学习技术知识,新手运维人员能更轻松掌握复杂日志分析任务,提升工作效率与技能水平。
|
10月前
|
消息中间件 数据挖掘 Kafka
Apache Kafka流处理实战:构建实时数据分析应用
【10月更文挑战第24天】在当今这个数据爆炸的时代,能够快速准确地处理实时数据变得尤为重要。无论是金融交易监控、网络行为分析还是物联网设备的数据收集,实时数据处理技术都是不可或缺的一部分。Apache Kafka作为一款高性能的消息队列系统,不仅支持传统的消息传递模式,还提供了强大的流处理能力,能够帮助开发者构建高效、可扩展的实时数据分析应用。
482 5
|
7月前
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
149 0
|
11月前
|
SQL 分布式计算 Serverless
EMR Serverless Spark:一站式全托管湖仓分析利器
本文根据2024云栖大会阿里云 EMR 团队负责人李钰(绝顶) 演讲实录整理而成
545 58
|
10月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
10月前
|
监控 Cloud Native BI
8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
飞轮科技正式推出 Apache Doris 和 SelectDB 精选案例集 ——《走向现代化的数据仓库(2024 版)》,汇聚了来自各行各业的成功案例与实践经验。该书以行业为划分标准,辅以使用场景标签,旨在为读者提供一个高度整合、全面涵盖、分类清晰且易于查阅的学习资源库。
356 8
|
存储 JSON 物联网
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
本文我们将聚焦企业最普遍使用的 JSON 数据,分别介绍业界传统方案以及 Apache Doris 半结构化数据存储分析的三种方案,并通过图表直观展示这些方案的优势与不足。同时,结合具体应用场景,分享不同需求场景下的使用方式,帮助用户快速选择最合适的 JSON 数据存储及分析方案。
419 15
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
|
11月前
|
分布式计算 大数据 Apache
利用.NET进行大数据处理:Apache Spark与.NET for Apache Spark
【10月更文挑战第15天】随着大数据成为企业决策和技术创新的关键驱动力,Apache Spark作为高效的大数据处理引擎,广受青睐。然而,.NET开发者面临使用Spark的门槛。本文介绍.NET for Apache Spark,展示如何通过C#和F#等.NET语言,结合Spark的强大功能进行大数据处理,简化开发流程并提升效率。示例代码演示了读取CSV文件及统计分析的基本操作,突显了.NET for Apache Spark的易用性和强大功能。
282 1

推荐镜像

更多