这个错误是由于在Beam应用程序中使用了错误的方法来关闭PubSub通道引起的。正确的方法是使用close()
方法来关闭通道。
下面是一个示例解决方法:
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
from apache_beam.io.gcp.pubsub import ReadFromPubSub
class MyOptions(PipelineOptions):
@classmethod
def _add_argparse_args(cls, parser):
parser.add_argument('--input_topic', help='Input PubSub topic')
parser.add_argument('--output_topic', help='Output PubSub topic')
def process(element):
# 处理逻辑
return element
def run():
options = MyOptions()
pipeline = beam.Pipeline(options=options)
# 从PubSub主题读取数据
messages = (pipeline
| 'Read from PubSub' >> ReadFromPubSub(topic=options.input_topic))
# 处理数据
processed_messages = (messages
| 'Process Data' >> beam.Map(process))
# 将数据写入PubSub主题
_ = (processed_messages
| 'Write to PubSub' >> beam.io.WriteToPubSub(topic=options.output_topic))
# 运行管道
pipeline.run().wait_until_finish()
if __name__ == '__main__':
run()
在这个示例中,我们使用pipeline.run().wait_until_finish()
来运行Beam管道。在管道运行结束之后,自动关闭所有的资源,包括PubSub通道。因此,不需要手动关闭通道。
如果你仍然想手动关闭通道,你可以在run()
函数中添加以下代码:
from apache_beam.io.gcp.pubsub import PubsubClient
def run():
options = MyOptions()
pipeline = beam.Pipeline(options=options)
# 从PubSub主题读取数据
messages = (pipeline
| 'Read from PubSub' >> ReadFromPubSub(topic=options.input_topic))
# 处理数据
processed_messages = (messages
| 'Process Data' >> beam.Map(process))
# 将数据写入PubSub主题
_ = (processed_messages
| 'Write to PubSub' >> beam.io.WriteToPubSub(topic=options.output_topic))
# 运行管道
result = pipeline.run()
result.wait_until_finish()
# 手动关闭PubSub通道
client = PubsubClient()
client.channel.close()
if __name__ == '__main__':
run()
请注意,在大多数情况下,你不需要手动关闭通道,因为Beam会自动处理资源的关闭。这个示例只是为了演示如何手动关闭通道。
下一篇:beam中的'p”代表什么?