自定义分区程序在Apache Flink中的行为

时间:2019-03-13 09:38:29

标签: apache-flink gelly

我正在使用Apache Flink(版本1.7.2)的Gelly库进行图分区。 但是,我正在观察一种我不完全了解的行为。

以下是使用Gelly库中提供的PageRank算法的代码。

    DataSet<Edge<Long, Double>> data = env.readTextFile(edgesInputPath).setParallelism(1).map(new MapFunction<String, Edge<Long, Double>>() {

        @Override
        public Edge<Long, Double> map(String s) {
            String[] fields = s.split("\\t");
            long src = Long.parseLong(fields[0]);
            long trg = Long.parseLong(fields[1]);
            return new Edge<>(src, trg, 1.0);
        }
    }).setParallelism(1);

    partitioner = new ImbalancedPartitioner<>(new CustomKeySelector(0));

    Graph<Long, Double, Double> graph = Graph.fromDataSet(data.partitionCustom(partitioner, new CustomKeySelector<>(0)),new InitVertices(1.0), env);

    DataSet<PageRank.Result<Long>> result = graph.run(new PageRank<Long, Double, Double>(0.85, maxIterations));

    result.writeAsText(outputPath, FileSystem.WriteMode.OVERWRITE);

这里,ImbalancePartitioner实现了一个partition()函数,该函数始终返回0。因此,图的所有边都将在单个分区中。总体并行度设置为3。

但是,当我在Flink仪表板中看到执行图并观察到由不同执行者/操作者实例处理的记录时,我发现除此以外,所有执行者都在处理几乎相同数量的记录。我本来希望只有一名执行者会完成所有处理,因为只有一个分区应该具有所有优势。

第二和第三阶段有我期望看到的不平衡,如下所示。 Second stage

Third Stage 但是从第四阶段开始,所有运算符实例都在处理几乎相同数量的记录。例如,这里是第4阶段的统计数据。 Fourth Stage

虽然可能很难看到,但这是执行图Execution Graph

我在这里想念什么? 如果您想自己测试程序。此repo中提供了该代码。我提供了一个小的输入边缘文件,该文件比我正在使用的文件小,但您仍然可以看到问题。

0 个答案:

没有答案