Flink中一项作业中的多个作业或多个管道

时间:2018-08-24 18:27:45

标签: apache-flink flink-streaming

我有一个用例,我想在Flink上运行2个独立的处理流程。 所以2个流看起来像

Source1-> operator1-> Sink1

Source2-> operator2-> Sink2

我想对两个流重新使用相同的Flink集群。我可以考虑通过以下两种方式做到这一点:

1)在同一Flink应用程序上提交2个不同的工作

2)在同一作业中设置2个管道

我能够设置第一个选项,但不确定如何执行第二个选项。 有人尝试过这样的设置吗? 一个人比另一个人有什么优势?

2 个答案:

答案 0 :(得分:1)

您可以在setupJob()方法中简单地创建多个管道(具有单独或共享的源使用者)。这是一个示例:

private void buildPipeline(StreamExecutionEnvironment env, String sourceName, String sinkName) {
    DataStream<T> stream = env
            .addSource(getInputs().get(sourceName))
            .name(sourceName);
    stream = stream.filter(evt -> filter());
    ....
}

@Override
public void setupJob(AthenaFlinkJobConfiguration jobConfig, StreamExecutionEnvironment env) throws Exception {
    ...
    buildPipeline(env, sourceTopic1, sink1, ...);
    buildPipeline(env, sourceTopic2, sink2, ...);
    ...
}

这是两种方法的快速对比。使用单独作业的优点/缺点:

  • [+]代码更简单。
  • [+]设置低级配置(容错机制,堆大小,并行性等)的更大灵活性
  • [-]由于不共享资源,因此基础设施成本较高。
  • [-]维护和监视更加复杂且耗时。

在单个作业中使用单独的管道的好处:

  • [+]监视和调试单个作业更加容易。
  • [+]修补程序被提交到单个存储库中,并部署到单个环境中。
  • [+]经济:减少基础架构硬件和运营成本。
  • [-]无法限制单个管道的使用。
  • [-]一个管道中的故障影响了另一个管道。
  • [-]一个管道中的背压可能会影响整个作业,因为每个作业都快照了一个检查点。

答案 1 :(得分:0)

第二种方法可以通过在同一StreamExecutionEnvironment中定义两个独立的管道并只调用一次StreamExecutionEnvironment.execute()来实现。

我将使用第一种方法,因为它可以为您提供更好的隔离。如果发生故障,Flink将重新启动整个作业。因此,如果您在同一作业中实现两个管道,则两个管道将在发生故障的情况下重置并重新启动。如果您遵循一种方法,您也可以独立获取保存点。