flink 使用 ParameterTool 读取外部配置文件

上接:flink 使用 ParameterTool 解析命令行参数

说明

在Flink中,一般从 Kafka 读取数据,计算后,可能将结果保存到 hbase、elastic search 等外部存储介质中

与 springboot 工程类似,需要将连接参数保存到配置文件中,而不是把参数硬编码在代码中

可以通过以下两种方式实现

方式一

参数较少,直接在启动命令后面加参数,然后用 ParameterTool 解析,详见下面链接:
flink 使用 ParameterTool 解析命令行参数

方式二

参数较多,将参数配置到 .properties 文件中,在启动命令后面加 该文件路径的参数,然后用 ParameterTool 解析

例子

package std;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.util.Collector;
import org.apache.kafka.clients.consumer.ConsumerConfig;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

/**
 * 运行时需要指定参数:--config d:/flink.properties
 */
public class ReadConfig {

    public static void main(String[] args) throws Exception {
        ParameterTool pt = ParameterTool.fromArgs(args);
        if(!pt.has("config")){
            throw new FileNotFoundException("没有指定 config 配置文件");
        }
        ParameterTool configTool = ParameterTool.fromPropertiesFile(pt.get("config"));

        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        // 处理
        SingleOutputStreamOperator<Tuple2<String, Integer>> soso = env.addSource(buildKafka(configTool))
                .flatMap(new FlatMapFunImpl())
                .keyBy(value -> value.f0)
                .sum(1);


        soso.print("res:");
        env.execute("myjob");
    }

    private static FlinkKafkaConsumer<String> buildKafka(ParameterTool configTool) throws IOException {

        Properties pro = new Properties();
        if(configTool.has(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG)) {
            pro.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, configTool.get(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG));
        }
        if(configTool.has(ConsumerConfig.GROUP_ID_CONFIG)) {
            pro.setProperty(ConsumerConfig.GROUP_ID_CONFIG, configTool.get(ConsumerConfig.GROUP_ID_CONFIG));
        }
        if(configTool.has(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG)) {
            pro.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, configTool.get(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG));
        }
        // 内置连接器,创建FlinkKafka消费者,需要指定主题、反序列化、kafka配置
        FlinkKafkaConsumer<String> fkc = new FlinkKafkaConsumer<>(configTool.get("topic"), new SimpleStringSchema(), pro);
        return fkc;
    }
    static class FlatMapFunImpl implements FlatMapFunction<String, Tuple2<String, Integer>> {

        @Override
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {

            String[] arr = value.split(",");
            for(String item : arr){
                Tuple2<String, Integer> temp = Tuple2.of(item, 1);
                out.collect(temp);
            }

        }
    }

}

idea 配置如下:

--config d:/flink.properties

原文出处:/show_1IX4bx94AzTP.html