在一个flink作业中使用collect()和env.execute()

时间:2017-11-28 11:29:31

标签: apache-flink gelly

我正在尝试在Flink中编写一个需要两个阶段的计算。

在第一阶段,我创建一个Graph并获取它的顶点id:

List<String> ids = graph.getVertexIds().collect();

在第二阶段,我想使用这些id为每个顶点运行SingleSourceShortestPath。

for (String id: ids){
        System.out.println("Source Id: "+id);
        graph.run( new SingleSourceShortestPaths<String, String>(id, 10)).print();
    }

它在本地工作(在IntelliJ IDE和命令行中使用./bin/flink run ...),但是当我使用其WebUI在Flink上提交作业时,程序只执行到collect()方法并且不运行剩余的该程序(用于声明和print())。

有什么问题?

这是我的代码:

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.graph.Edge;
import org.apache.flink.graph.Graph;
import org.apache.flink.graph.library.SingleSourceShortestPaths;

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) throws Exception {

        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        Edge<String, Double> e1 = new Edge<String, Double>("1", "2", 0.5);
        Edge<String, Double> e2 = new Edge<String, Double>("2", "3", 0.5);
        Edge<String, Double> e3 = new Edge<String, Double>("4", "5", 0.5);
        Edge<String, Double> e4 = new Edge<String, Double>("5", "6", 0.5);
        Edge<String, Double> e5 = new Edge<String, Double>("7", "8", 0.5);


        List<Edge<String, Double>> edgeList = new ArrayList<Edge<String, Double>>();
        edgeList.add(e1);
        edgeList.add(e2);
        edgeList.add(e3);
        edgeList.add(e4);
        edgeList.add(e5);


        Graph<String, String, Double> graph = Graph.fromCollection(edgeList,
                new MapFunction<String, String>() {
                    public String map(String value) {
                        return value;
                    }
                }, env);

        List<String> ids = graph.getVertexIds().collect();

        for (String id: ids){
            System.out.println("Source Id: "+id);
            graph.run( new SingleSourceShortestPaths<String, String>(id, 10)).print();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

基于此link,Flink转换是惰性的,这意味着只有在调用 sink操作 之前,它们才会执行。

Flink中的 sink操作 触发流的执行以产生所需的程序结果,例如将结果保存到文件系统或将其打印到标准输出

Dataset.collect()Dataset.Count()Dataset.print()之类的方法是接收器操作,它们触发实际的数据转换。