任务:我要运行一个ETL作业,该作业将从GCS中提取TIFF图像,并使用OpenCV + Tesseract等开源计算机视觉工具将这些图像转换为文本,并最终加载数据导入BigQuery
问题:我试图使用Dataflow来执行ETL作业,因为我有数百万个图像(每个图像是一个单独的文件/ blob),并且想要扩展到数百台计算机。但是,我在使用Dataflow时遇到了一些问题,有关如何下载图像的最佳方法将在下面进行详细介绍。
问题:最终,我试图确定:
1)数据流是做到这一点的最佳解决方案吗?我考虑过的替代方法是在大型计算机上运行多线程作业。我还应该考虑其他选择吗?
2)如果数据流是最好的解决方案,那么我应该如何专门处理下载数百万个图像(以便可以通过转换来运行它们)?
技术挑战:
以下帖子Recommended solution建议在DoFn中使用beam.io.gcp.gcsio.GcsIO().open(filepath, 'r')
从GCS下载图像。
我尝试使用beam.io.gcp.gcsio.GcsIO().open(filepath, 'r')
走这条路,但是,打开图像时遇到问题。此处描述了该问题:IO.BufferReader issue。
使用DirectRunner
时,我可以使用此客户端api from google.cloud import storage
下载图像文件,并且可以打开和预处理图像。但是,在使用数据流运行器时,我遇到了依赖问题,AttributeError: 'module' object has no attribute 'storage'
。
话虽这么说,如果Dataflow是最佳解决方案,那么下载和处理数百万张图像的最佳方法是什么?
答案 0 :(得分:0)
您在做正确的思考。看来您遇到了两个问题:
对于package-lock.json
问题,您需要添加一个接口,以便您正确找到in the question后即可进入Tiff文件。
似乎使用io.BufferedReader
的问题在于在Dataflow环境中不存在依赖项。要添加此依赖性,请查看Beam文档中的Managing Python pipeline dependencies。
主要思想是,您可以使用传入的google.cloud.storage
文件来运行管道,列出要添加的所有其他依赖项。