Apache Flink创建了错误的计划

时间:2016-03-14 00:15:04

标签: apache-flink gelly

我为Apache Flink创建了一个简单的Job,它使用了Gelly提供的PageRank实现。

在本地,在IDE内部运行,一切都很好。但是,我尝试使用JobManager Web界面将JAR与我的Job一起提交到我的机器中运行的Flink实例。但是,Flink没有为Job创建正确的计划并执行PageRank,而是呈现并执行一个非常奇怪的计划,该计划仅计算图的顶点数。

我做了一些研究和调试,发现Gelly提供的PageRank的实现开始计算图的顶点数,当它没有作为算法的参数提供时:

if (numberOfVertices == 0) {
    numberOfVertices = network.numberOfVertices();
}

此计算意味着嵌入式作业。由于运算符是惰性的,因此不会触发任何计算。在Flink服务器中,首先要做的是获取工作计划。这是由特殊环境OptimizerPlanEnvironment完成的,该环境提供以下result方法:

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; }
    }
}

如果提供顶点的数量,例如, graph.run(new PageRank<Long>(0.85, 5, 10)),没有问题,计划正确计算并计算PageRank。

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

1 个答案:

答案 0 :(得分:1)

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

目前这是Flink网络客户端的限制。这种行为的原因是Flink不希望阻止Netty通道处理程序线程,这是等待count操作结果所必需的。阻塞操作会使线程池瘫痪,并使该会话的Web界面无响应,直到它被解除阻塞。