一、背景
以前写的比较多的是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");
}
嗯嗯,大概就是这样,大家如果还有什么其他方式,你正在用,而且也觉得不错的话,欢迎给我评论留言!!
又是时隔好久没写博客,虽然没有强制要求自己,但是从数据分析的角度来看,我基本上是月更
(虽然最近写博客频率不高,但是其实我有在其他地方写或者总结一些学到的或者做过的事情)
好了,短文一篇,菜鸡一只,如果有什么说错的地方,欢迎大家批评支持,坚决改正!!拜了个拜~
今天可能因为包侧面的拉链没拉上,导致我下午要坐地铁去动车站的时候,发现身份证不见了,回不去上海了,哭了!等五一回老家补办把~(心疼自己)