Apache flink 如何在Flink中获取和修改jobgraph?

Apache flink 如何在Flink中获取和修改jobgraph?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我想修改jobGraph,如getVertices()、ColocatingGroup(),我尝试了以下操作: val s = StreamExecutionEnvironment.getExecutionEnvironment val p = new Param() s.addSource(new MySource(p)) .map(new MyMap(p)) .addSink(new MySink(p)) val g = s.getSt

我想修改jobGraph,如
getVertices()、ColocatingGroup()
,我尝试了以下操作:

    val s = StreamExecutionEnvironment.getExecutionEnvironment
    val p = new Param()
    s.addSource(new MySource(p))
      .map(new MyMap(p))
      .addSink(new MySink(p))
    val g = s.getStreamGraph.getJobGraph()
    val v = g.getVertices()
    s.executeAsync()
    
但是在调试模式下,顶点不是我的
MySource
操作符,我很困惑
getStreamGraph
可以接受
JobID
,一个作业在开始之前怎么可能有一个id…,所以我想也许我应该在
execute
之后得到它,我将代码改为following

    val s = StreamExecutionEnvironment.getExecutionEnvironment
    val p = new Param()
    s.addSource(new MySource(p))
      .map(new MyMap(p))
      .addSink(new MySink(p))
    s.executeAsync()
    val g = s.getStreamGraph.getJobGraph()
    val v = g.getVertices()
但是代码卡在了
s.getStreamGraph.getJobGraph()


如何实际获取jobgraph?..

不可能修改jobgraph。各种API构造JobGraph,JobGraph随后进入JobManager,JobManager将其转换为执行图,然后在任务管理器提供的任务槽中调度和运行。没有API允许您在建立作业拓扑后修改作业拓扑。(这并非不可想象有一天会得到支持,但现在不可能了。)

如果您只想查看它的表示形式,
System.out.println(env.getExecutionPlan())
非常有趣


如果您希望从静态DAG中获得更大的动态性,那么有状态函数API将更加灵活。

因此,在执行之前可以进行控制吗?那么我想第一段代码应该可以工作了?是的,第一个版本确实返回了JobGraph,但是这可能不是很有用。你希望实现什么?我正在尝试让顶点与操作符进行同位,这可能不需要借助黑魔法。我建议你问一个新问题,并举一个具体的例子来说明你想做什么。谢谢,新问题在