我正在使用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仪表板中看到执行图并观察到由不同执行者/操作者实例处理的记录时,我发现除此以外,所有执行者都在处理几乎相同数量的记录。我本来希望只有一名执行者会完成所有处理,因为只有一个分区应该具有所有优势。
但是从第四阶段开始,所有运算符实例都在处理几乎相同数量的记录。例如,这里是第4阶段的统计数据。
我在这里想念什么? 如果您想自己测试程序。此repo中提供了该代码。我提供了一个小的输入边缘文件,该文件比我正在使用的文件小,但您仍然可以看到问题。