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

Apache flink Flink中的多个作业或一个作业中的多个管道,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个用例,我想在Flink上运行两个独立的处理流。 所以2个流看起来像 Source1->operator1->Sink1 Source2->operator2->Sink2 我想对这两个流重复使用相同的Flink集群。我可以从两个方面考虑: 1) 在同一Flink应用程序上提交两个不同的作业 2) 在同一作业中设置2个管道 我可以设置第一个选项,但不确定如何设置第二个选项。 以前有人尝试过这样的设置吗? 第二种方法可以通过在相同的StreamExecutionEnvironment中定义两

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

Source1->operator1->Sink1

Source2->operator2->Sink2

我想对这两个流重复使用相同的Flink集群。我可以从两个方面考虑:

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

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

我可以设置第一个选项,但不确定如何设置第二个选项。 以前有人尝试过这样的设置吗?
第二种方法可以通过在相同的
StreamExecutionEnvironment
中定义两个独立的管道,然后只调用
StreamExecutionEnvironment.execute()
一次来实现


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

第二种方法可以通过在同一
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, ...);
    ...
}
private void buildPipeline(StreamExecutionEnvironment env,String sourceName,String sinkName){
数据流=环境
.addSource(getInputs().get(sourceName))
.名称(源名称);
stream=stream.filter(evt->filter());
....
}
@凌驾
public void setupJob(AthenaFlinkJobConfiguration jobConfig、StreamExecutionEnvironment env)引发异常{
...
构建管道(环境、源Topic1、sink1等);
构建管道(环境、源Topic2、sink2等);
...
}
下面是两种方法的快速对比。使用单独作业的优点/缺点:

  • [+]代码更简单
  • [+]设置低级配置(容错机制、堆大小、并行性等)的灵活性更大
  • [-]由于资源不共享,基础设施成本更高
  • [-]维护和监控更加复杂和耗时
在单个作业中使用单独管道的好处:

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

您只需在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, ...);
    ...
}
private void buildPipeline(StreamExecutionEnvironment env,String sourceName,String sinkName){
数据流=环境
.addSource(getInputs().get(sourceName))
.名称(源名称);
stream=stream.filter(evt->filter());
....
}
@凌驾
public void setupJob(AthenaFlinkJobConfiguration jobConfig、StreamExecutionEnvironment env)引发异常{
...
构建管道(环境、源Topic1、sink1等);
构建管道(环境、源Topic2、sink2等);
...
}
下面是两种方法的快速对比。使用单独作业的优点/缺点:

  • [+]代码更简单
  • [+]设置低级配置(容错机制、堆大小、并行性等)的灵活性更大
  • [-]由于资源不共享,基础设施成本更高
  • [-]维护和监控更加复杂和耗时
在单个作业中使用单独管道的好处:

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