Python 3.x 使用GCP数据流和;ApacheBeamPython SDK

Python 3.x 使用GCP数据流和;ApacheBeamPython SDK,python-3.x,google-cloud-dataflow,apache-beam,Python 3.x,Google Cloud Dataflow,Apache Beam,首先,让我先说明一下,我刚刚开始了解如何使用Beam的Python SDK和GCP数据流 问题: 我的管道在几乎所有用例中都运行良好。没有我可以抱怨的错误。我只是对一些可能的瓶颈或优化有一些疑问。我注意到,当处理大小约50mb的gzip文件时,我的管道执行时间几乎超过3个小时。不完全确定是否有任何方法可以加速该部分。下面是我在作业最终成功完成之前看到的一系列日志警告的屏幕截图 以下是管道的相关片段: 如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu': parse

首先,让我先说明一下,我刚刚开始了解如何使用Beam的Python SDK和GCP数据流

问题: 我的管道在几乎所有用例中都运行良好。没有我可以抱怨的错误。我只是对一些可能的瓶颈或优化有一些疑问。我注意到,当处理大小约50mb的gzip文件时,我的管道执行时间几乎超过3个小时。不完全确定是否有任何方法可以加速该部分。下面是我在作业最终成功完成之前看到的一系列日志警告的屏幕截图

以下是管道的相关片段:

如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
parser=argparse.ArgumentParser(
description='Beam Pipeline:示例'
)
parser.add_参数('--input glob',
help='Cloud指向原始数据的路径',
必需=真)
parser.add_参数('--output bq table',
help='BQ Native{dataset}.{table}')
已知参数,管道参数=解析器。解析已知参数()
将beam.Pipeline(argv=Pipeline_args)作为p:
json_raw=(p |‘读取原始数据’>>beam.io.ReadFromText(已知的_args.input_glob)
|'JSON ing'>>beam.Map(lambda e:JSON.load(e))
)
额外信息:

  • 我用它来启动这个
  • 我曾经尝试过不同类型的机器,希望在这个问题上投入更多的计算能力可以让它消失,但到目前为止没有运气

  • 以下管道执行参数:


  • Beam有许多优化,允许它将文件处理拆分为多个工作进程。此外,它还可以拆分单个文件以供多个工作人员并行使用

    不幸的是,这在gzip文件中是不可能的。这是因为gzip文件被压缩到一个块中,该块必须串行解压缩。当Beam worker读取此文件时,它必须连续读取整个文件

    有一些压缩格式允许您并行读取它们(通常是“多块”格式)。不幸的是,我认为Beam Python SDK目前只是

    如果需要让管道以这种方式工作,可以尝试在
    ReadFromText
    之后添加
    beam.Reshuffle
    操作。通过这样做,您的管道仍然会串行读取文件,但会并行应用所有下游操作(请参阅本文以了解为什么会出现这种情况)

    其他一些备选方案:

    • 将数据分隔为多个gzip文件
    • 在管道中使用之前,先将其解压缩
    • (半开玩笑/半认真)为梁提供多块压缩支撑?:):)
    --runner=DataflowRunner \
    --project=example-project \
    --region=us-east4 \
    --save_main_session \
    --temp_location=gs://example-bucket/temp/ \
    --input-glob=gs://example-bucket/raw/  \
    --machine_type=n1-standard-16 \
    --job_name=this-is-a-test-insert