如何在flink中传递参数

向Flink传递自定义参数的3种方式(withParameters、setGlobalJobParameters、ParameterTool) 目录1. devBase\WithParameters.scala2. devBase\GlobalJobParameters.scala3. devBase\ParameterToolTest.scala 1. devBase\WithParameters.scala package devBase import org.apache.flink.api.common.functions.RichMapFunction import org.apache.flink.api.scala.{DataSet 阅读详情

如何在flink中传递参数

众所周知,flink作为流计算引擎,处理源源不断的数据是其本意,但是在处理数据的过程中,往往可能需要一些参数的传递,那么有哪些方法进行参数的传递?在什么时候使用?这里尝试进行简单的总结。

  • 使用configuration

  在main函数中定义变量

复制代码

1 // Class in Flink to store parameters
2 Configuration configuration = new Configuration();
3 configuration.setString("genre", "Action");
4 
5 lines.filter(new FilterGenreWithParameters())
6         // Pass parameters to a function
7         .withParameters(configuration)
8         .print();

复制代码

  使用参数的function需要继承自一个rich的function,这样才可以在open方法中获取相应的参数。

复制代码

 1 class FilterGenreWithParameters extends RichFilterFunction<Tuple3<Long, String, String>> {
 2 
 3     String genre;
 4 
 5     @Override
 6     public void open(Configuration parameters) throws Exception {
 7         // Read the parameter
 8         genre = parameters.getString("genre", "");
 9     }
10 
11     @Override
12     public boolean filter(Tuple3<Long, String, String> movie) throws Exception {
13         String[] genres = movie.f2.split("\\|");
14 
15         return Stream.of(genres).anyMatch(g -> g.equals(genre));
16     }
17 }

复制代码

 

  • 使用ParameterTool

使用configuration虽然传递了参数,但显然不够动态,每次参数改变,都涉及到程序的变更,既然main函数能够接受参数,flink自然也提供了相应的承接的机制,即ParameterTool。

如果使用ParameterTool,则在参数传递上如下

复制代码

 1 public static void main(String... args) {
 2     // Read command line arguments
 3     ParameterTool parameterTool = ParameterTool.fromArgs(args);
 4     
 5 final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
 6 env.getConfig().setGlobalJobParameters(parameterTool);
 7 ...
 8 
 9 // This function will be able to read these global parameters
10 lines.filter(new FilterGenreWithGlobalEnv())
11                 .print();
12 }

复制代码

如上面代码,使用parameterTool来承接main函数的参数,通过env来设置全局变量来进行分发,那么在继承了rich函数的逻辑中就可以使用这个全局参数。

复制代码

 1 class FilterGenreWithGlobalEnv extends RichFilterFunction<Tuple3<Long, String, String>> {
 2 
 3     @Override
 4     public boolean filter(Tuple3<Long, String, String> movie) throws Exception {
 5         String[] genres = movie.f2.split("\\|");
 6         // Get global parameters
 7         ParameterTool parameterTool = (ParameterTool) getRuntimeContext().getExecutionConfig().getGlobalJobParameters();
 8         // Read parameter
 9         String genre = parameterTool.get("genre");
10 
11         return Stream.of(genres).anyMatch(g -> g.equals(genre));
12     }
13 }

复制代码

 

  • 使用broadcast变量

在上面使用configuration和parametertool进行参数传递会很方便,但是也仅仅适用于少量参数的传递,如果有比较大量的数据传递,flink则提供了另外的方式来进行,其中之一即是broadcast,这个也是在其他计算引擎中广泛使用的方法之一。

复制代码

 1 DataSet<Integer> toBroadcast = env.fromElements(1, 2, 3);
 2 // Get a dataset with words to ignore
 3 DataSet<String> wordsToIgnore = ...
 4 
 5 data.map(new RichFlatMapFunction<String, String>() {
 6 
 7     // A collection to store words. This will be stored in memory
 8     // of a task manager
 9     Collection<String> wordsToIgnore;
10 
11     @Override
12     public void open(Configuration parameters) throws Exception {
13         // Read a collection of words to ignore
14         wordsToIgnore = getRuntimeContext().getBroadcastVariable("wordsToIgnore");
15     }
16 
17 
18     @Override
19     public String map(String line, Collector<String> out) throws Exception {
20         String[] words = line.split("\\W+");
21         for (String word : words)
22             // Use the collection of words to ignore
23             if (wordsToIgnore.contains(word))
24                 out.collect(new Tuple2<>(word, 1));
25     }
26     // Pass a dataset via a broadcast variable
27 }).withBroadcastSet(wordsToIgnore, "wordsToIgnore");

复制代码

在第3行定义了需要进行广播的数据集,在第27行指定了将此数据集进行广播的目的地。

广播的变量会保存在tm的内存中,这个也必然会使用tm有限的内存空间,也因此不能广播太大量的数据。

那么,对于数据量更大的广播需要,要如何进行?flink也提供了缓存文件的机制,如下。

  • 使用distributedCache

首先还是需要在定义dag图的时候指定缓存文件:

复制代码

1 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
2 
3 // Register a file from HDFS
4 env.registerCachedFile("hdfs:///path/to/file", "machineLearningModel")
5 
6 ...
7 
8 env.execute()

复制代码

flink本身支持指定本地的缓存文件,但一般而言,建议指定分布式存储比如hdfs上的文件,并为其指定一个名称。

使用起来也很简单,在rich函数的open方法中进行获取。

复制代码

 1 class MyClassifier extends RichMapFunction<String, Integer> {
 2 
 3     @Override
 4     public void open(Configuration config) {
 5       File machineLearningModel = getRuntimeContext().getDistributedCache().getFile("machineLearningModel");
 6       ...
 7     }
 8 
 9     @Override
10     public Integer map(String value) throws Exception {
11       ...
12     }
13 }

复制代码

上面的代码忽略了对文件内容的处理。

在上面的几个方法中,应该说参数本身都是static的,不会变化,那么如果参数本身随着时间也会发生变化,怎么办?

嗯,那就用connectStream,其实也是流的聚合了。

  • 使用connectStream

使用ConnectedStream的前提当然是需要有一个动态的流,比如在主数据之外,还有一些规则数据,这些规则数据会通过Restful服务来发布,假如我们的主数据来自于kafka,

那么,就可以如下:

复制代码

1 DataStreamSource<String> input = (DataStreamSource) KafkaStreamFactory
2                 .getKafka08Stream(env, srcCluster, srcTopic, srcGroup);
3 
4 DataStream<Tuple2<String, String>> appkeyMeta = env.addSource(new AppKeySourceFunction(), "appkey")
5 
6 ConnectedStreams<String, Tuple2<String, String>> connectedStreams = input.connect(appkeyMeta.broadcast());
7 
8 DataStream<String> cleanData = connectedStreams.flatMap(new DataCleanFlatMapFunction())

复制代码

其实可以看到,上面的代码中做了四件事,首先在第1行定义了获取主数据的流,在第4行定义了获取规则数据的流,在AppKeySourceFunction中实现了读取Restful的逻辑,

在第6行实现了将规则数据广播到主数据中去,最后在第8行实现了从connectedStream中得到经过处理的数据。其中的关键即在于DataCleanFlatMapFunction。

复制代码

1 public class DataCleanFlatMapFunction extends RichCoFlatMapFunction<String, Tuple2<String, String>, String>{
2 
3 public void flatMap1(String s, Collector<String> collector){...}
4 
5 public void flatMap2(Tuple2<String, String> s, Collector<String> collector) {...}
6 
7 
8 }

复制代码

这是一段缩减的代码,关键在于第一行,首先这个函数需要实现RichCoFlatMapFunction这个抽象类,其次在类实现中,flatMap2会承接规则函数,flatMap1会承接主函数。

 

 

当然,参数可以从client发送到task,有时候也需要从task发回到client,一般这里就会使用accumulator。

这里先看一个简单的例子,实现单词的计数以及处理文本的记录数:

复制代码

 1 DataSet<String> lines = ...
 2 
 3 // Word count algorithm
 4 lines.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
 5     @Override
 6     public void flatMap(String line, Collector<Tuple2<String, Integer>> out) throws Exception {
 7         String[] words = line.split("\\W+");
 8         for (String word : words) {
 9             out.collect(new Tuple2<>(word, 1));
10         }
11     }
12 })
13 .groupBy(0)
14 .sum(1)
15 .print();
16 
17 // Count a number of lines in the text to process
18 int linesCount = lines.count()
19 System.out.println(linesCount);

复制代码

上面的代码中,第14行实现了单词的计算,第18行实现了处理记录的行数,但很可惜,这里会产生两个job,仅仅第18行一句代码,就会产生一个job,无疑是不高效的。

flink提供了accumulator来实现数据的回传,亦即从tm传回到JM。

flink本身提供了一些内置的accumulator:

  • IntCounter, LongCounter, DoubleCounter – allows summing together int, long, double values sent from task managers
  • AverageAccumulator – calculates an average of double values
  • LongMaximum, LongMinimum, IntMaximum, IntMinimum, DoubleMaximum, DoubleMinimum – accumulators to determine maximum and minimum values for different types
  • Histogram – used to computed distribution of values from task managers

首先需要定义一个accumulator,然后在某个自定义函数中来注册它,这样在客户端就可以获取相应的的值。

复制代码

 1 lines.flatMap(new RichFlatMapFunction<String, Tuple2<String, Integer>>() {
 2 
 3     // Create an accumulator
 4     private IntCounter linesNum = new IntCounter();
 5 
 6     @Override
 7     public void open(Configuration parameters) throws Exception {
 8         // Register accumulator
 9         getRuntimeContext().addAccumulator("linesNum", linesNum);
10     }
11 
12     @Override
13     public void flatMap(String line, Collector<Tuple2<String, Integer>> out) throws Exception {
14         String[] words = line.split("\\W+");
15         for (String word : words) {
16             out.collect(new Tuple2<>(word, 1));
17         }
18         
19         // Increment after each line is processed
20         linesNum.add(1);
21     }
22 })
23 .groupBy(0)
24 .sum(1)
25 .print();
26 
27 // Get accumulator result
28 int linesNum = env.getLastJobExecutionResult().getAccumulatorResult("linesNum");
29 System.out.println(linesNum);

复制代码

当然,如果内置的accumulator不能满足需求,可以自定义accumulator,只需要继承两个接口之一即可,Accumulator或者SimpleAccumulato。

 

上面介绍了几种参数传递的方式,在日常的使用中,可能不仅仅是使用其中一种,或许是某些的组合,比如通过parametertool来传递hdfs的路径,再通过filecache来读取缓存。

 

分类: flink

好文要顶 关注我 收藏该文  

boiledwater
关注 - 0
粉丝 - 8

+加关注

Flink获取外部传递参数的两种方式 目录 一、前言 二、实现 2.1 通过参数方式直接传递 2.2 通过配置文件来获取参数值 一、前言 在Spark或者Flink中,我们会对接Kafka,Kafka的参数比较多,如果我们希望通过灵活的方式修改参数,而不是把参数值硬编码到代码中,那么可以通过以下两种方式。 二、实现 我们可以使用Java的内置工具类ParameterTool.get()的方式获取传递的参数值 2.1 通过参数方式直接传递 /** * 从args中获取参数值 * 工具类:org.apac. 阅读详情

相关推荐

如何在Flink中传递参数

在大数据领域中,Apache Flink是一个快速、可扩展的流处理和批处理框架。在Flink应用程序中,经常需要传递参数来配置任务的行为或指定输入输出路径等信息。本文将介绍如何在Flink中传递参数,并提供相应的源代码示例。通过命令行参数或配置文件,我们可以轻松地传递参数给Flink应用程序。除了命令行参数,Flink还支持使用配置文件来传递参数。上述示例通过加载名为"config.properties"的配置文件,获取参数的值。类来解析命令行参数。在Flink应用程序中,可以使用命令行参数来传递参数。

BugCrusher的博客 785

Flink传递参数给函数

Flink传递参数给函数

南风知我意 397

Flink命令行提交时参数的传递

flink 外部参数传递

chanyue123的博客 1524

flink传递参数给函数

官网地址batch 可以使用构造函数或withParameters(Configuration)方法将参数传递给函数。这些参数将作为功能对象的一部分进行序列化,并交付给所有并行任务实例。 另请参阅有关如何将命令行参数传递给函数的最佳实践指南。 一、使用构造函数方式 DataSet<Integer> toFilter = env.fromElements(1, 2, 3); toFilter.filter(new MyFilter(2)); private static class

lixinkuan的博客 2591

Flink 如何解析与传递参数

几乎所有的 Flink 应用程序(包括批处理与流处理程序)都需要依赖外部配置参数。例如,可以用来指定输入和输出源(如路径或者地址),系统参数(并发数,运行时配置)以及应用程序特定参数(通常用在自定义函数中)。从 0.9 版本开始,Flink 提供了一个叫 ParameterTool 的简单程序,提供一些基础的工具来解决上述问题,当然你也可以不用这里描述的 ParameterTool,你可以使用其他框架,例如,、在 Flink 中也是支持的。...

SmartSi 776

AI大模型应用性能核心指标:TTFT 与 TPOT 详解

这两个指标专门衡量大模型流式响应性能,是评估用户体验的关键指标。· 是什么:从请求到第一个输出的等待时间· 为什么重要:决定用户的第一印象和响应感知· 优化方向:模型加载、预处理、冷启动优化· 行业标准:最好<500ms,可接受<1.5s· 是什么:每个输出token的平均生成时间· 为什么重要:决定流式输出的流畅度和总完成时间· 优化方向:推理引擎、内存带宽、批处理优化· 行业标准:最好<50ms/token,可接受<100ms/token在Dify/大模型应用中的意义。

lovehu6686的博客 3973

flink 传参 启动_如何在flink中传递参数

众所周知,flink作为流计算引擎,处理源源不断的数据是其本意,但是在处理数据的过程中,往往可能需要一些参数的传递,那么有哪些方法进行参数的传递?在什么时候使用?这里尝试进行简单的总结。使用configuration在main函数中定义变量1 //Class in Flink to store parameters2 Configuration configuration = newConfigu...

weixin_42311349的博客 2107

Flutter加载本地HTML的优雅解决方案:轻松实现富文本展示

通过以上步骤,我们实现了Flutter加载本地HTML的完整流程,并简单介绍了如何通过WebView与HTML页面进行交互。HTML文件作为一种灵活、易维护的富文本展示方式,能有效提升Flutter应用的内容呈现能力。这种方法在展示新闻、资讯或帮助文档等内容时非常有用,能够让开发者灵活调整内容的样式和排版。希望这篇文章能对你在Flutter开发中的HTML加载有所帮助!

四楼没电梯的专栏 3644

Flink DataSet参数传递

该笔记专栏内容与 github/flink-advanced 同步,源码与 github/flink-advanced 同步 实际开发过程中我们需要在整个任务运行过程中传递自定义参数 。官方文档,文章内容源码 Dataset定义: trait Parameters extends MainApp { val env = ExecutionEnvironment.getExecutionEnvi...

2.wa 728

LIGGGHTS开源离散元仿真:从基础安装到高级应用实战

本文详细介绍了LIGGGHTS开源离散元仿真软件的基础安装、脚本编写及高级应用实战。从颗粒自由落体模拟到工业级复杂系统建模,涵盖CFD-DEM耦合、高性能计算优化等关键技术,帮助用户快速掌握这一强大的颗粒仿真工具。特别适合需要处理颗粒系统仿真的科研人员和工程师。

l1k9j8h7g6的博客 620

Matplotlib图片尺寸调整全攻略:从figsize到savefig的实战技巧

在数据可视化与科学计算中,图形尺寸控制是影响图表可读性与专业度的基础环节。其核心原理在于协调逻辑尺寸(英寸)与物理输出(像素)的映射关系,这直接决定了信息呈现的清晰度与布局合理性。从技术价值看,精准的尺寸控制能提升图表在不同媒介(如学术论文、报告、网页)中的适配性,避免显示不全、模糊失真等常见问题。在应用场景上,无论是Jupyter Notebook中的交互探索、自动化报告的批量生成,还是满足严格出版要求的插图制作,都需要掌握对应的尺寸调整策略。本文聚焦于matplotlib中的figsize参数、rcPa

weixin_30899023的博客 330

flink中和数据共享和参数传递

Flink中参数传递和数据共享 众所周知,flink作为流计算引擎,处理源源不断的数据是其本意,但是在处理数据的过程中,往往可能需要一些参数的传递,那么有哪些方法进行参数的传递?在什么时候使用?这里尝试进行简单的总结。 使用configuration   在main函数中定义变量 // Class in Flink to store parameters Configuration configuration = new Configuration(); configuration.setStrin

Baron_ND的博客 4860

超临界二氧化碳再热再压缩布雷顿循环建模与先进控制

超临界二氧化碳布雷顿循环建模与先进控制研究 本文研究了超临界二氧化碳再热再压缩布雷顿循环系统的建模与控制。通过MATLAB/Simscape构建了包含压缩机、透平、回热器等关键组件的动态模型,并设计了基于模型预测控制(MPC)和自抗扰控制(ADRC)的多层控制策略。系统采用转速控制的压缩机、阀门开度控制的透平,以及可变热源加热器,实现了全动态分析。研究结果表明,MPC与ADRC混合控制方案相较于传统PID控制,功率超调降低至0.9%,效率波动控制在±0.08%,扰动恢复时间缩短至12秒。

AI的内部世界的博客 342

flink 传参 启动_flink传递参数给函数

参数可以使用构造函数或者withParameters(Configuration)方法传递,参数将会作为函数对象的一部分被序列化并传递到task实例中!官网地址batch1 使用构造函数方式DataSet toFilter = env.fromElements(1, 2, 3);toFilter.filter(new MyFilter(2));private static class MyFilt...

weixin_39788740的博客 827

HX711重量传感器原理图设计,已量产(压力传感器)

最近调通了一款针对家用、物联网场景的重量传感套件,核心用了 HX711 这颗经典的称重 AD 芯片,还加了用户最需要的 “一键校准” 功能 —— 之前帮朋友做家用米桶余量报警时,用户总吐槽校准步骤太繁琐,这次的方案把操作简化到只按一个键,试下来体验好了不少。正好拆解下这套硬件的设计逻辑,供做同类产品的朋友参考。

不脱发的程序猿 369

elevation mapping算法3之使用D435i相机离线或在线订阅点云和tf关系生成高程图

本文主要学习使用D435i相机发出的点云作为高程图的点云输入,如何离线输入点云生成高程图,进一步学习如何在线订阅点云生成高程图。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 3489

flink学习笔记-dataSet参数传递:构造器传递、withParameters传递、全局参数传递。

在dataSet代码当中,经常用到一些参数,我们可以通过构造器的方式传递参数,或者使用withParameters方法来进行参数传递,或者使用ExecutionConfig来进行参数传递 1:使用构造器来传递参数 object FlinkParameter { def main(args: Array[String]): Unit = { val env=ExecutionEnv...

陈同学 1249

UDS自动化测试-Service 0x27(CAPL调用dll实现key计算)

相信读者基于Diagnostic/ISO TP Confighration中cdd、dll文件的测试并不陌生,本文基于其的基础上,介绍在capl中调用内置的函数diagGenerateKeyFromSeed实现27服务解锁,从而进行诊断自动化测试。本文基于4个byte的Seed、16个byte的Key的安全访问,实现27服务的自动化测试。需要加载项目使用的cdd文件,如果没有的情况下可以使用canoe例程中默认的cdd文件。

诊断协议那些事儿's blog 2054

在 Flink 应用程序中传递和使用参数

几乎所有的 Flink 应用程序,包括批处理和流处理,都依赖于外部配置参数,这些参数被用来指定输入和输出源(如路径或者地址),系统参数(并发数,运行时配置)和应用程序的可配参数(通常用在自定义函数中)。 Flink 提供了一个简单的叫做 ParameterTool 的使用工具,提供了一些基础的工具来解决这些问题,当然你也可以不用这里所描述的ParameterTool,使用其他的框架,如:Comm...

magic_kid_2010的专栏 6114

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

DolphinScheduler 传递参数到flink程序中

1. 通过DolphinScheduler 将参数传递到flink 程序中。 2.定义工作流程 3. flink 代码程序:测试代码 package com.wudl.flink.instance; import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.common.functions.RichFilterFunction; import org.apache.flink.api.com

wudonglianga的专栏 2563

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

flink function类传递参数(Passing Parameters to Functions)

flink function类传递参数(Passing Parameters to Functions) MinaLing关注 2019.03.29 14:04:06字数 172阅读 777 在flink的function类中传递参数,对于flink datastream和dataset是不同的,对于dataset,可以通过类构造函数、withParameters(Configurati...

大JAVA解决方案 1638

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

6.flink将命令行参数传递给算子《深入理解flink系列》

很多时候,开发的Flink应用程序都需要依赖于外部配置参数,它们用于指定输入和输出源(如文件路径或服务地址),系统参数(并行性,运行时配置)和特定于应用程序的参数(通常在用户函数中使用)。

懒松鼠Flink 644
上一篇: Flink 从0到1学习 —— Flink 中如何管理配置?
下一篇: flink function类传递参数(Passing Parameters to Functions)
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值