Flink 消息聚合处理方案

微博机器学习平台使用 Flink 实时处理用户行为日志和生成标签,并且在生成标签后写入存储系统。为了降低存储系统的 IO 负载,有批量写入的需求,同时对数据延迟也需要进行一定的控制,因此需要一种有效的消息聚合处理方案。

在本篇文章中我们将详细介绍 Flink 中对消息进行聚合处理的方案,描述不同方案中可能遇到的问题和解决方法,并进行对比。

基于 flatMap 的解决方案

这是我们能够想到最直观的解决方案,即在自定义的 flatMap 方法中对消息进行聚合,伪代码如下:

640 1.png

对应的作业拓扑和运行状态如下:

640 2.png
640_3

该方案的优点如下:

  1. 逻辑简单直观,各并发间负载均匀。
  2. flatMap 可以和上游算子 chain 到一起,减少网络传输开销。
  3. 使用 operator state 完成 checkpoint,支持正常和改并发恢复。

与此同时,由于使用 operator state,因此所有数据都保存在 JVM 堆上,当数据量较大时有 GC/OOM 风险。

使用 Count Window 的解决方案

对于大规模 state 数据,Flink 推荐使用 RocksDB backend,并且只支持在 KeyedStream 上使用。与此同时,KeyedStream 支持通过 Count Window 来实现消息聚合,因此 Count Window 成为第二个可选方案。

由于需要使用 KeyedStream,我们面临的第一个问题就是如何生成 key。一个比较自然的想法是直接使用随机数,伪代码示例如下:

640_4

对应的作业拓扑如下:

640_5

然而实际上线测试时出现了数据倾斜,不同并发间会出现负载不均,部分 task 接收不到数据从而 TPS 为 0:

640_6

在我们的场景下,除了有批量写入降低 IO 的需求,对数据延迟也需要控制,当 key set 太大时,每个 key 累积指定数据条数的时间将增加,会导致数据写入的延迟增大,因此我们需要控制 key set 的大小。经过分析,当 key set 较小时,Flink 默认的数据分发策略在并发间分布不均,从而导致了上述数据倾斜的问题。下面我们从源码级别对此进行说明。

首先,Flink 为了保证从 state 中恢复数据时产生最小的 IO,引入了 key group 的概念。Key group 数目等于最大并发数(max parallelism),取值范围是 128-32768。当做数据分发的时候,key 会按照规则被分发到 key group 里面,相关代码如下所示:

keyGroup->KeyGroupRangeAssignment.assignToKeyGroup(key,maxParallelism);

640_7

然后,key group 会按照规则被分发到每个 task 上,代码示例如下:

Task->String.valueOf(KeyGroupRangeAssignment.computeOperatorIndexForKeyGroup(maxParallelism, parallelism, keyGroup));

640_8

通过 debug 可以发现,当 key 的数量较小时,该分发策略会导致 key 在 task 之间分配不均匀,测试代码如下:

640_9

输出结果如下:

{0=4, 1=4, 2=1}
{0=651, 1=686, 2=710}

可以看到,当只有 10 个 key 时,并发间分布很不均匀;但当 key 的数量增加到 2048 时,就相对均匀了。

在了解了 key 的分发策略之后,我们可以相应的调整 key 的生成规则,来达到指定并发度和 key set 大小前提下的数据均匀,如下述代码所示:

640_10
640_11

我们利用 maxParallelism 和 parallelism 生成 key,并将其存储到一个大小为 parallelism 的 map 里,以 taskid 作为 map key ,每个 task 对应的 key list 作为 value,来保证每个 taskid 对应的 list 都存储了相同数量的 key。

最后,再将 map 打平,存储到一个数组里。在使用的时候,我们可以从该数组里随机取数来作为key,就能达到平均分配的目的了。

640_12

该方案的执行效果如下:

640_13

可以看到数据倾斜的问题得以解决,每个任务的负载都比较均匀。但需要注意的是由于引入了 key by,因此会有数据 shuffle,对比 flatmap 方案会有额外的网络开销。另外由于生成 key 的规则和实际并发度有关,因此该方案不支持改并发恢复,或者说如果修改并发,那么在 restore 的时候会发生数据错乱的问题,这一点需要尤为注意。

方案对比和总结

最后我们将两种解决方案的优缺点对比总结如下:

640_14

在数据量不大且内存充足的情况下,建议使用 flatmap 方案;在数据量较大且可以保证不修改并发的情况下,建议使用 count window 方案并使用 RocksDB 进行 state数据存储;在数据量较大且需要修改并发的情况下,当前给出的两种方案都无法解决,需要寻求新的解决方案。

作者介绍:

曹富强、张颖,微博机器学习研发中心-系统工程师。现负责微博机器学习平台数据计算模块,主要涉及实时计算 Flink、Storm、Spark Streaming,离线计算 Hive、Spark 等。目前专注于 Flink 在微博机器学习场景的应用。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信“支付”页全国多地上线“出行服务”,已覆盖108城

近期,微信“支付”页面新增“出行服务”入口,作为一站式的出行服务平台,“出行服务”提供覆盖车主服务、公交出行、打车租车等多场景出行服务,目前已经在北京、广东、重庆、黑龙江、山西、福建、湖北、陕西等全国108个地级市上线。…

Flink 新场景:OLAP 引擎性能优化及应用案例

摘要:本文由阿里巴巴技术专家贺小令(晓令)分享,主要介绍 Apache Flink 新场景 OLAP 引擎,内容分为以下四部分: 背景介绍Flink OLAP 引擎案例介绍未来计划一、背景介绍 1.OLAP 及其分类 OLAP 是一种让用户可…

vue 全家桶 - 前端工程化

目录 主要内容1. 模块化相关规范1.1 模块化概述1.2 模块化规范A. 浏览器端的模块化B. 服务器端的模块化C. 大一统的模块化规范 – ES6模块化1.3 体验ES6模块化 - 在 NodeJS 中安装 babel1.3.1 安装 babelA. 安装 babelB. 创建 babel.config.jsC. 创建 index.js 文件D. 使用 npx…

移动端小程序 腾讯地图sdk 当前位置 地址你解析 距离计算

<template><view><!-- 顶部通知栏 --><view v-if"showtime" class"showtime"><wyb-noticeBar:url"guideCallbackUrl"color"#666666":text"[异常处理提醒:, 我为什么不能打卡、我的定位异常应该怎么处…

如何评估一项技术是否值得长期投入

“每个人的时间都是有限的&#xff0c;在有限的时间里选择一项值得投入的技术会变得尤为重要。” 笔者从 2008 年开始工作到现在也有 12 个年头了&#xff0c;一路走来都在和数据打交道&#xff0c;做过很多大数据底层框架内核的开发&#xff08;Hadoop&#xff0c;Pig&#x…

绝了,项目内部源码资源被爆出!网友:请收下我的膝盖!

你好&#xff0c;程序员。多少个清晨&#xff0c;你让阳光肆无忌惮地穿透你精心搭配的格子衬衫&#xff1b;多少个白天&#xff0c;你在疯狂体会需求和 bug &#xff1b;多少个午夜&#xff0c;你任凭无法止步的代码&#xff0c;收割着你的头发在忙碌焦虑中自我否定变成了常态&…

dubbo-go 中如何实现路由策略功能

可在控制面对服务的路由进行精细控制&#xff0c;是一个成熟 RPC 系统必备的能力之一。作为一个逐步走向成熟的 RPC 系统&#xff0c;Apache/dubbo-go&#xff08;以下简称 dubbo-go &#xff09;的最新版本 v1.4 中已经实现了 Condition Router 和 Health Instance First Rout…

JavaScript高级语法打包 - babel插件安装配置报错!Error: Cannot find module ‘@babel/preset-preset.env‘

目录 1. 插件安装和配置2. 运行打包 - 报错信息3. 解决办法1. 插件安装和配置 安装babel转换器相关的包: npm i babel-loader @babel/core @babel/runtime -D安装babel语法插件相关的包: npm i</

H5 微信公众号 授权登录 前后端分离篇(后端02)

文章目录1. 依赖2. 方法1. 依赖 <properties><weixin-java.version>4.2.0</weixin-java.version></properties><dependencies><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</ar…

独家对话谢宝友:做一款类似于 Linux 的国产操作系统 | 人物志

作者 | 郑丽媛来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;从国外操作系统的长期垄断到中国自主研发操作系统数十年的起落浮沉&#xff0c;技术自主创新独立已成为国产基础软件的主要突破口。近几年间&#xff0c;随着物联网时代的到来&#xff0c;以 Linux 为主…

RebatesMe:返利网站DDOS防护

公司介绍 上海途美网络科技有限公司旗下的RebatesMe海淘返利网是一家新兴的专注海淘和海淘返利信息的服务性网站。RebatesMe海淘返利网合作的美国商家接近1000家&#xff0c;包括eBay、亚马逊、沃尔玛、健安喜等等美国线上销售综合商品的商家&#xff0c;为全球用户提供高比例…

Vue 过渡效果的组件

目录 1. 单节点的过渡1.1 应用场景1.2 定义过渡效果的方式1. 单节点的过渡 1.1 应用场景 Vue 提供了标签为 transition 的 内置组件,在: 元素或组件初始渲染时;元素或组件显示/ 隐藏时(使用v-if 或早show 进行条件渲染时);元素或组件切换时。我们可以给任何元素和组件添加…

言图科技:GPU服务器选型

公司简介 言图科技总部位于武汉光谷&#xff0c;致力于人工智能领域的自然语言处理、图像处理基础算法、软件、平台与设备研发。目前&#xff0c;公司拥有成熟的自然语言处理基础软件集、语义理解工具集、知识图谱工具集、智能陪练机器人、聊天机器人、情感与专注度分析工具、…

H5 微信公众号 授权登录 前后端分离篇(前后端联调_03)

文章目录1. 获取code2. 返回报文解析3. 源码1. 获取code 前端请求微信获取code 回调信息 https://open.weixin.qq.com/connect/oauth2/authorize?appidwxd1f5b7f23b72428a&redirect_urihttp%3A%2F%2F192.168.43.122%3A80&response_typecode&scopesnsapi_userin…

集群e家:O2O电商服务平台上云

公司简介 陕西集群物联网服务管理股份有限公司旗下的“集群e家”是专注于社区商圈O2O服务的平台&#xff0c;为社区&#xff08;乡村&#xff09;家庭提供创新的家庭消费服务及消费体验。集群e家智慧生活是以社区&#xff08;乡村&#xff09;为中心&#xff0c;以“互联网”的…

大数据给教育带来怎样的可能?

来源 | 人民数字 Fintech责编 | 晋兆雨头图 | CSDN下载自视觉中国当下&#xff0c;数据成为教学改进最为显著的指标。学生的成绩不好是由于周围环境而分心了吗&#xff1f;期末考试不及格是学生请了太多病假的缘故吗&#xff1f;这些以往不太好回答的问题&#xff0c;如今通过大…

Vue全家桶 - 电商后台管理系统项目开发实录(详)

目录 1. 项目概述1.1 电商项目基本业务概述1.2 电商后台管理系统的功能1.3 电商后台管理系统的开发模式(前、后端分离)2. 项目初始化2.1 前端项目初始化步骤码云相关操作2.2 后台项目的环境安装配置3. 登录 / 退出 功能3.1 登录概述3.2 登录 - token 原理分析3.3 实现登录功能…

才博教育:AI口语学习平台上云

公司简介 北京才博教育科技有限公司自主开发了一套基于AI技术的口语学习工具&#xff0c;服务与英语教育机构。这套口语学习工具旨在于解决英语培训机构在传统英语教学中存在的会看、会写、不会说的问题&#xff0c;基于自主研发的AI人工智能技术&#xff0c;清晰的分辨学习者…

H5 微信公众号 授权登录 前后端分离篇(资料准备+前端01)

实现微信公众号授权登录&#xff0c;很简单&#xff0c;但是注意的地方要细心&#xff0c;小伙伴们跟着我的思路一起实现吧&#xff01; 文章目录一、帐号申请1. 正式账号2. 测试帐号二、微信文档2.1. 文档主页2.2. 授权流程2.3. 授权回调三、前端部分3.1. 登录校验3.2. code获…

SQL分页查询方案的性能对比

作者 | 中国农业银行 吴海存责编 | 晋兆雨头图 | CSDN下载自视觉中国导读本文主要介绍了基于ROWNUM、主键列/非空唯一性列、分析函数、OFFSET-FETCH NEXT机制的几种SQL分页查询方案的性能对比。分页查询可分为逻辑分页和物理分页两种。逻辑分页是应用代码级别实现的分页&#x…