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]的运行时架构有很大关系。
我知道你在独立集群中运行你的工作。 请记住, JobManager
和TaskManager
在单独的jvm实例中运行。 您必须考虑每个代码块的执行位置。
例如,在TaskManager
上执行转换中的代码,如map
或filter
。 输入类的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