FlinkSql通用调优策略

历史文章迁移,稍后整理

使用DataGenerator 提前进行压测,了解数据的处理瓶颈、性能测试和消费能力

开启minibatch:"table.exec.mini-batch.enabled", "true"

开启Local+Global 两阶段聚合:"table.exec.mini-batch.enabled", "true"

解决数据倾斜问题:

流式倾斜,开启minibatch

窗口类有界操作,传统的两阶段聚合的方式

数据源分布就不均匀,做reblance

针对大状态开启rocksdb

针对分区无数据导致watermark的窗口等不触发,设置idle

利用paimon做中间存储,既可以做批流复用olap,lookup join 时把全量数据拉到rocksdb并且是分片存的,效率很高,缺点是有延迟,会有join key miss的问题

暴力调优,加内存,调大并行度

设置空闲 State 保留时间 ,看情况,设置不当会影响结果正确性

FlinkSql 可以指定空闲状态(即未更新的状态)被保留的最小时间,当状态中的某个 Key 对应的状态未更新的时间达到阈值时,这条状态会被自动清理

4.2 开启 MiniBatch

Flink 是流式数据处理,没过来一条数据就会被直接处理

MiniBatch 是把流处理变为微批处理的方式,先缓存一定的数据后在触发处理,这样可以减少对 State 的访问、提升吞吐、有效减少输出数据量

但是会牺牲低延迟,对超低延迟要求的场景不建议用,常用在需要聚合的场景,有显著的性能提升

// 开启 miniBatch
configuration.setString("table.exec.mini-batch.enabled", "true");
// 批量输出的间隔时间
configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
// 防止 OOM 设置每个批次最多缓存数据的条数,可以设为 2 万条
configuration.setString("table.exec.mini-batch.size", "20000");

主要是依靠每个 Task 上注册的 Timer 线程(Flink 的定时器)来触发微批,当然了,是需要消耗一定的线程性能 

 4.3 开启 LocalGlobal

其实就是本地聚合(Spark 的 reduceByKey 和 MR 的 Combine),所以开启 LocalGlobal 必须开启 MiniBatch,可以有效解决SUM的那个聚合函数数据倾斜的问题,同时还能优化上游对下游的数据传输、以及下游聚合的压力

// 开启 LocalGlobal
configuration.setString("table.optimizer.agg-phase-strategy", "TWO_PHASE");

如下图,红色和紫色分别代表两个 Key 的数据进行聚合时的效果

 4.4 开启 Split Distinct

LocalGlobal 的方式可以有效解决 SUM 等聚合函数数据倾斜的问题,但是对于 Group 后的 Count ( Distinct )的热点问题没法解决

1. 以前我们手动打散的方案

SELECT a, SUM(cnt)
FROM (
SELECT a, COUNT(DISTINCT b) as cnt
FROM T
GROUP BY a, MOD(HASH_CODE(b), 1024)
)
GROUP BY a

2. FlinkSql 自动实现了这部分功能,只需要我们开启 Split Distinct 参数即可

// 设置参数:(要结合 minibatch 一起使用)
// 开启 Split Distinct
configuration.setString("table.optimizer.distinct-agg.split.enabled", "true");
// 第一层打散的 bucket 数目
configuration.setString("table.optimizer.distinct-agg.split.bucket-num", "1024");

原理如下图,红色和紫色仍然分别代表两个 Key 的数据,但是红色的数据显然很多,但是去重必须同一个 Key 的数据肯定在一个节点,所以压力较大

4.5 Count ( Distinct ) 时可以用 Filter 代替 Case When

我们经常会写这样的 Sql,如下会有 3 个状态实例

SELECT
a,
COUNT(DISTINCT b) AS total_b,
COUNT(DISTINCT CASE WHEN c IN ('A', 'B') THEN b ELSE NULL END) AS AB_b,
COUNT(DISTINCT CASE WHEN c IN ('C', 'D') THEN b ELSE NULL END) AS CD_b
FROM T
GROUP BY a

而 FlinkSql 的优化器可以识别同一唯一键的不同 Filter 参数,三个 COUNT DISTINCT 都作用在 b 列上,我们可以利用 Filter 的这一特性,Flink 可以只使用一个共享状态实例,可减少状态的大小和对状态的访问

SELECT
a,
COUNT(DISTINCT b) AS total_b,
COUNT(DISTINCT b) FILTER (WHERE c IN ('A', 'B')) AS AB_b,
COUNT(DISTINCT b) FILTER (WHERE c IN ('C', 'D')) AS CD_b
FROM T
GROUP BY a

解决数据倾斜、反压问题

lookup join 的优化,避免性能较差的热查询

paimon属于链路的优化,既可以数据重用,重写了lookup join 减少checkpoint压力,缺点是...

FlinkSql window tvf 本身也是一种优化

这些都是通用的,很多时候其实这些方式解决不了,可以根据实际业务去探索某个业务的最佳方式

另外有时基于海量数据和业务要求的时效性和复杂度经常需要用到算子来处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/377313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【力扣】快乐数,哈希集合+快慢指针+数学

快乐数原题地址 方法一:哈希集合 定义函数getNext(n),返回n的所有位的平方和。一直执行ngetNext(n),最终只有2种可能: n停留在1。无限循环且不为1。 证明:情况1是存在的,如力扣的示例一: 接…

怎么加密电脑磁盘?磁盘加密软件哪个好?

磁盘是电脑储存数据的基础工具,可以存放大量数据。为了避免数据泄露,可以使用专业的磁盘加密软件加密保护电脑磁盘。那么,磁盘加密软件哪个好呢?下面我们就来了解一下。 磁盘加锁专家 磁盘加锁专家是一款专业的磁盘加锁软件&…

阅读《极客时间 | Kafka核心技术与实战》(一)【Kafka入门】

阅读《极客时间 | Kafka核心技术与实战》 为什么要学习Kafka消息引擎系统ABC一篇文章带你快速搞定Kafka术语我应该选择哪种Kafka?聊聊Kafka的版本号 为什么要学习Kafka 如果你是一名软件开发工程师的话,掌握 Kafka 的第一步就是要根据你掌握的编程语言去…

使用CMSIS-DSP库进行嵌入式音频信号处理

在嵌入式环境下,使用CMSIS-DSP库进行音频信号处理是一种常见的应用场景。通过CMSIS-DSP库,开发人员可以利用嵌入式系统的处理能力来实现各种数字信号处理(DSP)功能,例如音频滤波、均衡器、噪音消除等。本文将介绍如何在…

C# 中的 out 参数传递

C# 是一种强大的编程语言,它提供了许多功能和特性来帮助开发人员编写高效和可维护的代码。其中,out 参数是 C# 中非常有用的一个特性之一。在本文中,我们将深入探讨 C# 中的 out 参数传递,并介绍它的用法、优势以及一些最佳实践。…

Dataway工具(一个接口竟然可以如此简单的配置出来无需开发任何一行代码,也不需要做任何 Mapping 实体映射绑定。)

基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具,使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布,一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应用共…

Qt环境搭建+简单程序实现

Qt是什么 Qt是一个跨平台的C图形用户界面应用程序框架。 框架的本质就是一群大佬发明的让菜鸡写出来的代码也也比较规范 也就是限制程序员的自由,让程序员写出来的代码规范。 库和框架有相似性。 库是被程序员调用的,(程序员是主体&…

【自动化测试】---Selenium+Java

1.自动化测试分类 接口自动化测试UI自动化测试(移动端自动化测试、Web端自动化测试) 2.选择Selenium作为web自动化工具原因(面试题) 开源免费支持多个浏览器支持多个系统支持多语言Selenium包提供很多供测试使用的API 3.自动化是什…

深入探索 Stable Diffusion:AI图像创新的新纪元

深入探索 Stable Diffusion:AI图像创新的新纪元 介绍 Stable Diffusion 的核心功能和应用场景Stable Diffusion 架构解析深入 Stable Diffusion 的关键组件变分自编码器(VAE)生成对抗网络(GAN)注意力机制优化算法数据集…

#Z0463. 巡逻1

Description 在一个地区中有 n 个村庄,编号为 1, 2, ..., n。有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其 他任一个村庄。每条道路的长度均为 1 个单位。 为保证该地区的…

超实用的GPT使用三个明星技巧!

在我们对ChatGPT的基础能力有了一定的了解之后,我们就要开始在ChatGPT的基础上探索更多的可能性。 而ChatGPT本身的问题也很多,ChatGPT在使用上最大也最明显的革命,其实是对自然语言的处理能力,抛开太多专业性的术语,你…

漏电流的检测要求和理解

漏电流的检测要求和理解 简介漏电流的产生和效应标准要求漏电流的试验漏电流与电磁兼容的关系小结 简介 漏电流是指非功能性电流,是非期望的会引起安全方面危险的电流。漏电流表明了设备中电气绝缘起到防电击作用具有的性能,以使穿过电气绝缘的电流控制…

linux中dup/dup2/fcntl函数的简单使用

dup函数: 作用:复制文件描述符 原型:int dup(int oldfd); oldfd是要复制的文件描述符 函数返回值: 成功返回最小且未被占用的文件描述符 失败返回-1 newfd dup(int oldfd); 注意:在调用dup函数时&#xff0c…

零基础学编程从哪里入手,编程实例分享,配件进出库管理系统软件

零基础学编程从哪里入手,编程实例分享,配件进出库管理系统软件 一、前言 对于刚学编程的人来说,多看看现有的软件实例对自己学开发软件是很有帮助的。 下面分享的实例以配件进出库管理系统软件为例说明。 软件文件下载可以点击最下方官网…

Qwen-VL 技术报告总结

感谢如此优秀的开源工作,仓库链接 Qwen-VL 权重分为 Qwen-VL && Qwen-VL-Chat,区别文档稍后介绍 训练过程 在第一阶段中主要使用224X224分辨率训练,训练数据主要来源是公开数据集,经过清洗,数据总量大约是1.4B,中文数据…

canvas实现涂鸦画板功能

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

高考志愿填报模拟系统的功能和技术总结

一、金秋志愿高考志愿填报系统主要功能: 用户注册与登录:允许学生和家长注册账号,使用注册的账号登录系统。 个人信息管理:允许用户查看、修改个人信息,如姓名、性别、联系方式等。 高考成绩输入:学生输…

《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)

文章目录 1.1 MySQL 概览:版本、特性和生态系统1.1.1 基础知识1.1.2 重点案例1.1.3 拓展案例 1.2 安装和配置 MySQL1.2.1 基础知识1.2.2 安装步骤1.2.3 重点案例1.2.4 拓展案例 1.3 基础命令和操作1.3.1 基础知识1.3.2 重点案例1.3.3 拓展案例 1.1 MySQL 概览&#…

STM32的分类和选型

F系列(主要用于普通应用) STM32F0xx:低成本、低功耗,适用于成本敏感和低功耗的应用。STM32F1xx:中低端微控制器,具有丰富的外设和良好的性能。STM32F2xx:高性能微控制器,适用于要求…

【C语言】位与移位操作符详解

目录 1.⼆进制和进制转换 ①十进制:生活中最常用 ②二进制:计算机中使用的,每个数字称为一个比特 ③八进制、十六进制也如上 ④二进制转十进制 ⑤十进制转二进制 ⑥二进制转八进制 ⑦二进制转十六进制 2.原码、反码、补码 3.移位操…