Spark/Flink广播实现作业配置动态更新

Flink 动态配置(参数 算子 CEP) 1.方式 动态的配置的方式分两种: 第一种就是参数配置,利用nacos配置中心,更新Flink代码里的一些全局参数,从而达到更新规则的目的。 第二种则需要利用groovy脚本语言嵌入java,nacos更新groove脚本,达到动态更新的目的 代码 pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ 阅读详情

前言

在实时计算作业中,往往需要动态改变一些配置,举几个栗子:

  • 实时日志ETL服务,需要在日志的格式、字段发生变化时保证正常解析;
  • 实时NLP服务,需要及时识别新添加的领域词与停用词;
  • 实时风控服务,需要根据业务情况调整触发警告的规则。

那么问题来了:配置每次变化都得手动修改代码,再重启作业吗?答案显然是否定的,毕竟实时任务的终极目标就是7 x 24无间断运行。Spark Streaming和Flink的广播机制都能做到这点,本文分别来简单说明一下。

Spark Streaming的场合

Spark Core内部的广播机制: 广播变量(broadcast variable)的设计初衷是简单地作为只读缓存,在Driver与Executor间共享数据,Spark文档中的原话如下:

Broadcast variables allow the programmer to keep a read-only variable cached on each machine rather than shipping a copy of it with tasks. They can be used, for example, to give every node a copy of a large input dataset in an efficient manner.

也就是说原生并未支持广播变量的更新,所以我们得自己稍微hack一下。直接贴代码吧。

public class BroadcastStringPeriodicUpdater {
    private static final int PERIOD = 60 * 1000;
    private static volatile BroadcastStringPeriodicUpdater instance;
    private Broadcast < String > broadcast;
    private long lastUpdate = 0 L;
    private BroadcastStringPeriodicUpdater() {}
    public static BroadcastStringPeriodicUpdater getInstance() {
        if (instance == null) {
            synchronized(BroadcastStringPeriodicUpdater.class) {
                if (instance == null) {
                    instance = new BroadcastStringPeriodicUpdater();
                }
            }
        }
        return instance;
    }
    public String updateAndGet(SparkContext sc) {
        long now = System.currentTimeMillis();
        long offset = now - lastUpdate;
        if (offset > PERIOD || broadcast == null) {
            if (broadcast != null) {
                broadcast.unpersist();
            }
            lastUpdate = now;
            String value = fetchBroadcastValue();
            broadcast = JavaSparkContext.fromSparkContext(sc).broadcast(value);
        }
        return broadcast.getValue();
    }
    private String fetchBroadcastValue() {}
}

这段代码将字符串型广播变量的更新包装成了一个单例类,更新周期是60秒。在Streaming主程序中,就可以这样使用了:

dStream.transform(rdd - > {
    String broadcastValue = BroadcastStringPeriodicUpdater.getInstance().updateAndGet(rdd.context());
    rdd.mapPartitions(records - > {});
});

这种方法基本上解决了问题,但不是十全十美的,因为广播数据的更新始终是周期性的,并且周期不能太短(得考虑外部存储的压力),从根本上讲还是受Spark Streaming微批次的设计理念限制的。接下来看看Flink是怎样做的。

Flink的场合

Flink中也有与Spark类似的广播变量,用法也几乎相同。但是Flink在1.5版本引入了更加灵活的广播状态(broadcast state),可以视为operator state的一种特殊情况。它能够将一个流中的数据(通常是较少量的数据)广播到下游算子的所有并发实例中,实现真正的低延迟动态更新。

下图来自Data Artisans(被阿里收购了的Flink母公司)的PPT,其中流A是普通的数据流,流B就是含有配置信息的广播流(broadcast stream),也可以叫控制流(control stream)。流A的数据按照keyBy()算子的规则发往下游,而流B的数据会广播,最后再将这两个流的数据连接到一起进行处理。

既然它的名字叫“广播状态”,那么就一定要有与它对应的状态描述符StateDescriptor。Flink直接使用了MapStateDescriptor作为广播的状态描述符,方便存储多种不同的广播数据。示例:

MapStateDescriptor < String, String > broadcastStateDesc = new MapStateDescriptor < > ("broadcast-state-desc", String.class, String.class);

接下来在控制流controlStream上调用broadcast()方法,将它转换成广播流BroadcastStream。controlStream的产生方法与正常数据流没什么不同,一般是从消息队列的某个特定topic读取。

BroadcastStream<String> broadcastStream = controlStream .setParallelism(1) .broadcast(broadcastStateDesc);

然后在DataStream上调用connect()方法,将它与广播流连接起来,生成BroadcastConnectedStream。

BroadcastConnectedStream<String, String> connectedStream = sourceStream.connect(broadcastStream);

最后就要调用process()方法对连接起来的流进行处理了。如果DataStream是一个普通的流,

需要定义BroadcastProcessFunction,反之,如果该DataStream是一个KeyedStream,

就需要定义KeyedBroadcastProcessFunction。

并且与之前我们常见的ProcessFunction不同的是,它们都多了一个专门处理广播数据的方法

processBroadcastElement()。类图如下所示。

下面给出一个说明性的代码示例。

connectedStream.process(new BroadcastProcessFunction < String, String, String > () {
    private static final long serialVersionUID = 1 L;@
    Override
    public void processElement(String value, ReadOnlyContext ctx, Collector < String > out) throws Exception {
        ReadOnlyBroadcastState < String, String > state = ctx.getBroadcastState(broadcastStateDesc);
        for (Entry < String, String > entry: state.immutableEntries()) {
            String bKey = entry.getKey();
            String bValue = entry.getValue();
            // 根据广播数据进行原数据流的各种处理
        }
        out.collect(value);
    }@
    Override
    public void processBroadcastElement(String value, Context ctx, Collector < String > out) throws Exception {
        BroadcastState < String, String > state = ctx.getBroadcastState(broadcastStateDesc);
        // 如果需要的话,对广播数据进行转换,最后写入状态
        state.put("some_key", value);
    }
});

可见,BroadcastProcessFunction的行为与RichCoFlatMapFunction、CoProcessFunction非常相像。其基本思路是processBroadcastElement()方法从广播流中获取数据,进行必要的转换之后将其以键值对形式写入BroadcastState。而processElement()方法从BroadcastState获取广播数据,再将其与原流中的数据结合处理。也就是说,BroadcastState起到了两个流之间的桥梁作用。
最后还有一点需要注意,processElement()方法获取的Context实例是ReadOnlyContext,说明只有在广播流一侧才能修改BroadcastState,而数据流一侧只能读取BroadcastState。这提供了非常重要的一致性保证:假如数据流一侧也能修改BroadcastState的话,不同的operator实例有可能产生截然不同的结果,对下游处理造成困扰。

案例1.spark和flink分别实现作业配置动态更新案例 在实时作业(如 Spark Streaming、Flink 等流处理作业)中,通过外部配置管理系统动态修改配置,无需重启作业,实现配置热更新,灵活应对业务需求变化 阅读详情

相关推荐

Hive/Spark 3.x 与 MaxCompute MapJoin 对比:4 大引擎的适用场景与语法差异

本文深入对比了Hive、Spark 3.x、MaxCompute和Flink四大引擎在MapJoin技术上的实现差异与适用场景。通过分析核心原理、配置参数、语法差异及性能测试数据,帮助开发者根据业务需求选择最优方案,并提供了通用优化技巧与未来发展趋势。MapJoin作为大数据连接操作的关键优化手段,能显著提升大表与小表连接的效率。

congran6617的博客 540

用一个例子告诉你 怎样在spark中创建广播变量

用一个🌰告诉你 怎样在spark中创建广播变量

向热爱自己一样,热爱这个世界。 615

从Kettle PDI到Spark/Flink:一个数据工程师的实战工具箱选择指南

本文为数据工程师提供了从Kettle PDI到Spark/Flink的技术选型指南,详细分析了不同ETL工具在数据规模、实时性要求、团队技术储备等方面的适用场景。通过实战案例和优化技巧,帮助读者根据具体需求选择最合适的工具组合,构建高效的数据处理架构。

weixin_30752699的博客 402

Flink使用广播实现配置动态更新

本着开源的精神将学习成果分享,转载请注明出处。 问题复现 场景 对每条流数据进行关键字检测,对符合条件的消息进行拦截。例如关键字是 java,则消息 java是世界上最优秀的语言就会被拦截。 需求 拦截的关键字不一定是 java,可能需要变更拦截关键词,例如: php。因此关键字必须做到是可配置的。 问题 我们首先想到的是存在数据库或外部传入参数。但又因为该关键词是在算子中作为一个变量,一旦作业启动,想修改关键字不得不停掉作业,然后再重新启动作业。繁琐且不友好,有没有什么可以动态的修改算子.

夫唯不争,故天下莫能与之争。 3550

Flink从入门到精通100篇(十七)-Spark/Flink广播如何实现作业配置动态更新?

前言 在实时计算作业中,往往需要动态改变一些配置,举几个栗子: 实时日志ETL服务,需要在日志的格式、字段发生变化时保证正常解析; 实时NLP服务,需要及时识别新添加的领域词与停用词; 实时风控服务,需要根据业务情况调整触发警告的规则。 那么问题来了:配置每次变化都得手动修改代码,再重启作业吗?答案显然是否定的,毕竟实时任务的终极目标就是7 x 24无...

wenyusuran的专栏 1480

全志T113 Tina5.0开发:(一)添加自己的板级支持包

3.验证 先执行 source build/envsetup.sh ,然后lunch,下图可见9就是我们自己添加的板子。2. 1)修改 t113-evb1.mk重命名为t113-ws_devboard。我使用的spinand,只需要修改openwrt里面的文件即可。以下内容仅作为自己笔记,如果错误欢迎留言指出。修改t113-ws_devboard。

u014428915的博客 1164

flink学习之广播流与合流操作demo

比如lol,每天不断有人再投诉举报,客服根本忙不过来,腾讯内部做了一个判断,只有vip3以上的客户的投诉才会有人工一对一回复,过了一段时间大家都发现vip3才有人工,都开始充钱到vip3,此时人还是很多,于是只有vip4上的客户才能人工回复。demo思想:以上述vip做例子,获取用户不断投诉的id和vip等级, 数据库保存可以享受人工服务的vip等级,该等级可以自行调整(我是随着时间变化主键增大)。但是task10 task9都还是vip=0 ,说明流没有广播,除非此处并行度设置为1。

cclovezbf的博客 884

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 180

19.BroadcastState-动态更新规则配置\需求\数据\代码步骤\代码实现

本文来自:Flink1.12-2021黑马程序员贺岁视频 的学习笔记19.BroadcastState-动态更新规则配置 19.1.需求 19.2.数据 19.3.代码步骤 19.4.代码实现在开发过程中,如果遇到需要下发/广播配置、规则等低吞吐事件流到下游所有task时,就可以使用Broadcast State。Broadcast State是Flink 1.5引入的新特性。下游的task接收这些配置、规则并保存为BroadcastState,将这些配置应用到另一个数据流的计算中。2)实时增加额外字段:如

涂作权的博客 727

ubuntu安装glibc

VSCode 在ubuntu下调试无法打开libc-start.c raise.c等1. 安装glibc2. launch.json中添加路径映射3. 调试 1. 安装glibc apt install glibc-source cd /usr/src/glibc/ sudo tar -xvf glibc-[VERSION].tar.xz 2. launch.json中添加路径映射 "sourceFileMap": { "/build/glibc-S7xCS9": "/usr/src/glib

wq_0708的博客 3万+

Photoscan+Smart3D+CC组合建模实战:如何用三款工具打造高精度实景模型

本文详细介绍了如何整合Photoscan、Smart3D和ContextCapture三款软件,构建高效高精度的实景三维建模工作流。通过利用Photoscan稳健的空三解算、Smart3D精准的刺点优化,以及ContextCapture强大的最终建模能力,该方案能有效应对复杂地形与海量数据,显著提升模型质量与生产效率,适用于测绘、文化遗产数字化等专业领域。

weixin_29230649的博客 104

Spark Streaming/Flink广播实现作业配置动态更新

前言 在实时计算作业中,往往需要动态改变一些配置,举几个栗子: 实时日志ETL服务,需要在日志的格式、字段发生变化时保证正常解析; 实时NLP服务,需要及时识别新添加的领域词与停用词; 实时风控服务,需要根据业务情况调整触发警告的规则。 那么问题来了:配置每次变化都得手动修改代码,再重启作业吗?答案显然是否定的,毕竟实时任务的终极目标就是7 x 24无间断运行。Spark St...

LittleMagic's Blog 980

海思Hi3516CV610--SPI NAND Flash移植实战:从手册到驱动的完整适配

本文详细介绍了海思Hi3516CV610芯片上SPI NAND Flash的移植实战,包括从手册解读到驱动适配的完整流程。以GD5F2GM7UEYIGR Flash为例,重点讲解了关键参数确认、模式选择、时序配置以及U-Boot和Linux内核驱动的具体实现步骤,帮助开发者快速完成Flash移植工作。

weixin_29158413的博客 447

spark 获取广播变量_Spark/Flink广播实现作业配置动态更新

点击上方“zhisheng”,选择“设为星标”后台回复”ffa“可以查看Flink 资料前言在实时计算作业中,往往需要动态改变一些配置,举几个栗子:实时日志ETL服务,需要在日志的格式、字段发生变化时保证正常解析;实时NLP服务,需要及时识别新添加的领域词与停用词;实时风控服务,需要根据业务情况调整触发警告的规则。那么问题来了:配置每次变化都得手动修改代码,再重启作业吗?答案显然是否定...

weixin_39936134的博客 271

基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真

新能源微电网是现代电力系统的重要组成部分,能够有效整合分布式能源(如光伏、风力发电)和储能设备,实现局部区域内的能源高效利用。微电网的运行控制涉及多源能量管理、负荷平衡以及并网/孤岛模式切换等关键问题。基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真,可以帮助研究者验证控制策略的有效性,并优化系统的动态性能和经济性。本项目旨在构建一个完整的新能源微电网模型,包括电源模块、储能模块、负荷模块以及控制器模块,并通过仿真分析其运行特性。

xiaoheshang_123的博客 424

论文必备 - YOLO26统计数据集中大、中、小目标数量,附完整代码和详细使用步骤

数据集是由微软开发维护的大型图像数据集。数据集标注类型对应任务包括物体检测、关键点检测、实例分割、stuff分割(没有特定形状的物体),全景分割人体关键点, 人体密度检测等。官网数据规模和样本特点数据规模大:总共包含32.8万张图像)。其中标注过的图像超过 20 万张,拥有 150 万个目标实例,数据量丰富,能够为模型训练提供充足的信息。类别丰富:包含80个目标类别和91个“stuff”类别。目标类别涵盖了日常生活中常见的各种物体,如人、动物、交通工具、生活用品等;stuff。

Limiiiing的博客 266

Flink(三十六)—— Spark/Flink广播实现作业配置动态更新

前言 在实时计算作业中,往往需要动态改变一些配置,举几个栗子: 实时日志ETL服务,需要在日志的格式、字段发生变化时保证正常解析; 实时NLP服务,需要及时识别新添加的领域词与停用词; 实时风控服务,需要根据业务情况调整触发警告的规则。 那么问题来了:配置每次变化都得手动修改代码,再重启作业吗?答案显然是否定的,毕竟实时任务的终极目标就是7 x 24无间断运行。Spark Streaming和Flink的广播机制都能做到这点,本文分别来简单说明一下。 Spark Strea

weixin_42073629的博客 793

DeepSeek+Dify之一安装部署

DeepSeek添加知识库

yilvyangguang520的博客 1545

Flink/Spark 如何实现动态更新作业配置

Flink/Spark 如何实现动态更新作业配置 由于实时场景对可用性十分敏感,实时作业通常需要避免频繁重启,因此动态加载作业配置(变量)是实时计算里十分常见的需求,比如通常复杂事件处理 (CEP) 的规则或者在线机器学习的模型。尽管常见,实现起来却并没有那么简单,其中最难点在于如何确保节点状态在变更期间的一致性。目前来说一般有两种实现方式: 轮询拉取方式,即作业算子定时检测...

djun0426的博客 979

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spark、Flink 、Big Data、Java实用文章

目录 一、Spark 二、Flink 一、Spark Apache Spark在海致大数据平台中的优化实践 Spark/Flink广播实现作业配置动态更新 Spark面对OOM问题的解决方法及优化总结 Spark 动态资源分配(Dynamic Resource Allocation) 解析 基于SparkStreaming+Kafka+HBase实时点击流案例 H...

嘻哈吼嘿呵的博客 282

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 算法 From on-policy to off-policy
下一篇: 使用 Apache Flink 开发实时 ETL
mylife512
博客等级 码龄10年 1463粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mylife512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值