Apache Flink – 在作业中无法识别自定义Java选项

我已将以下行添加到flink-conf.yaml:

env.java.opts:“ – Ddy.props.path = / PATH / TO / PROPS / FILE”

当启动jobmanager(jobmanager.sh启动集群)时,我在日志中看到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 -d PROG.JAR)时,System.getProperty(“dy.props.path”)返回null(当打印系统属性时,我发现它确实不存在。)

问题是 – 如何设置flink-job代码中可用的系统属性?

这个问题与Flink [1]的运行时架构有很大关系。

我知道你在独立集群中运行你的工作。 请记住, JobManagerTaskManager在单独的jvm实例中运行。 您必须考虑每个代码块的执行位置。

例如,在TaskManager上执行转换中的代码,如mapfilter 。 输入类的main方法中的代码在命令行工具flink上执行,当然,它没有设置系统属性,因为它只为作业提交生成临时(-d)jvm。

如果通过WebUI提交作业,则main方法中的代码将在JobManager上执行,因此将设置属性。

但基本上通过系统属性传递程序参数我会说相当沮丧。


下面你有一个简单的例子:

我已经开始了:

  • 带有env.java.opts:"-Ddy.props.path=jobmanager"
  • 带有env.java.opts:"-Ddy.props.path=taskmanager" TaskManager env.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