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://xiahunao.cn/news/2773897.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

GEE入门篇|栅格数据集概述(四):其他卫星产品

目录 1.甲烷数据集 2.天气及气候数据 3.预先分类的土地用途和土地覆盖数据集 3.1ESA WorldCover 3.2 全球森林变化数据集 卫星还可以收集有关气候、天气和大气中存在的各种化合物的信息。这些卫星利用部分电磁频谱,以及不同物体和化合物在不同波长的阳光照射下…

CUDA简介

CPUGPU异构计算 GPU计算并不是指单独的GPU计算,而是指CPUGPU的异构计算。一块单独的GPU是无法独立的完成所有计算任务的,它必须在CPU的调度下才能完成特定的任务。CPU更适合进行逻辑复杂低并行的程序,GPU更适合逻辑简单高并行的任务。这主要…

101. 对称二叉树 - 力扣(LeetCode)

题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 题目示例 输入:root [1,2,2,3,4,4,3] 输出:true 解题思路 首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点! 对于…

Github进不去的解决方法

方案一: 很多人想进入GIthub却总是出现下面的情况,一直转圈圈 这是因为中国大陆是没有Github的服务器的,需要跳到国外的服务器,这个时候需要加速器,或者是选择路劲最佳的路由,这里我介绍一款软件Watt Toolkit 在你们的微软商城里面就可以找到,这个是免费的推荐使用一下 一键加速…

NC6X单点登录设计文档说明

前言 因为业务场景需要,第三方系统有些工作需要经常到NC系统里做,如果每次去NC系统做业务单据,都需要反复登录,导致客户使用体验不是很好,所以需要开发实现从第三方系统单点登录到NC系统,提高客户满意度。 …

【c语言】深入理解指针(2)

1. 字符指针变量 可以利用字符指针存放字符数组来间接存放字符串。 int main() {char arr[10] "abcdef";char* p arr;printf("p %s\n", p);return 0; } 那我们可不可以直接给字符指针存放字符串呢? int main() {char* p1 "abcde…

【C#】.net core 6.0 创建默认Web应用,以及默认结构讲解,适合初学者

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…

Octave实现位置式PID算法

由于Matlab不让用,只能“你不让爷用,爷就用别的”,选择开源的Octave以及scilab进行相关领域的学习。Octave的代码和Matlab几乎是100%相同的,只有一些专用的包的函数,可能有些还没来得及写,或者有些差异。但…

计算机网络概念、组成、功能和分类

文章目录 概要1.怎么学习计算机网络2.概念3.功能、组成4.工作方式、功能组成5.分类 概要 概念、组成、功能和分类 1.怎么学习计算机网络 2.概念 通信设备:比如路由器、路由器 线路:将系统和通信设备两者联系的介质之类的 计算机网络是互连的、自治的的计…

如何用DT浏览器建立视频播放系统

在DT浏览器官方网站下载最新版软件,安装,在DT浏览器首页点视频直播,软件会自动检测手机相册里的视频并且显示出来,选择需要播放的视频在直播间里播放。如果要建立节目单,需要在服务器上把播放顺序,视频名称…

一起玩儿物联网人工智能小车(ESP32)——57. SPI总线协议初探(一)

摘要:介绍SPI总线的基本知识 前面已经学习过IIC总线协议,今天开始介绍另一个总线协议——SPI。SPI(Serial Peripheral Interface,串行外设接口)是由Motorola提出的一种高速、全双工、同步的通信总线。并且在芯片的管脚…

Oracle 面试题 | 17.精选Oracle高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

(每日持续更新)jdk api之ObjectInputFilter.Status基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

市场复盘总结 20240207

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 二进三: 进级率中 75% 最常用…

JavaScript中call、apply、bind方法的应用与区别

在JavaScript中,call、apply和bind是函数的三个重要方法,它们虽然功能不同,但都可以用来改变函数的执行上下文或者传递参数。本文将分别介绍call、apply和bind方法的应用和区别,并附带示例代码。 一、call方法 call方法的作用是…

移动光猫gs3101超级密码及改桥接模式教程

文章目录 超级管理员账号改桥接模式路由器连接光猫,PPPOE拨号即可!附录:如果需要改桥接的话不知道拨号密码咋办打开光猫Telnet功能Telnet 登录 参考文章 移动光猫吉比特GS3101超级账号获取更改桥接 移动光猫gs3101超级密码及改桥接模式教程 …

分享一下 uniapp 打包安卓apk

首先需要安装 Java 环境,这里就不做解释了 第二步:打开 mac 终端 / cmd 命令行工具 使用keytool -genkey命令生成证书 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore *testalias 是证书别名&am…

华大基因PMseq病原微生物高通量基因检测产品耐药数据库持续

23年肺炎支原体感染的患者数量持续上升,与此同时,由肺炎支原体感染引发的住院患者数量也在迅速增加。这就导致近期儿科和发热门诊都处于床位爆满状态。而在疑难危重的肺炎患者中,肺炎支原体的检出率也在不断提高。华大基因PM Online线上数据管…

ELAdmin 的 CRUD

数据表结构 弄个测试的数据表,不同类型的几个字段,表名位 mp_reply。 生成代码 ELAdmin 可以自动生成代码。 左侧目录系统工具–代码生成,点开以后可以看到上面创建的数据表mp_reply,点击配置。 进入的页面内容有两部分&#…

【Linux笔记】缓冲区的概念到标准库的模拟实现

一、缓冲区 “缓冲区”这个概念相信大家或多或少都听说过,大家其实在C语言阶段就已经接触到“缓冲区”这个东西,但是相信大家在C语言阶段并没有真正弄懂缓冲区到底是个什么东西,也相信大家在C语言阶段也因为缓冲区的问题写出过各种bug。 其…