iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Flink 流式聚合性能调优指南
  • 137
分享到

Flink 流式聚合性能调优指南

Flink流式聚合性能调优指南 2017-11-03 20:11:27 137人浏览 绘本
摘要

原文:flink 流式聚合性能调优指南 sql 是数据分析中使用最广泛的语言。Flink Table api 和 SQL 使用户能够以更少的时间和精力定义高效的流分析应用程序。此外,Flink Table API 和 SQL

Flink 流式聚合性能调优指南

原文:flink 流式聚合性能调优指南

sql数据分析中使用最广泛的语言。Flink Table api 和 SQL 使用户能够以更少的时间和精力定义高效的流分析应用程序。此外,Flink Table API 和 SQL 是高效优化过的,它集成了许多查询优化和算子优化。但并不是所有的优化都是默认开启的,因此对于某些工作负载,可以通过打开某些选项来提高性能。

这里将介绍一些实用的优化选项以及流式聚合的内部原理,它们在某些情况下能带来很大的提升。

注意:(1)目前,这里提到的优化选项仅支持 Blink planner。(2)目前,流聚合优化仅支持无界聚合,窗口聚合优化将在未来支持。

默认情况下,无界聚合算子是逐条处理输入的记录,即:(1)从状态中读取累加器,(2)累加/撤回记录至累加器,(3)将累加器写回状态,(4)下一条记录将再次从(1)开始处理。这种处理模式可能会增加 StateBackend 开销(尤其是对于 RocksDB StateBackend )。此外,生产中非常常见的数据倾斜会使这个问题恶化,并且容易导致 job 发生反压。

MiniBatch 聚合
MiniBatch 聚合的核心思想是将一组输入的数据缓存在聚合算子内部的缓冲区中。当输入的数据被触发处理时,每个 key 只需一个操作即可访问状态。这样可以大大减少状态开销并获得更好的吞吐量。但是,这可能会增加一些延迟,因为它会缓冲一些记录而不是立即处理它们。这是吞吐量和延迟之间的权衡。

下图说明了 mini-batch 聚合如何减少状态操作。

Flink 流式聚合性能调优指南
默认情况下 mini-batch 优化是被禁用的。开启这项优化,需要设置选项
table.exec.mini-batch.enabled、
table.exec.mini-batch.allow-latency 和
table.exec.mini-batch.size。

下面的例子显示如何启用这些选项。

// instantiate table environment
TableEnvironment tEnv = ...

// access flink configuration
Configuration configuration = tEnv.getConfig().getConfiguration();
// set low-level key-value options
configuration.setString("table.exec.mini-batch.enabled", "true"); // enable mini-batch optimization
configuration.setString("table.exec.mini-batch.allow-latency", "5 s"); // use 5 seconds to buffer input records
configuration.setString("table.exec.mini-batch.size", "5000"); // the maximum number of records can be buffered by each aggregate operator task
Local-Global 聚合
Local-Global 聚合是为解决数据倾斜问题提出的,通过将一组聚合分为两个阶段,首先在上游进行本地聚合,然后在下游进行全局聚合,类似于 mapReduce 中的 Combine + Reduce 模式。例如,就以下 SQL 而言:

SELECT color, sum(id)
FROM T
GROUP BY color
数据流中的记录可能会倾斜,因此某些聚合算子的实例必须比其他实例处理更多的记录,这会产生热点问题。本地聚合可以将一定数量具有相同 key 的输入数据累加到单个累加器中。全局聚合将仅接收 reduce 后的累加器,而不是大量的原始输入数据。这可以大大减少网络 shuffle 和状态访问的成本。每次本地聚合累积的输入数据量基于 mini-batch 间隔。这意味着 local-global 聚合依赖于启用了 mini-batch 优化。

下图显示了 local-global 聚合如何提高性能。

Flink 流式聚合性能调优指南
下面的例子显示如何启用 local-global 聚合。

// instantiate table environment
TableEnvironment tEnv = ...

// access flink configuration
Configuration configuration = tEnv.getConfig().getConfiguration();
// set low-level key-value options
configuration.setString("table.exec.mini-batch.enabled", "true"); // local-global aggregation depends on mini-batch is enabled
configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
configuration.setString("table.exec.mini-batch.size", "5000");
configuration.setString("table.optimizer.agg-phase-strategy", "TWO_PHASE"); // enable two-phase, i.e. local-global aggregation
拆分 distinct 聚合
Local-Global 优化可有效消除常规聚合的数据倾斜,例如 SUM、COUNT、MAX、MIN、AVG。但是在处理 distinct 聚合时,其性能并不令人满意。

例如,如果我们要分析今天有多少唯一用户登录。我们可能有以下查询:

SELECT day, COUNT(DISTINCT user_id)
FROM T
GROUP BY day
如果 distinct key (即 user_id)的值分布稀疏,则 COUNT DISTINCT 不适合减少数据。即使启用了 local-global 优化也没有太大帮助。因为累加器仍然包含几乎所有原始记录,并且全局聚合将成为瓶颈(大多数繁重的累加器由一个任务处理,即同一天)。

这个优化的想法是将不同的聚合(例如 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 具有可伸缩性来解决不同聚合中的数据倾斜/热点。

拆分 distinct 聚合后,以上查询将被自动改写为以下查询:

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
下图显示了拆分 distinct 聚合如何提高性能(假设颜色表示 days,字母表示 user_id)。

Flink 流式聚合性能调优指南
注意:上面是可以从这个优化中受益的最简单的示例。除此之外,Flink 还支持拆分更复杂的聚合查询,例如,多个具有不同 distinct key (例如 COUNT(DISTINCT a), SUM(DISTINCT b) )的 distinct 聚合,可以与其他非 distinct 聚合(例如 SUM、MAX、MIN、COUNT )一起使用。

注意 当前,拆分优化不支持包含用户定义的 AggregateFunction 聚合。

下面的例子显示了如何启用拆分 distinct 聚合优化。

// instantiate table environment
TableEnvironment tEnv = ...

tEnv.getConfig() // access high-level configuration
.getConfiguration() // set low-level key-value options
.setString("table.optimizer.distinct-agg.split.enabled", "true"); // enable distinct agg split
在 distinct 聚合上使用 FILTER 修饰符
在某些情况下,用户可能需要从不同维度计算 UV(独立访客)的数量,例如来自 Android 的 UV、iPhone 的 UV、WEB 的 UV 和总 UV。很多人会选择 CASE WHEN,例如:

SELECT
day,
COUNT(DISTINCT user_id) AS total_uv,
COUNT(DISTINCT CASE WHEN flag IN ("android", "iphone") THEN user_id ELSE NULL END) AS app_uv,
COUNT(DISTINCT CASE WHEN flag IN ("wap", "other") THEN user_id ELSE NULL END) AS web_uv
FROM T
GROUP BY day
但是,在这种情况下,建议使用 FILTER 语法而不是 CASE WHEN。因为 FILTER 更符合 SQL 标准,并且能获得更多的性能提升。FILTER 是用于聚合函数的修饰符,用于限制聚合中使用的值。将上面的示例替换为 FILTER 修饰符,如下所示:

SELECT
day,
COUNT(DISTINCT user_id) AS total_uv,
COUNT(DISTINCT user_id) FILTER (WHERE flag IN ("android", "iphone")) AS app_uv,
COUNT(DISTINCT user_id) FILTER (WHERE flag IN ("wap", "other")) AS web_uv
FROM T
GROUP BY day
Flink SQL 优化器可以识别相同的 distinct key 上的不同过滤器参数。例如,在上面的示例中,三个 COUNT DISTINCT 都在 user_id 一列上。Flink 可以只使用一个共享状态实例,而不是三个状态实例,以减少状态访问和状态大小。在某些工作负载下,可以获得显著的性能提升。

您可能感兴趣的文档:

--结束END--

本文标题: Flink 流式聚合性能调优指南

本文链接: https://www.lsjlt.com/news/6350.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang性能调优指南
    Golang 是一种由 Google 开发的开源编程语言,以其简洁、高效的特点受到许多开发者的青睐。然而,在开发过程中,为了保证程序的性能和效率,我们有时需要对代码进行调优。本文将介绍...
    99+
    2024-03-06
    性能 调优 golang 数据访问
  • 分布式Golang API的性能调优指南
    优化分布式 golang api 性能的指南:使用协程:协程可以并行执行任务,提高吞吐量和降低延迟。使用 channel:channel 用于协程通信,同步任务和避免锁竞争。缓存响应:缓...
    99+
    2024-05-08
    分布式 golang redis
  • Go语言应用性能调优指南
    Go 语言应用性能调优指南 在生产环境中优化 Go 应用程序的性能对于确保其平稳运行和用户满意度至关重要。本文将提供一份全面的指南,涵盖性能调优的最佳实践、工具和实战案例。 最佳实践 ...
    99+
    2024-05-07
    go语言 性能调优
  • PHP底层系统性能调优指南
    PHP底层系统性能调优指南概述:随着Web应用程序的发展,PHP已经成为最受欢迎的服务器端脚本语言之一。然而,PHP在处理大型、高流量的应用程序时可能会面临性能瓶颈。本文将为你提供一些调优技巧和具体的代码示例,帮助你优化PHP底层系统性能。...
    99+
    2023-11-08
    调优 PHP 系统性能
  • PHP 微服务容器化性能调优指南
    为优化容器化 php 微服务性能,执行以下步骤:镜像优化:使用多阶段构建、移交 php 可执行文件和启用 opcache。资源分配:调整内存和 cpu 限制,以防止资源不足。网络优化:启...
    99+
    2024-05-08
    php 微服务 mysql linux redis
  • MySQL高性能优化指南
    作者:禅与计算机程序设计艺术 1.简介 随着互联网公司网站流量的逐渐增长,数据库服务器的负载也日益增加。如何提升MySQL数据库服务器的性能、节省硬件成本、提升网站的响应速度、节省运营成本是一个重要...
    99+
    2023-10-09
    自然语言处理 人工智能 语言模型 编程实践 开发语言 架构设计
  • C++技术中的调试:性能瓶颈优化指南
    调试 c++++ 性能瓶颈的指南:识别瓶颈:使用分析器、基准测试和日志记录来识别内存泄漏和性能问题。优化内存管理:减少分配、释放未使用的内存,并选择合适的容器。优化代码:遵循健壮原则、避...
    99+
    2024-05-08
    调试 c++
  • PHP 函数性能优化指南
    为了优化 php 函数性能,建议:避免不必要的函数调用。缓存函数调用结果。利用 php 内置扩展。避免传递大数组,可考虑使用引用参数或 json 字符串。通过应用这些最佳实践,可以显著提...
    99+
    2024-04-11
    php 性能优化 redis
  • PHP 性能优化:数据库优化指南
    PHP 性能优化:数据库优化指南 数据库的性能对 PHP 应用程序的整体性能至关重要。通过实施以下最佳实践,可以显著优化数据库性能: 1. 索引优化 创建必要的索引以加速查询。 确保...
    99+
    2024-05-11
    php 数据库优化
  • PHP入门指南:PHP性能优化
    PHP是一种流行的编程语言,特别适合用于构建Web应用程序。然而,随着应用程序的规模不断增大,PHP的性能也成为了一个问题。本篇文章旨在为初学者提供一些有关PHP性能优化的基础知识,帮助他们提高自己的PHP编程水平。使用最新版本的PHPPH...
    99+
    2023-05-21
    PHP 性能优化 入门指南
  • sqlserver性能调优的方式
    本篇内容主要讲解“sqlserver性能调优的方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlserver性能调优的方式”吧!首先搞清楚,性能调优的目标...
    99+
    2024-04-02
  • 性能优化指南:性能优化的一般性原则与方法
    【本文转自博客园 作者:xybaby 原文链接:https://www.cnblogs.com/xybaby/p/9055734.html】作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应...
    99+
    2023-06-05
  • PHP中的性能优化技术指南
    随着网站越来越复杂,PHP程序的性能问题也成为了大多数Web开发人员关注的焦点。为了满足日益增长的访问量,我们需要优化PHP应用程序的性能。下面让我们来了解一些PHP中的性能优化技术。使用缓存缓存是提高PHP应用程序性能的一个重要手段。使用...
    99+
    2023-05-21
    PHP 性能优化 技术指南
  • 摆脱性能瓶颈:ASP 优化指南
    启用 ASP.NET 输出缓存和页面缓存。 使用 Memcached 或 Redis 等内存缓存存储经常访问的数据。 针对 Ajax 调用使用 HTML5 应用程序缓存。 代码优化 尽量减少 ASP.NET 服务器控件的使用。 使用...
    99+
    2024-04-02
  • 数据库性能调优终极指南:让你的数据库达到最佳性能
    数据库性能调优是一项系统性的工作,涉及到数据库的各个方面,包括硬件、软件、网络、操作、设计等。本文将从多个方面探讨如何优化数据库性能,让数据库达到最佳性能。 1. 硬件优化 硬件是数据库性能的基础,包括服务器、存储设备、网络设备等。服务...
    99+
    2024-02-13
    数据库优化 性能调优 索引优化 查询优化 数据结构优化
  • 最佳实践:CentOS搭建web服务器的性能调优指南
    以下是一些CentOS搭建Web服务器的性能调优指南的最佳实践:1. 使用最新的稳定版本:确保你使用的是最新的CentOS版本,并安...
    99+
    2023-10-09
    CentOS
  • Java Swing 性能调优指南:打造响应迅速的应用程序
    Java Swing 应用程序的性能至关重要,因为它影响最终用户的体验。以下指南将提供提高 Swing 应用程序响应速度和整体性能的最佳实践。 避免 GUI 复杂性 尽量减少组件数量和嵌套层级。 使用轻量级组件,例如 JLabel 而不...
    99+
    2024-04-02
  • 提高网站性能的前端优化模式使用指南
    如何利用前端优化模式提升网站性能? 随着互联网的快速发展,网站已经成为人们获取信息、进行交流和娱乐的重要渠道。然而,随着网站内容和功能的不断增加,许多网站开始面临性能问题,比如页面加载缓慢、响应时间延长等。为了提高用户的体验和满...
    99+
    2024-02-03
    提升 网站性能 前端优化模式 前端优化 异步加载 延迟加载
  • 服务器调优技巧:提升服务器性能的终极指南
    一、硬件配置优化 选择合适的处理器 处理器的性能是服务器性能的关键因素之一。在选择处理器时,应考虑处理器的核心数、主频、缓存大小等因素。一般来说,核心数越多、主频越高、缓存越大,处理器的性能就越好。 选择合适的内存 内存是服务器...
    99+
    2024-02-07
    服务器调优 性能提升 内存优化 硬盘优化 网络优化 操作系统优化
  • PHP 性能优化:服务器配置指南
    通过优化服务器配置可以提升 php 应用程序性能,具体措施包括:1. 启用 opcache 以缓存编译过的脚本字节码;2. 优化 php-fpm 设置以提高资源利用率并减少延迟;3. 启...
    99+
    2024-05-10
    php 性能优化 css redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作