Python 数据流管道中WriteToText文件的错误2

Python 数据流管道中WriteToText文件的错误2,python,google-cloud-platform,google-cloud-storage,google-cloud-dataflow,apache-beam,Python,Google Cloud Platform,Google Cloud Storage,Google Cloud Dataflow,Apache Beam,我有一个带有多个ParDo转换的分支管道,这些转换被合并并写入GCS bucket中的文本文件记录 管道崩溃后,我收到以下消息: 工人与服务失去联系。 RuntimeError:FileNotFoundError:[Errno 2]未找到:gs://MYBUCKET/JOBNAME.00000-of-00001.avro[运行'WriteToText/WriteToText/WriteImpl/WriteBundles/WriteBundles'时] 它似乎找不到它一直在写入的日志文件。直到

我有一个带有多个
ParDo
转换的分支管道,这些转换被合并并写入GCS bucket中的文本文件记录

管道崩溃后,我收到以下消息:

  • 工人与服务失去联系。
  • RuntimeError:FileNotFoundError:[Errno 2]未找到:gs://MYBUCKET/JOBNAME.00000-of-00001.avro[运行'WriteToText/WriteToText/WriteImpl/WriteBundles/WriteBundles'时]
它似乎找不到它一直在写入的日志文件。直到错误发生的某一点之前,它似乎是好的。我想用
try:
/
将其包裹起来,除了:
或断点,但我甚至不知道如何发现根本原因

有没有办法只写一个文件?还是只打开一个文件写入一次?它将数千个输出文件滥发到这个桶中,这是我想要消除的,可能是一个因素

将beam.Pipeline(argv=Pipeline_args)作为p:
csvlines=(
p |“从CSV读取”>>beam.io.ReadFromText(已知参数输入,跳过标题行=1)
|“将CSV解析为字典”>>beam.ParDo(Split())
|'将文件读入内存'>>beam.ParDo(下载filesdofn())
|“开窗”>>梁.开窗(窗.固定窗(20*60))
)
b1=(csvlines |'Branch1'>>beam.ParDo(Branch1DoFn())
b2=(csvlines |'Branch2'>>beam.ParDo(Branch2DoFn())
b3=(csvlines |'Branch3'>>beam.ParDo(Branch3DoFn())
b4=(csvlines |'Branch4'>>beam.ParDo(branch4doff())
b5=(csvlines |'Branch5'>>beam.ParDo(Branch5DoFn())
b6=(csvlines |'Branch6'>>beam.ParDo(Branch6DoFn())
输出=(
(b1、b2、b3、b4、b5、b6)|“合并PCollections”>>梁展平()
|'WriteToText'>>beam.io.Write(beam.io.textio.WriteToText(已知参数输出))
)

此问题链接到上一个问题,其中包含有关实施的更多详细信息。那里的解决方案建议在
start\u bundle()
中创建一个
google.cloud.storage.Client()的实例,每次调用
ParDo(DoFn)
。它连接到同一个gcs存储桶-通过
WriteToText(已知参数输出)

类下载文件DoFn(beam.DoFn):
定义初始化(自):
进口稀土
self.gcs\u path\u regex=re.compile(r'gs:\/\/([^\/]+)\/(.*))
def启动捆绑包(自):
导入google.cloud.storage
self.gcs=google.cloud.storage.Client()
def流程(自身、要素):
self.file\u match=self.gcs\u path\u regex.match(元素['Url'])
self.bucket=self.gcs.get_bucket(self.file_match.group(1))
self.blob=self.bucket.get\u blob(self.file\u match.group(2))
self.f=self.blob.download_as_bytes()
此错误的原因可能与与与客户端的连接过多有关。我不清楚这方面的良好实践——因为您可以通过这种方式为每个捆绑包设置网络连接

将其添加到末尾以从捆绑包末尾的内存中删除客户机对象应有助于关闭一些不必要的延迟连接

def finish_bundle(自):
del self.gcs,self.gcs\u path\u regex

关于您的错误,您是否可以共享整个代码,以便我可以检查它,我需要知道您编写的函数发生了什么情况。最后,默认情况下,ApacheBeam将输出写入所需前缀后面的多个文件中。但是,如果您只想将一个文件作为输出,您可以使用
WriteToText
方法中的
num_shards
对其进行设置。谢谢@AlexandreMoraes-此问题中显示了代码: