Apache flink 如何在Flink中管理数据源连接池

Apache flink 如何在Flink中管理数据源连接池,apache-flink,flink-sql,Apache Flink,Flink Sql,我试图运行一个Flink客户端应用程序,从文件中读取数据。 应使用ProcessFunction运算符对照数据库中的记录验证文件中的每条记录。我已经用单吨设计模式配置了一个数据源。我有以下问题 此数据源是否将在所有任务管理器和任务槽中共享 在处理器内以Open方法创建数据源连接,最大连接池大小只有一个,这是一个好主意吗 如果我正确地理解了您的用例,那么这将更容易作为外部数据库中的表实现 如果您必须自己实现这一点,那么如果您使用Flink,而不是在ProcessFunction中对数据库发出同步请

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

  • 此数据源是否将在所有任务管理器和任务槽中共享
  • 在处理器内以Open方法创建数据源连接,最大连接池大小只有一个,这是一个好主意吗

  • 如果我正确地理解了您的用例,那么这将更容易作为外部数据库中的表实现

    如果您必须自己实现这一点,那么如果您使用Flink,而不是在
    ProcessFunction
    中对数据库发出同步请求,那么它会工作得更好。(在Flink的用户函数中执行阻塞i/o会导致问题,应该避免。)

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

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

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

    更多关于你为什么不应该这样做的信息,请关注


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

    谢谢@David Anderson,我了解了JVM与任务管理器和任务槽的概念。那么,您认为创建数据库连接池或处理连接池的最佳方法是什么?是否可以在任务管理器之间共享连接?不,这是不可能的。一般来说,任何需要任务管理器之间进行协调的操作都是不允许的,因为这会妨碍可伸缩性。那么回到我的主要问题,在群集flink环境中处理连接池以进行异步I/O调用的最佳方法是什么使用异步I/O操作符。如果客户端库没有为您执行连接池,请在RichAsyncFunction的每个实例的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);
       }