在flink的一个作业中有多个作业或多个管道

uxh89sit  于 2021-06-21  发布在  Flink
关注(0)|答案(2)|浏览(460)

我有一个用例,我想在flink上运行两个独立的处理流。所以2个流看起来像
source1->operator1->sink1
source2->operator2->sink2
我想对两个流重复使用相同的flink集群。我可以从两个方面考虑:
1) 在同一份flink申请表上提交两份不同的工作
2) 在同一作业中设置2条管道
我可以设置第一个选项,但不知道如何做第二个选项。以前有人试过这样的设置吗?一个比另一个有什么好处?

bqucvtff

bqucvtff1#

第二种方法可以通过在同一个管道中定义两个独立的管道来实现 StreamExecutionEnvironment 只是打个电话 StreamExecutionEnvironment.execute() 一次。
我会使用第一种方法,因为它能给你更好的隔离。Flink在失败的情况下重新开始整个工作。因此,如果在同一作业中实现两个管道,则在发生故障时,这两个管道都将重置并重新启动。此外,如果您遵循一种方法,您还可以独立地获取保存点。

gj3fmq9x

gj3fmq9x2#

您只需在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, ...);
    ...
}

下面是两种方法的快速对比。使用单独作业的优点/缺点:
[+]代码更简单。
[+]更灵活地设置低级配置(容错机制、堆大小、并行性等)
[-]由于资源不共享,基础设施成本增加。
[-]维护和监控更加复杂和耗时。
在单个作业中使用单独管道的好处:
[+]监视和调试单个作业更容易。
[+]修补程序被提交到单个repo中,并部署到单个环境中。
[+]经济:降低基础设施硬件和运营成本。
[-]无法绑定单个管道用法。
[-]一条管道的故障会影响另一条管道。
[-]一条管道中的背压可能会影响整个作业,因为每个作业都会快照一个检查点。

相关问题