Flink DataSet程序运行多个作业

时间:2016-01-11 14:03:17

标签: apache-flink

我在Apache Flink中有以下代码。 当我执行它时,我的代码的某些部分运行两次。 有人可以告诉我为什么会这样吗?

DataSet input1 = ...
DataSet input2 = ...

List mappedInput1 = input1
    .map(...)
    .collect();

DataSet data = input1
    .union(input1.filter(...))
    .mapPartition(...);

data = data.union(data2).distinct();

data.flatMap(new MapFunc1(data.collect()));

data
    .flatMap(new MapFunc2(input2.collect()))
    .groupBy(0)
    .sum(1)
    .print();

1 个答案:

答案 0 :(得分:4)

每个collect()print()语句都会急切地触发执行并将结果提取到客户端代码。每个此类调用都会将整个程序追溯到数据源。

您的代码包含三个collect()和一个print()语句。因此,提交并执行了四个单独的程序。您应该查看broadcast variables,而不是使用collect()。广播变量将DataSet分发给运算符的每个并行实例。计算和分发在同一程序中进行,不通过客户端程序进行路由。而是在运行运营商的工人之间直接交换数据。

相关问题