自定义java选项在作业中无法识别

dfuffjeb  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(268)

我在flink-conf.yaml中添加了以下行:
env.java.opts:“-ddy.props.path=/path/to/props/file”
当启动jobmanager(jobmanager.sh start cluster)时,我在日志中看到jvm选项确实被识别

2017-02-20 12:19:23,536 INFO  org.apache.flink.runtime.jobmanager.JobManager                -  JVM Options:
2017-02-20 12:19:23,536 INFO  org.apache.flink.runtime.jobmanager.JobManager                -     -Xms256m
2017-02-20 12:19:23,536 INFO  org.apache.flink.runtime.jobmanager.JobManager                -     -Xmx256m
2017-02-20 12:19:23,536 INFO  org.apache.flink.runtime.jobmanager.JobManager                -     -XX:MaxPermSize=256m
2017-02-20 12:19:23,536 INFO  org.apache.flink.runtime.jobmanager.JobManager                -     -Ddy.props.path=/srv/dy/stream-aggregators/aggregators.conf
2017-02-20 12:19:23,536 INFO  org.apache.flink.runtime.jobmanager.JobManager                -     -Dlog.file=/srv/flink-1.2.0/log/flink-flink-jobmanager-0-flinkvm-master.log
2017-02-20 12:19:23,536 INFO  org.apache.flink.runtime.jobmanager.JobManager                -     -Dlog4j.configuration=file:/srv/flink-1.2.0/conf/log4j.properties
2017-02-20 12:19:23,536 INFO  org.apache.flink.runtime.jobmanager.JobManager                -     -Dlogback.configurationFile=file:/srv/flink-1.2.0/conf/logback.xml

但是当我运行一个flink作业(flink run-dprog.jar)时,system.getproperty(“dy.props.path”)返回null(当打印系统属性时,我看到它确实不存在)
问题是-如何设置flink作业代码中可用的系统属性?

w1e3prcc

w1e3prcc1#

这个问题与flink[1]的运行时架构密切相关。
我知道你在一个独立的集群中运行你的工作。记住 JobManager 以及 TaskManager 在不同的jvm示例中运行。您必须考虑每个代码块将在何处执行。
例如,转换中的代码 map 或者 filter 是在 TaskManager . 中的代码 main 在命令行工具中执行entry类的方法 flink ,当然没有设置系统属性,因为它只为作业提交生成一个临时(-d)jvm。
如果你通过 WebUI 你的密码 main 方法在 JobManager 所以属性将被设置。
一般来说,我不鼓励通过系统属性传递程序参数,因为这是一种不好的做法。
下面是一个简单的例子:
我开始:
JobManagerenv.java.opts:"-Ddy.props.path=jobmanager"TaskManagerenv.java.opts:"-Ddy.props.path=taskmanager" 我的工作代码如下:

object Main {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val stream = env.fromCollection(1 to 4)

    val prop = System.getProperty("dy.props.path")
    stream.map(_ => System.getProperty("dy.props.path") + "  mainArg: " + prop).print()

    env.execute("stream")
  }
}

当我通过 flink 工具输出如下:

taskmanager  mainArg: null
taskmanager  mainArg: null
taskmanager  mainArg: null
taskmanager  mainArg: null

通过 WebUI 我得到:

taskmanager  mainArg: jobmanager
taskmanager  mainArg: jobmanager
taskmanager  mainArg: jobmanager
taskmanager  mainArg: jobmanager

相关问题