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 个管道
我可以设置第一个选项,但不确定如何设置第二个选项。
以前有人尝试过这样的设置吗?
一个比另一个有什么优势?
第二种方法可以通过在同一个 StreamExecutionEnvironment
中定义两个独立的管道并只调用一次 StreamExecutionEnvironment.execute()
来实现。
我会使用第一种方法,因为它可以更好地隔离。 Flink 在失败的情况下重新启动整个作业。因此,如果您在同一个作业中实现两个管道,则两个管道都将在发生故障时重置并重新启动。如果您遵循方法一,您也可以独立获取保存点。
您可以在 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, ...);
...
}
下面是两种方法的快速对比。使用单独作业的Pros/Cons:
- [+]代码更简单
- [+] 更灵活地设置低级配置(容错机制、堆大小、并行度等)
- [-] 由于资源不共享,基础设施成本更高。
- [-]维护和监控更加复杂和耗时。
在单个作业中使用单独管道的好处:
- [+] 监视和调试单个作业更容易。
- [+] 修补程序被提交到单个存储库中并部署到单个环境中。
- [+] 经济:降低基础设施硬件和运营成本。
- [-] 无法绑定单个管道使用。
- [-] 一条管道中的故障会影响另一条管道。
- [-] 一个管道中的背压可能会影响整个作业,因为每个作业都会拍摄一个检查点快照。
我有一个用例,我想在 Flink 上 运行 2 个独立的处理流。 所以 2 个流看起来像
Source1 -> operator1 -> Sink1
Source2 -> operator2 -> Sink2
我想为两个流程重新使用同一个 Flink 集群。我可以想到用两种方式做到这一点:
1) 在同一个 Flink 应用程序上提交 2 个不同的作业
2) 在同一作业中设置 2 个管道
我可以设置第一个选项,但不确定如何设置第二个选项。 以前有人尝试过这样的设置吗? 一个比另一个有什么优势?
第二种方法可以通过在同一个 StreamExecutionEnvironment
中定义两个独立的管道并只调用一次 StreamExecutionEnvironment.execute()
来实现。
我会使用第一种方法,因为它可以更好地隔离。 Flink 在失败的情况下重新启动整个作业。因此,如果您在同一个作业中实现两个管道,则两个管道都将在发生故障时重置并重新启动。如果您遵循方法一,您也可以独立获取保存点。
您可以在 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, ...);
...
}
下面是两种方法的快速对比。使用单独作业的Pros/Cons:
- [+]代码更简单
- [+] 更灵活地设置低级配置(容错机制、堆大小、并行度等)
- [-] 由于资源不共享,基础设施成本更高。
- [-]维护和监控更加复杂和耗时。
在单个作业中使用单独管道的好处:
- [+] 监视和调试单个作业更容易。
- [+] 修补程序被提交到单个存储库中并部署到单个环境中。
- [+] 经济:降低基础设施硬件和运营成本。
- [-] 无法绑定单个管道使用。
- [-] 一条管道中的故障会影响另一条管道。
- [-] 一个管道中的背压可能会影响整个作业,因为每个作业都会拍摄一个检查点快照。