繁体   English   中英

Dataflow 流式处理管道中的 DoFn 实例过多

[英]Too many instances of a DoFn in a Dataflow streaming pipeline

我目前正在开发一个与 Cloud SQL 有很多交互的数据流流管道。该管道通过 Google 开发的 Python 连接器与 Cloud SQL 中的 Postgres 实例进行交互。 它通过继承自 DoFn class“CloudSQLDoFn”的 DoFn 函数进行连接,该函数通过 setup() 和 teardown() 调用处理连接池。 总共有 16 个 DoFns 继承自此 CloudSQLDoFn class。

import apache_beam as beam
from google.cloud.sql.connector import Connector, IPTypes
from sqlalchemy import create_engine

INSTANCE_CONNECTION_NAME = ########
DB_USER = #########
DB_PASS = #########
DB_NAME = #########
POOL_SIZE = 5

class CloudSqlDoFn(beam.DoFn):
    def __init__(
        self,
        local
    ):
        self.local = local

        self.connected_pool = None

        self.instance_connexion_name = INSTANCE_CONNECTION_NAME
        self.db_user = DB_USER
        self.db_pass = DB_PASS
        self.db_name = DB_NAME

        self.pool_size = POOL_SIZE

    def get_conn(self):
        """Create connexion"""

        conn = Connector().connect(
            self.instance_connexion_name,
            "pg8000",
            user=self.db_user,
            password=self.db_pass,
            db=self.db_name,
            ip_type=IPTypes.PRIVATE
        )
        return conn

    def get_pool(self):
        """Create pool of connexion"""
        pool = create_engine(
            "postgresql+pg8000://",
            creator=self.get_conn,
            pool_size=self.pool_size,
            pool_recycle=1800
        )
        return pool

    def setup(self):
        """Open connection or pool of connections to Postgres"""
        self.connected_pool = self.get_pool()
     

    def teardown(self):
        """Close connection to Postgres"""
        self.connected_pool.dispose()

总之,我们面临着一个典型的“背压”问题:当太多文件同时到达时,我们从“云 SQL 管理服务器”(设置 SQL 连接)收到很多“请求太多”错误。

RuntimeError: aiohttp.client_exceptions.ClientResponseError: 429, message='Too Many Requests', url=URL('https://sqladmin.googleapis.com/sql/v1beta4/projects/.../instances/db-csql:generateEphemeralCert')

我们知道这是由于创建了许多调用 setup() 方法的 DoFns 实例,因此请求了太多连接,但我们无法控制连接数。 我们认为通过限制工作线程和线程的最大数量,我们可以强制将延迟提高到 go(这没问题),但似乎其他参数决定了 DoFn 的实例数量。

我的问题:

  • 除了线程和工作者的数量之外,什么决定了流式数据流中同时实例化的 DoFn 实例的数量?
  • 我们如何强制系统接受更高的延迟/更低的新鲜度,这样我们就不会使云 SQL 管理服务器饱和?

谢谢您的帮助。

您可以将您的池设置为进程级别(即,将其附加到某个全局 static 变量/模块,或 DoFn class 本身)并在所有 DoFn 实例之间共享它以限制每个进程的连接数,而不管实例化的 DoFns 的数量。 如果你需要不止一个,你可以给每个 DoFn 一个唯一的标识符,然后有一个 static map 的 IDs 到池。

在 Dataflow 上,您还可以设置 no_use_multiple_sdk_containers 来限制每个工作 VM 的进程数(尽管这当然也会限制管道其他部分的 CPU)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM