众所周知,flink作为流计算引擎,处理源源不断的数据是其本意,但是在处理数据的过程中,往往可能需要一些参数的传递,那么有哪些方法进行参数的传递?在什么时候使用?这里尝试进行简单的总结。
使用configuration
在main函数中定义变量
1 //Class in Flink to store parameters
2 Configuration configuration = newConfiguration();3 configuration.setString("genre", "Action");4
5 lines.filter(newFilterGenreWithParameters())6 //Pass parameters to a function
7 .withParameters(configuration)8 .print();
使用参数的function需要继承自一个rich的function,这样才可以在open方法中获取相应的参数。
1 class FilterGenreWithParameters extends RichFilterFunction>{2
3 String genre;4
5 @Override6 public void open(Configuration parameters) throwsException {7 //Read the parameter
8 genre = parameters.getString("genre", "");9 }10
11 @Override12 public boolean filter(Tuple3 movie) throwsException {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 voidmain(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