一.flinkjob在命令行提交时main方法传参应该怎么写?
二.代码的config.properties和sit.properties的路径应该怎么写?
```java
import org.apache.flink.api.java.utils.ParameterTool;
public class FlinkJobWithMultipleConfigs {
public static void main(String[] args) throws Exception {
//需要在main方法的args传参 envConfig=sit
String envConfig = ParameterTool.fromArgs(args).get("envConfig");
//config.properties 和sit.properties都在项目的src/main/resources文件夹下
ParameterTool parameterTool = ParameterTool.fromPropertiesFile("config.properties");
String envPropertiesFile = parameterTool.get(envConfig);
ParameterTool parameterToolEnv = ParameterTool.fromPropertiesFile(envPropertiesFile);
String hdfsNamenodeHost = parameterToolEnv.get("hdfs_namenode_host");
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
String mysqlHostname = parameterToolEnv.get("mysql_hostname");
}
}
# config.properties的配置信息
```java
sit=sit.properties
uat=uat.properties
prod=prod.properties
# hdfs NN
hdfs_namenode_host=10.206.65.215
# mysql
mysql_url_redmoonoa9_sync=jdbc:mysql://10.206.66.214:3306/redmoonoa9_sync?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8&useServerPrepStmts=false&rewriteBatchedStatements=true
mysql_hostname=10.206.66.214
mysql_port=3306
mysql_database_redmoonoa9_sync= redmoonoa9_sync
mysql_username=root
mysql_password=szc@OS-CLOUD8
会报错找不到config.properties文件,程序启动时不是会默认加载src/main/resources文件夹的文件吗,为什么会报找不到文件的错
Exception in thread "main" java.io.FileNotFoundException: Properties file D:\idea_project\form_sync\config.properties does not exist
ParameterTool parameterTool = ParameterTool.fromPropertiesFile("config.properties");
这里应该怎么写?
之后在linux客户端启动这个flinkjob时
/opt/cloudera/parcels/FLINK/lib/flink/bin/flink run \
-t yarn-per-job \
-d \
-p 1 \
-DenvConfig=sit \ --这里main方法传参应该怎么写?还是涉及到config.properties和sit.properties配置文件应该怎么设置
...
-c com.lhjsdt.flink.sync.FlinkJobWithMultipleConfigs \
/opt/cloudera/parcels/FLINK/lib/flink/jobs/form_sync-1.0-SNAPSHOT.jar
看到你提的问题了。文件路径的问题,简单点这么来看,ParameterTool.fromPropertiesFile("test.config")
内部调用的是File("/test.config")
。你可以简单的写一段代码,看看执行效果如下:
public static void main(String[] args) {
File file = new File("test.config");
System.out.println(file.getAbsolutePath());
file = new File("/test.config");
System.out.println(file.getAbsolutePath());
}
输出结果你可以知道为啥你写的
//config.properties 和sit.properties都在项目的src/main/resources文件夹下
ParameterTool parameterTool = ParameterTool.fromPropertiesFile("config.properties");
会报错找不到文件 Exception in thread "main" java.io.FileNotFoundException: Properties file D:\idea_project\form_sync\config.properties does not existD:\idea_project\form_sync\
这个是你项目路径。因为你传入的是相对路径,是相对的是当前工作目录,所以会返回这个地址D:\idea_project\form_sync\config.properties
。你可以写绝对路径,但是有个问题部署目录和你代码有严重的依赖。既然你传入文件对象有这样的问题,那么你可以考虑换一个方式提供数据读取,正好 ParameterTool
类提供了 fromPropertiesFile(InputStream inputStream)
。可以采用Class.getResourceAsStream(String name)
方法来获取文件流。当然这里面也有区别,具体你可以查一下。或者直接看我的代码里的写法。Flink 一次打包多个环境运行
直接给你说答案吧~ ParameterTool parameterTool = ParameterTool.fromPropertiesFile(FlinkJobWithMultipleConfigs.getResourceAsStream("/config.properties"));
在使用命令行提交Flink job时,可以通过在main方法中传递参数来实现。在命令行中,参数应该以空格分隔,并且在程序名称之后传递。
例如,如果你的Flink job的main方法如下所示:
public class MyFlinkJob {
public static void main(String[] args) throws Exception {
// 处理传递的参数
String arg1 = args[0];
String arg2 = args[1];
// 根据传递的参数执行具体的逻辑
// 执行Flink job
...
}
}
那么在命令行中提交时,可以这样传递参数:
flink run -c com.example.MyFlinkJob /path/to/your/flink/job.jar arg1 arg2
其中,-c参数指定了要运行的类,/path/to/your/flink/job.jar是Flink job的jar包路径,arg1和arg2是要传递的参数。
注意,参数的数量和顺序要与程序中的接收参数的顺序相匹配。另外,如果参数中含有空格或特殊字符,可以使用引号将其括起来,以确保参数传递正确。
在代码中指定config.properties和sit.properties的路径需要注意以下几点:
根据你的代码示例,可以将以下代码添加到main方法中以指定正确的路径:
String configPath = "config.properties";
String sitConfigPath = "sit.properties";
ParameterTool parameterTool = ParameterTool.fromPropertiesFile(configPath);
ParameterTool sitParameterTool = ParameterTool.fromPropertiesFile(sitConfigPath);
请根据实际的文件路径进行相应的修改,确保代码能够找到正确的配置文件。