MAPREDUCE服务 MRS-Flink SQL逻辑开发建议:拆分distinct聚合优化聚合中数据倾斜
拆分distinct聚合优化聚合中数据倾斜
通过两阶段聚合能消除常规的数据倾斜,但是处理distinct聚合时性能并不好。因为即使启动了两阶段聚合,distinct key也不能combine消除重复值,累加器中仍然包含所有的原始记录。
可以将不同的聚合(例如 COUNT(DISTINCT col))分为两个级别:
第一次聚合由group key和额外的bucket key进行shuffle。bucket key是使用HASH_CODE(distinct_key) % BUCKET_NUM计算的,BUCKET_NUM默认为1024,可以通过table.optimizer.distinct-agg.split.bucket-num选项进行配置。
第二次聚合是由原始group key进行shuffle,并使用SUM聚合来自不同buckets的COUNT DISTINCT值。由于相同的distinct key将仅在同一bucket中计算,因此转换是等效的。bucket key充当附加group key的角色,以分担group key中热点的负担。bucket key使Job具有可伸缩性来解决不同聚合中的数据倾斜/热点。
【示例】
- 资源文件配置:
table.optimizer.distinct-agg.split.enabled: true table.optimizer.distinct-agg.split.bucket-num: 1024
- 查询今天有多少唯一用户登录:
SELECT day, COUNT(DISTINCT user_id) FROM T GROUP BY day
- 自动改写查询:
SELECT day, SUM(cnt) FROM( SELECT day, COUNT(DISTINCT user_id) as cnt FROM T GROUP BY day, MOD(HASH_CODE(user_id), 1024) ) GROUP BY day
- TaurusDB并行查询_TaurusDB内核_TaurusDB并行执行_PQ
- 日志分析_日志结构化_日志格式化
- MapReduce服务_什么是ClickHouse_如何使用ClickHouse
- 免费时序数据库_时序数据库influxdb场景_数据库资源免费领取_实时数据库
- 什么是Spark_如何使用Spark_Spark的功能是什么
- 时序数据库_云数据库GeminiDB Influx接口
- GAUSS(DWS)工具_gsql工具_DataStudio工具_DSC工具
- MapReduce服务_什么是Flink_如何使用Flink
- MRS优势_什么是MRS_MRS功能
- 什么是主机监控_免费云监控_专业监控