【问题标题】:Multiple jobs or multiple pipelines in one job in FlinkFlink 中一个作业中的多个作业或多个管道
【发布时间】:2018-08-24 18:27:45
【问题描述】:

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

Source1 -> operator1 -> Sink1

Source2 -> operator2 -> Sink2

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

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

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

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

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案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, ...);
        ...
    }
    

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多