【问题标题】:How to Manage Data Source Connection Pool in FlinkFlink 中如何管理数据源连接池
【发布时间】:2021-06-09 10:48:52
【问题描述】:

我正在尝试运行 Flink 客户端应用程序,我正在从文件中读取数据。 文件中的每条记录都应使用 ProcessFunction 运算符与数据库中的记录进行验证。我已经用单吨设计模式配置了一个数据源。我有以下问题

  1. 此数据源是否将在所有任务管理器和任务槽之间共享?
  2. 以 Open 方法在处理器内创建数据源连接是否是一个好主意,只有一个作为最大连接池大小?
   public void open(Configuration parameters) throws Exception {
       //1. If i open a Connection Here
       //2. Shall i declare a Data Source COnnection here with only 1 as Maximum No of Connections
       super.open(parameters);
   }

【问题讨论】:

    标签: apache-flink flink-sql


    【解决方案1】:

    如果我正确理解了您的用例,这将更容易实现为 Lookup Join 与外部数据库中的表。

    如果一定要自己实现,使用Flink的async i/o operator会比ProcessFunction中的数据库同步请求效果更好。 (在 Flink 的用户函数中做阻塞 i/o 容易导致问题,应该避免。)

    但为了帮助回答您最初的问题:

    给定任务管理器中的所有任务槽都在同一个 JVM 中。但是每个任务管理器都在一个单独的 JVM 中。每个任务槽都有自己的流程函数实例;每个实例都将在不同的线程中运行。

    不可能有一个在任务管理器之间共享连接的全局连接池。可以使用静态类在多槽任务管理器中建立跨槽共享的连接池,但这种使用静态类的方式在 Flink 中被认为是一种反模式。它可能导致死锁,并且还需要小心类加载(静态意味着每个类加载器一个实例,因此您必须确保该类由父类加载器加载,要么将类放在 /lib 中,要么通过配置 classloader.parent-first-patterns.additional (docs) 来学习这个特定的课程。

    如需详细了解为什么不应该这样做,请观看https://youtu.be/F7HQd3KX2TQ?t=1407

    连接池与 Flink 的异步 i/o 运算符结合使用是一个好主意。每个操作员实例都在管理一个对外部数据库或服务的并发请求池,并且在那里使用连接池可以提高性能。但是很多异步客户端库已经这样做了,在这种情况下不需要自己做。

    【讨论】:

    • 感谢@David Anderson,我了解了带有任务管理器和任务槽的 JVM 的概念。那么,您建议创建数据库连接池或处理连接池的最佳方法是什么
    • 任务管理器之间是否可以共享连接?
    • 不,这是不可能的。一般来说,任何需要任务管理器之间协调的事情都是不允许的,因为这会阻碍可扩展性。
    • 所以回到我的主要问题,在集群 flink 环境中处理连接池以进行异步 I/O 调用的最佳方法是什么
    • 使用异步 i/o 操作符。如果您的客户端库不为您执行连接池,请在 RichAsyncFunction 的每个实例的 open() 方法中创建一个单独的池。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多