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

时间:2017-02-20 12:27:59

标签: java apache-flink flink-streaming

我已将以下行添加到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代码中可用的系统属性?

1 个答案:

答案 0 :(得分:1)

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

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

例如mapfilter等转换中的代码在TaskManager上执行。 您的条目类的main方法中的代码在命令行工具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