Apache flink Flink数据集程序运行多个作业

Apache flink Flink数据集程序运行多个作业,apache-flink,Apache Flink,我在ApacheFlink中有以下代码。 当我执行它时,代码的某些部分会运行两次。 有人能告诉我为什么会这样吗 DataSet input1 = ... DataSet input2 = ... List mappedInput1 = input1 .map(...) .collect(); DataSet data = input1 .union(input1.filter(...)) .mapPartition(...); data = data.uni

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

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();
每个
collect()
print()
语句都会急切地触发执行,并将结果获取到客户端代码。每次这样的调用都会将整个程序回溯到数据源


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

dPairs.flatMap(新TC(dPairs.collect()).setParallelism(1);正如您在这行代码中看到的,我想在两个地方使用前面步骤中生成的DPAIR。在这里使用广泛的cast变量是否有效?另一个问题是,在所有节点中都可以访问它吗?如果您使用广播变量to
flatMap(new TC())
共享
dPairs
,它可用于
TC
的所有并行实例(在您的情况下,并行度为1)。Flink将检测到重复使用
dPairs
会创建一个分支和合并数据流,并自动注意程序的执行不会出现死锁。使用示例中的广播变量,我在访问广播变量时收到空指针异常!您能否将代码示例简化为相关部分并改进格式(正确缩进、换行以避免滚动等)。很难弄清楚你在那里做什么。下面是相关代码!我在main方法中更新了一行代码,并添加了richflatmapp函数。