Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 使用Apache Beam读取大量文件的可扩展方式?_Google Cloud Platform_Apache Beam - Fatal编程技术网

Google cloud platform 使用Apache Beam读取大量文件的可扩展方式?

Google cloud platform 使用Apache Beam读取大量文件的可扩展方式?,google-cloud-platform,apache-beam,Google Cloud Platform,Apache Beam,我正在编写一个管道,需要从位于我的Google Cloud Bucket上的中读取元数据文件(500.000多个文件) 它在一个小的子集上工作得很好,但是当我在完整的数据集上运行它时,它似乎在“Read Metadata”>>ReadFromTextWithFilename(f'gs://{BUCKET}/{DATA\u FOLDER}/***Metadata.json')上阻塞了 它甚至没有出现在数据流作业列表中 管道如下所示: 将beam.Pipeline(选项=Pipeline_选项)作为

我正在编写一个管道,需要从位于我的Google Cloud Bucket上的中读取元数据文件(500.000多个文件)

它在一个小的子集上工作得很好,但是当我在完整的数据集上运行它时,它似乎在
“Read Metadata”>>ReadFromTextWithFilename(f'gs://{BUCKET}/{DATA\u FOLDER}/***Metadata.json')
上阻塞了

它甚至没有出现在数据流作业列表中

管道如下所示:

将beam.Pipeline(选项=Pipeline_选项)作为管道:
元=(
管道
|“读取元数据”>>ReadFromTextWithFilename(f'gs://{BUCKET}/{DATA_FOLDER}/***Metadata.json')
|“提取元数据”>>beam.ParDo(提取元数据())
)
table_spec=bigquery.TableReference(
datasetId=“sentinel_2”,
tableId=“图像标签”,
)
(
元
|“写入BigQuery”>>beam.io.WriteToBigQuery(
表2.1.1-1规范,
schema=表\u schema(),
write_disposition=beam.io.BigQueryDisposition.write_TRUNCATE,
create_disposition=beam.io.BigQueryDisposition.create_如果需要
)
)
我想知道:

  • 有没有更智能的方法来读取大量文件?
  • 将元数据文件复制到一个文件夹中会更有效吗?(与一个文件夹中的文件相比,遍历子文件夹的成本要高多少)
  • 是先将文件名与匹配,然后在
    ParDo
    s之后的一到两次读取和提取的方法吗

  • 看起来我好像是患了心脏病

    从ApacheBeam网站上关于的页面中获得灵感,我尝试在管道中添加一个
    Reshuffle

    我还升级到一个付费的谷歌云账户,因此获得了更高的配额。 这使得数据流更好地处理作业

    事实上,对于我的BiqQuery写作业,Dataflow希望扩展到251个工作人员。起初它没有提供更多的工人,所以我停止了工作,坐在
    --num_-workers=num_-workers
    --max_-num-workers=num_-workers
    ,其中
    num-workers
    是我项目的最大数量。当使用这些参数运行时,它会自动放大

    我的最终管道如下所示:

    将beam.Pipeline(选项=Pipeline_选项)作为管道:
    元=(
    管道
    |匹配文件(f'gs://{BUCKET}/{DATA_FOLDER}/*metadata.json')
    |ReadMatches()
    |beam.Reshuffle()
    |Map(lambda x:(x.metadata.path,x.read_utf8())
    |beam.ParDo(ExtractMetaData())
    )
    table_spec=bigquery.TableReference(
    datasetId=“sentinel_2”,
    tableId=“图像标签”,
    )
    (
    元
    |“写入BigQuery”>>beam.io.WriteToBigQuery(
    表2.1.1-1规范,
    schema=表\u schema(),
    write_disposition=beam.io.BigQueryDisposition.write_TRUNCATE
    )
    )
    
    附录
    我还得到了一个可能是解决方案的提示,但我尚未对其进行测试。

    这可能是由于在将文本源glob拆分为大量源时,管道遇到了数据流API限制

    当前的解决方案是使用不应在该过程中运行的转换


    将来,我们希望通过使用可拆分的DoFn框架,为这种情况更新transform
    ReadFromText

    谢谢!很高兴知道!