PubSub/DataFlow注入BigQuery,数据无法注入,积压字节数很大

原来是数据中出现了NaN,导致注入BigQuery失败。而注入BigQuery失败,默认的操作是立即重试,直到成功为止。

这就会导致注入操作一直卡在出错的地方,反复重试直至天荒地老,永远不能继续,后续字节一直积压。

如果用的是PubSub直接注入BigQuery,这个问题根本没有log可以看。哪里出现问题都不知道。

建议中间加一个DataFlow,照着官网Flex模板的示例自定义一个Flex模板。这样哪里出错了,起码有log可以看。

贴个简单的例子,读取PubSub流然后存入BQ

from __future__ import annotations

import argparse
import json
import logging
import time
from typing import Any

import apache_beam as beam
from apache_beam.io.gcp.bigquery_tools import RetryStrategy
from apache_beam.options.pipeline_options import PipelineOptions
import apache_beam.transforms.window as window
import apache_beam.transforms.trigger as trigger

input_subscription = "xxx"
target_table = "xxx"


def parse_json_message(message: str) -> dict[str, Any]:
    row = json.loads(message)
    return row


def run(
        beam_args: list[str] = None,
) -> None:
    options = PipelineOptions(beam_args, save_main_session=True, streaming=True)

    with beam.Pipeline(options=options) as pipeline:
        # 从PubSub读取数据
        datas = (
                pipeline
                | "Read from Pub/Sub"
                >> beam.io.ReadFromPubSub(subscription=input_subscription).with_output_types(bytes)
                | "UTF-8 bytes to string" >> beam.Map(lambda msg: msg.decode("utf-8"))
                | "Parse JSON messages" >> beam.Map(parse_json_message)
        )

        # 所有数据存入BQ表
        _ = (
                datas
                | "Write to BQ Table"
                >> beam.io.WriteToBigQuery(target_table,
                                           ignore_unknown_columns=True,
                                           insert_retry_strategy=RetryStrategy.RETRY_ON_TRANSIENT_ERROR)
        )


if __name__ == "__main__":
    logging.getLogger().setLevel(logging.INFO)

    parser = argparse.ArgumentParser()
    args, beam_args = parser.parse_known_args()
    run(
        beam_args=beam_args,
    )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值