繁体   English   中英

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

[英]Multiple jobs or multiple pipelines in one job in Flink

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

Source1 - > operator1 - > Sink1

Source2 - > operator2 - > Sink2

我想为两个流重用相同的Flink集群。 我可以想到以两种方式做到这一点:

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

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

我能够设置第一个选项,但不知道如何做第二个选项。 有没有人尝试过这样的设置? 一个优于另一个的优势是什么?

您可以在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, ...);
    ...
}

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

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

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

  • [+]监控和调试单个作业更容易。
  • [+]修补程序被提交到单个仓库并部署到单个环境中。
  • [+]经济:降低基础设施硬件和运营成本。
  • [ - ]不能绑定单个管道使用。
  • [ - ]一个管道中的故障会影响另一个管道。
  • [ - ]一个管道中的背压可能会影响整个作业,因为每个作业都会为一个检查点创建快照。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM