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

1.《深入理解Flink核心设计与实践原理》一书作者
2.GitHub 热门项目 fink-boot(800+) 开发者,致力于flink与spring生态集成 3.前上市top咨询公司技术经理,现大厂资深开发
4.证书:软件设计师,Apache kylin管理员
5.方向:java服务端开发,分布式开发,实时计算,大数据开发工程师

参数传递给函数

Flink提供了三种方式来简化将参数传递给用户定义的函数这一过程:使用构造函数或withParameters(Configuration)方法或者ExecutionConfig接口都可以将参数传递给函数。

将命令行参数传递给函数

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

Flink为解决这些问题提供了一个名为ParameterTool的简单实用的参数解析工具类,当然开发者也可不必使用ParameterTool工具类,其他框架(如Commons CLI和argparse4j)的解析参数工具类也可以用在Flink程序中。

1. 读取来自.properties文件

以下方法将读取属性文件并提供键/值对:

import org.apache.flink.api.java.utils.ParameterTool;
import java.io.InputStream;

InputStream propertiesFileInputStream = ParamTemplate.class.getClassLoader().getResourceAsStream("flink-param.properties");

ParameterTool parameter = ParameterTool.fromPropertiesFile(propertiesFileInputStream);

2. 读取命令行参数

当命令行参数符合ParameterTool工具类要求的格式后,便可以正确的解析命令行参数,命令行的格式如"–input file:///mydata --elements 42"之类的参数。

import org.apache.flink.api.java.utils.ParameterTool;
// 输出参数 --input hdfs:///mydata --elements 42
public static void main(String[] args) {
    
    ParameterTool parameter = ParameterTool.fromArgs(args);
}

3. 读取ParameterTool中的值

ParameterTool本身提供多种访问值的方法,以下是部分示例,更多方法可以查看ParameterTool类源码。

ParameterTool parameters = // ...
parameter.getRequired("input");//返回给定键的String类型的值,如果键不存在,则该方法将会失败。

parameter.get("output", "myDefaultValue");//返回给定键的String类型的值,如果键不存在,它将返回给定的默认值"myDefaultValue"。

parameter.getLong("expectedCount", -1L);//返回给定键的Long类型的值,如果键不存在,它将返回给定的默认值-1L,如果该值不是Long类型,则该方法将会失败。

int number=parameter.getNumberOfParameters();//返回ParameterTool中的参数数量。

自此我们就可以直接在应用程序main函数中使用这些方法的返回值,例如可以通过获取命令行参数来设置作业的并行度:

import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

ParameterTool parameters = ParameterTool.fromArgs(args);
int parallelism = parameters.get("mapParallelism", 2);

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(parallelism);
......

猜你喜欢

转载自blog.csdn.net/hbly979222969/article/details/125040035