laijunlin_data 2023-06-21 17:44 采纳率: 58.3%
浏览 52
已结题

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

  • 写回答

2条回答 默认 最新

  • SoberChina 2023-06-26 10:21
    关注

    看到你提的问题了。文件路径的问题,简单点这么来看,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"));

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月4日
  • 已采纳回答 6月26日
  • 修改了问题 6月21日
  • 创建了问题 6月21日

悬赏问题

  • ¥15 下载ctorch报错,求解
  • ¥15 如何入门学习c语言,单片机
  • ¥15 idea 编辑语言的选择
  • ¥15 Windows下部署Asmjit
  • ¥15 请问双层规划模型的上下层目标函数不一致,是如何保证迭代收敛性的
  • ¥15 微信小程序 前端页面内容搜索
  • ¥15 cpu是如何判断当前指令已经执行完毕,然后去执行下条指令的
  • ¥15 安装visual studio2022时visualstudiosetup启动不了,闪退。问题代号0x0和0x1389
  • ¥30 java spring boot2.5.3版本websocket连不上
  • ¥15 angular js调外部链接查看pdf