【问题标题】:How large a file size from GCS can handle in Cloud Function? [closed]来自 GCS 的文件大小可以在 Cloud Function 中处理多少? [关闭]
【发布时间】:2021-10-15 12:13:46
【问题描述】:

我想使用 GCP 中的 Cloud Function 将 >=4 GB 的数据从 GCS 传输到 BigQuery。有可能这样做吗?我尝试使用mkfile 命令创建一个临时的 5 GB 数据文件并尝试上传到 GCS。这需要很长时间,仍然没有上传。这是否意味着 GCS 不能处理超过一定的文件大小..

在我参考的文档中:https://cloud.google.com/storage/quotas,我了解到 GCS 最多可以处理 5 TiB 的数据。那为什么上传 5 GB 的数据需要很长时间。

是否可以通过 Cloud Function 从 GCS 传输到 BigQuery 处理超过 4 GB 的数据?CF 和 GCS 可以处理多少 GB 数据?有没有可能通过任何服务减少数据大小的方法?我可以获取任何与 CF 和 GCS 可以处理的数据限制相关的文档吗?

【问题讨论】:

  • 1) 每个帖子问一个问题。 2) Cloud Functions 没有磁盘存储。您可以访问实际上是 ramdisk 的 /tmp 目录。最大 RAM 大小为 8 GB。我没有测试过尝试将文件加载到内存中或 /tmp 大于几十 MB。 3) 恕我直言,函数是用于处理每次调用超过 100 MB 的任何内容的错误服务。 4)您的问题未提供详细信息或上下文。 Cloud Dataflow 可能是更好的解决方案,因为您提到了 GCS 和 BiqQuery。
  • 云函数可以处理的数据大小有限制吗?
  • 没有数据大小限制。它是 RAM、网络带宽和最大执行时间的函数。
  • 有没有办法使用 Dataflow 减小文件大小?
  • 我猜 - 主要问题 - 是否需要任何转换(在加载期间或之前)。在不知道任务上下文的情况下——我一般会猜测——数据流就是一个答案。

标签: google-cloud-platform google-bigquery google-cloud-functions google-cloud-storage


【解决方案1】:

你问题的第一句话:

我想将 >=4 GB 的数据从 GCS 传输到 BigQuery(BQ)

如果我们停止写入,则不需要 Cloud Function(CF) 进行传输。 BQ 完全有能力从 GCS(最大 15TB)摄取您的 BIG CSV 文件。但是您需要触发此摄取或更准确地说是 BQ 加载作业。这里进入云函数。它可以插入您的存储桶。一旦您的文件完成上传到 GCS,它就会触发运行 BigQuery 加载作业的云功能。

下面是在 python39 中使用 CF 运行的加载作业示例。 别忘了设置table_id,更多信息或其他语言,你可以查看这个doc

# the file should be named main.py

def load_csv_from_gcs_to_bq(data, _):
    file_name = data["name"]
    bucket_name = data["bucket"]
    # Construct the GCS file uri to load
    uri = f"gs://{bucket_name}/{file_name}"

    from google.cloud import bigquery

    # Construct a BigQuery client object.
    client = bigquery.Client()

    # TODO: Set table_id to the ID of the table to create.
    # table_id = "your-project.your_dataset.your_table_name"


    job_config = bigquery.LoadJobConfig(
        autodetect=True,
        skip_leading_rows=1,
        source_format=bigquery.SourceFormat.CSV,
    )

    load_job = client.load_table_from_uri(
        uri, table_id, job_config=job_config
    )  # Make an API request.

    load_job.result()  # Waits for the job to complete.

    destination_table = client.get_table(table_id)  # Make an API request.
    print("Loaded {} rows.".format(destination_table.num_rows))

使用requirements.txt 文件

google-cloud-bigquery==2.24.0

这里是部署 CF 的命令(set YOUR_GCS_BUCKET without gs://)查看link 了解更多详情。

gcloud functions deploy load_csv_from_gcs_to_bq \
--region europe-west1 \
--runtime python39 \
--timeout 300 \
--memory 128 \
--trigger-resource <YOUR_GCS_BUCKET> \
--trigger-event google.storage.object.finalize

在 BQ 中加载 CSV 后,您可以使用 BQ 进行多种类型的转换并将结果存储在新表中。

但如果您需要自定义且非常具体的转换,对于您的数据大小,Dataflow 将是更好的选择。

【讨论】:

  • 谢谢..我在找这个
【解决方案2】:

如果您上传到 GCS 的速度很慢,您可以尝试:

  • 使用带有 -m 开关的 gsutil 上传以使用多个进程(`gsutil cp -m file.csv gs://bucket/destination。

  • 使用随机名称将 CSV 拆分为多个文件(如 gs://bucket/0021asdcq1231scjhas.csv,并为每个文件使用多个进程并行上传。这样您将在云存储中使用多个提取服务器。

【讨论】:

  • 但是,OP 正在从 Cloud Storage 读取数据。 HTTP 正文限制不适用。
  • 是的,但也在考虑将数据直接推送到云功能,然后发送给BQ。
  • 没有将云存储对象数据推送到云函数。您对发送至 BQ 的评论也不适用。如果您正在考虑 Pub/Sub 中的事件,则该事件不包括事件中的 Cloud Storage 对象。
  • 我认为 10Mb 限制与上述问题无关......此外,可能无法将原始 csv 文件拆分为块(没有“读取它”),如边界应该在“线”之间。
猜你喜欢
  • 2013-01-14
  • 2019-10-02
  • 1970-01-01
  • 2022-12-03
  • 2019-08-07
  • 2015-11-18
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多