flink 使用 ParameterTool 读取外部配置文件,在算子中访问配置(全局变量)

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

说明

使用 ParameterTool 读取外部配置文件,在算子中访问配置,有下面两种方式

方式一

通过算子的构造方法,将 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 Std1 {

    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(configTool))
                .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>> {
        private ParameterTool configTool;

        public FlatMapFunImpl(ParameterTool configTool) {
            this.configTool = configTool;
        }

        @Override
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
            if(configTool.has("test")){
                System.out.println(getClass().getName()+"配置文件参数:"+configTool.get("test"));
            }
            String[] arr = value.split(",");
            for(String item : arr){
                Tuple2<String, Integer> temp = Tuple2.of(item, 1);
                out.collect(temp);
            }

        }
    }

}

测试

--config d:/flink.properties

方式二

将 ParameterTool 对象注册到 Flink 全局变量,在算子中使用

package std;

import org.apache.flink.api.common.functions.RichFlatMapFunction;
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 Std2 {

    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();
        // 注册全局变量,在 Rich函数中可以获取
        env.getConfig().setGlobalJobParameters(configTool);
        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<>("kafka2flink", new SimpleStringSchema(), pro);
        return fkc;
    }
    static class FlatMapFunImpl extends RichFlatMapFunction<String, Tuple2<String, Integer>> {

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

            ParameterTool configTool = (ParameterTool)getRuntimeContext().getExecutionConfig().getGlobalJobParameters();

            if(configTool.has("test")){
                System.out.println(getClass().getName()+"配置文件参数:"+configTool.get("test"));
            }
            String[] arr = value.split(",");
            for(String item : arr){
                Tuple2<String, Integer> temp = Tuple2.of(item, 1);
                out.collect(temp);
            }

        }
    }

}

原文出处:/show_1IX4bxHt442i.html