flinkjob在命令行提交时main方法传参和配置文件路径怎么写

遇到的问题

一.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

sit.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 exist
D:\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的路径需要注意以下几点:

  1. 确保config.properties和sit.properties文件存在于项目的src/main/resources文件夹下。
  2. 如果config.properties和sit.properties位于同一目录下,则可以直接使用文件名进行引用,无需指定路径。
  3. 如果config.properties和sit.properties位于不同的目录下,可以使用相对路径或绝对路径进行引用。
  4. 如果使用相对路径,可以使用"./"表示当前目录,例如"./config.properties"。
  5. 如果使用绝对路径,可以使用完整的文件路径进行引用,例如"C:/project/config.properties"。

根据你的代码示例,可以将以下代码添加到main方法中以指定正确的路径:

String configPath = "config.properties";
String sitConfigPath = "sit.properties";

ParameterTool parameterTool = ParameterTool.fromPropertiesFile(configPath);
ParameterTool sitParameterTool = ParameterTool.fromPropertiesFile(sitConfigPath);

请根据实际的文件路径进行相应的修改,确保代码能够找到正确的配置文件。