簡體   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