Apache flink ApacheFlink创建了错误的计划

Apache flink ApacheFlink创建了错误的计划,apache-flink,gelly,Apache Flink,Gelly,我为ApacheFlink创建了一个简单的作业,它使用Gelly提供的PageRank实现 在本地,在IDE内部运行,一切正常。但是,我尝试使用JobManager web界面将带有作业的JAR提交到机器中运行的Flink实例。但是,弗林克没有为作业获得正确的计划并执行PageRank,而是提出并执行了一个非常奇怪的计划,该计划只计算图的顶点数 我做了一些研究和调试,发现Gelly提供的PageRank的实现开始计算图形的顶点数,而不是作为算法的参数提供: if (numberOfVertice

我为ApacheFlink创建了一个简单的作业,它使用Gelly提供的PageRank实现

在本地,在IDE内部运行,一切正常。但是,我尝试使用JobManager web界面将带有作业的JAR提交到机器中运行的Flink实例。但是,弗林克没有为作业获得正确的计划并执行PageRank,而是提出并执行了一个非常奇怪的计划,该计划只计算图的顶点数

我做了一些研究和调试,发现Gelly提供的PageRank的实现开始计算图形的顶点数,而不是作为算法的参数提供:

if (numberOfVertices == 0) {
    numberOfVertices = network.numberOfVertices();
}
此计算意味着一个嵌入式作业。由于运算符是惰性的,因此不会触发计算。在Flink服务器中,首先要做的是获取作业计划。这是由一个特殊的环境完成的,
OptimizerPlanEnvironment
,它提供了以下
结果
方法:

public JobExecutionResult execute(String jobName) throws Exception {
    Plan plan = createProgramPlan(jobName);
    this.optimizerPlan = compiler.compile(plan);

    // do not go on with anything now!
    throw new ProgramAbortException();
}
问题来自这里。一旦抛出
ProgramAbortException
,程序将返回到目前为止计算的计划。但是只计算了内部作业计划,因此这样就不会计算或执行主作业计划

这是我使用的代码:

public class Job {
    public static void main(String[] args) throws Exception {
        final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        Graph<Long, Double, Double> graph = Graph.fromDataSet(
            PageRankData.getDefaultEdgeDataSet(env), new VertexInit(), env);
        graph.run(new PageRank<Long>(0.85, 10)).print();
    }

    private static class VertexInit implements MapFunction<Long, Double> {
        @Override
        public Double map(Long value) throws Exception { return 1.0; }
    }
}
公共类作业{
公共静态void main(字符串[]args)引发异常{
final ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();
Graph=Graph.fromDataSet(
PageRankData.getDefaultEdgeDataSet(env),新的VertexInit(),env);
run(新的PageRank(0.85,10)).print();
}
私有静态类VertexInit实现MapFunction{
@凌驾
公共双映射(长值)引发异常{return 1.0;}
}
}
如果提供了顶点数,例如执行
graph.run(新的PageRank(0.85,5,10))
,则没有问题,正确计算了计划并计算了PageRank


我的问题是:我做错了什么?或者这是Flink中的实际错误?

正如您所述,问题在于
网络。NumberOfVertexts
内部调用顶点数据集上的
计数。这将触发一个独立的Flink作业,该作业计算计数值。此值通常由
main
方法检索。但是,在web客户端提交的情况下,这将不起作用,因为
OptimizerPlanEnvironment
,它只允许编译单个Flink作业。该行为类似于分离执行模式,该模式也不支持紧急计划执行


这是Flink的web客户端目前的一个限制。这种行为的原因是Flink不想阻止Netty channel handler线程,这是等待
count
操作结果所必需的。阻塞操作将使线程池饥饿,并使此会话的web界面在解除阻塞之前没有响应。

这是关于计划的可视化中断还是程序执行失败的问题?当在运行的实例上执行JAR时,程序是否正确执行,还是同样失败?它也失败了。可视化的计划就是执行的计划。所以,使用命令行界面,这个问题不应该发生,对吗?我正在测试,是的,它不会失败。仅当您以分离模式提交作业时。但是你应该得到一个例外,告诉你这一点。