【Flink】获取配置参数方式总结

一、背景

以前写的比较多的是spark,传入外部参数,通常有两种方法:
1、用main方法传入,代码中通过args获取(基本上只要是个java程序,就可以通过这种方式来传参)

2、通过--conf 传入一个spark开头的key的配置,代码中通过sparkConf来获取对应的value(这个是spark独有的特性)

那么flink如何读取properties,又如何读取外部传入的参数呢?

二、正文

1、main方法传入

这个其实不用多说,就是:

flink run -m yarn-cluster -yjm 2048 -ytm 2048 -c 运行的主类 执行的jar包.jar 参数1 参数2

然后上图的参数1和参数2,其实就是main方法中args[0]和args[1],其实你可以直接

  public static void main(String[] args) throws Exception {
        String hostName = args[0];
        int port = Integer.parseInt(args[1]);

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> dataStreamSource =
                env.socketTextStream(hostName, port);
        dataStreamSource.print();
        env.execute("print");
    }

但是这样的话,如果少传了一个参数,就会报空指针,或者传参顺序有问题,就会导致解析异常

所以flink提供了一个ParameterTool类,可以直接通过这个类来获取传入的keyvalue对

因此我们可以如下使用:

flink run -m yarn-cluster -yjm 2048 -ytm 2048 -c 运行的主类 执行的jar包.jar -host.name master-1 -port 9999 
public static void testFromArgs(String[] args) {
        ParameterTool tool = ParameterTool.fromArgs(args);
        String hostName = tool.get("host.name", "-");
        String port = tool.getRequired("port");
        System.out.println("=================" + hostName 
                + ":" + port + "==================");
    }

2、读取磁盘上的配置文件

ParameterTool还提供了读取properties文件的能力

大家有兴趣可以稍微扫一眼,底层实现非常简单,就是FileInputStream读取一个Flie,然后把这个input流load到properties里,然后再转换成ParameterTool

其实自己实现个io流读取文件也ok的,比如读取个hdfs或者对象存储上的文件(oss或者s3),这样更新配置就更新文件然后重启flink程序就行

配置文件如下:

max_value=10000
test_value=guaguagua

代码如下:

    public static void testFromProperties() {
        try {
            ParameterTool tool = ParameterTool.fromPropertiesFile("/root/conf/application.properties");
            String maxValue = tool.get("max_value", "-");
            String testValue = tool.getRequired("test_value"); //必填参数
            System.out.println("=================" + maxValue 
                    + ":" + testValue + "==================");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3、jar包里的资源文件

这个说的就是resource目录下的配置文件

没什么好说的直接上代码

配置文件和上面一样key=value的格式,区别就是放在resource目录下,会被打进jar包里(这样修改了配置文件就要重新打包)

import java.io.InputStream;
import java.util.Properties;

public class AnotherProperties {
    Properties properties;
    public synchronized Properties getKafkaProperties() {
        if (null != properties) {
            return properties;
        }
        //获取配置文件kafka.properties的内容
        Properties kafkaProperties = new Properties();
        try {
            //InputStream in = ClassLoader.getSystemResourceAsStream("kafka.properties");
            InputStream in = this.getClass().getResourceAsStream("/kafka.properties");
            kafkaProperties.load(in);
            System.out.println("========"+kafkaProperties.getProperty("bootstrap.servers")+"========");
            System.out.println("========"+kafkaProperties.getProperty("ssl.truststore.location")+"========");
        } catch (Exception e) {
            //没加载到文件,程序要考虑退出
            e.printStackTrace();
        }
        properties = kafkaProperties;
        return kafkaProperties;
    }
}
 public static void main(String[] args) throws Exception {
        AnotherProperties anotherProperties = new AnotherProperties();
        Properties kafkaProperties = anotherProperties.getKafkaProperties();

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> dataStreamSource =
                env.socketTextStream("master-1", 9999);
        dataStreamSource.print();
        env.execute("print");
    }

嗯嗯,大概就是这样,大家如果还有什么其他方式,你正在用,而且也觉得不错的话,欢迎给我评论留言!!

又是时隔好久没写博客,虽然没有强制要求自己,但是从数据分析的角度来看,我基本上是月更

(虽然最近写博客频率不高,但是其实我有在其他地方写或者总结一些学到的或者做过的事情)

好了,短文一篇,菜鸡一只,如果有什么说错的地方,欢迎大家批评支持,坚决改正!!拜了个拜~

今天可能因为包侧面的拉链没拉上,导致我下午要坐地铁去动车站的时候,发现身份证不见了,回不去上海了,哭了!等五一回老家补办把~(心疼自己)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值