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);
......