Python 数据流错误:';客户机具有非平凡状态,该状态是本地的且不可争用的';

Python 数据流错误:';客户机具有非平凡状态,该状态是本地的且不可争用的';,python,google-cloud-dataflow,pickle,apache-beam,Python,Google Cloud Dataflow,Pickle,Apache Beam,我有一个管道,我可以在本地执行,没有任何错误。我过去常常在本地运行的管道中遇到此错误 'Clients have non-trivial state that is local and unpickleable.' PicklingError: Pickling client objects is explicitly not supported. 我相信我通过降级到ApacheBeam=2.3.0解决了这个问题 然后在本地它就会运行得很好 现在我使用的是DataflowRu

我有一个管道,我可以在本地执行,没有任何错误。我过去常常在本地运行的管道中遇到此错误

    'Clients have non-trivial state that is local and unpickleable.'
     PicklingError: Pickling client objects is explicitly not supported.
我相信我通过降级到ApacheBeam=2.3.0解决了这个问题 然后在本地它就会运行得很好

现在我使用的是DataflowRunner,在requirements.txt文件中,我有以下依赖项

    apache-beam==2.3.0
    google-cloud-bigquery==1.1.0
    google-cloud-core==0.28.1
    google-cloud-datastore==1.6.0
    google-cloud-storage==1.10.0
    protobuf==3.5.2.post1
    pytz==2013.7
但我又犯了这个可怕的错误

    'Clients have non-trivial state that is local and unpickleable.'
     PicklingError: Pickling client objects is explicitly not supported.
为什么它会给我DataflowRunner的错误,而不是DirectRunner?他们不应该使用相同的依赖项/环境吗? 任何帮助都将不胜感激

我读到这是解决问题的方法,但当我尝试它时,我仍然得到同样的错误

    class MyDoFn(beam.DoFn):

        def start_bundle(self, process_context):
            self._dsclient = datastore.Client()

        def process(self, context, *args, **kwargs):
        # do stuff with self._dsclient

我以前在本地修复此问题的参考帖子:


提前谢谢

start\u bundle
方法中初始化不可点击的客户端是一种正确的方法,Beam IOs通常会遵循这一方法,请参见示例。下面是一个管道,它使用DoFn中的GCS python客户端执行简单操作。我在ApacheBeam2.16.0上运行了它,没有任何问题。如果您仍然可以复制您的问题,请提供其他详细信息

gcs_client.py文件:

import argparse
import logging
import time

import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
from google.cloud import storage

class MyDoFn(beam.DoFn):
  def start_bundle(self):
    self.storage_client = storage.Client()

  def process(self, element):
    bucket = self.storage_client.get_bucket("existing-gcs-bucket")
    blob = bucket.blob(str(int(time.time())))
    blob.upload_from_string("payload")
    return element

logging.getLogger().setLevel(logging.INFO)
_, options = argparse.ArgumentParser().parse_known_args()

pipeline_options = PipelineOptions(options)
p = beam.Pipeline(options=pipeline_options)
_ = p | beam.Create([None]) | beam.ParDo(MyDoFn())

p.run().wait_until_finish()
requirements.txt文件:

google-cloud-storage==1.23.0
命令行:

python -m gcs_client \
    --project=insert_your_project \
    --runner=DataflowRunner \
    --temp_location gs://existing-gcs-bucket/temp/ \
    --requirements_file=requirements.txt \
    --save_main_session

在让数据流向Bigtable写入一堆行时,我遇到了类似的问题。将
--save main session
设置为
False
似乎已经解决了这个问题。

是否获得堆栈跟踪?设计用于在部署之前验证管道,并确保其在各种波束运行器中的健壮性。因此,如果DataflowRunner与DirectRunner在同一个Beam版本上运行,那么它应该在DataflowRunner上工作。您可以共享作业的堆栈跟踪或日志吗?在尝试从管道将数据写入BigQuery表时,我遇到了类似的数据流问题,尽管它是从DirectRunner运行的。在从数据流写入BigQuery时,是否有人遇到过类似的问题。对于我来说,设置--save main session to False不起作用