Google cloud platform 使用Apache Beam读取大量文件的可扩展方式?
我正在编写一个管道,需要从位于我的Google Cloud Bucket上的中读取元数据文件(500.000多个文件) 它在一个小的子集上工作得很好,但是当我在完整的数据集上运行它时,它似乎在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_选项)作为
“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
。谢谢!很高兴知道!