2017-02-20 36 views
7

我已经添加了以下行弗林克-conf.yaml:阿帕奇弗林克 - 自定义的Java选项无法识别内部工作

env.java.opts:“-Ddy.props.path =/PATH/TO /道具/ 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 

但是当我运行一个弗林克作业(弗林克运行-d PROG .JAR),System.getProperty(“dy.props.path”)返回null(并且在打印系统属性时,我发现它确实没有)

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

回答

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