使用 Apache Beam 在 GCP DataflowRunner 上没有名为“IPython”的模块

Posted

技术标签:

【中文标题】使用 Apache Beam 在 GCP DataflowRunner 上没有名为“IPython”的模块【英文标题】:No module named 'IPython' on GCP DataflowRunner with Apache Beam 【发布时间】:2021-05-08 06:42:33 【问题描述】:

我在 Jupyter 笔记本中设置了一个相当简单的 Python Apache Beam 管道,并希望部署到 Dataflow 运行器。我对这三个都很陌生!我正在使用 Python 3 和 Apache Beam 2.27.0 内核。

我的管道选项如下所示:

options.view_as(GoogleCloudOptions).project = 'inspired-studio-11111'
options.view_as(GoogleCloudOptions).job_name = 'Dataflow Test Job2' + jobid
options.view_as(GoogleCloudOptions).region = 'us-central1'
options.view_as(GoogleCloudOptions).staging_location = 'gs://bucket/staging'
options.view_as(GoogleCloudOptions).temp_location = 'gs://bucket/temp'
options.view_as(SetupOptions).save_main_session = True

管道在笔记本中运行良好,并与 GCP 存储交互。当我将其设置为在 GCP 数据流运行器上运行并运行它时,我始终收到以下异常:

来自工作人员的错误消息:回溯(最近一次调用最后一次):文件“/usr/local/lib/python3.7/site-packages/dataflow_worker/batchworker.py”,第 771 行,运行 self._load_main_session(self .local_staging_directory) 文件“/usr/local/lib/python3.7/site-packages/dataflow_worker/batchworker.py”,第 512 行,_load_main_session pickler.load_session(session_file) 文件“/usr/local/lib/python3.7 /site-packages/apache_beam/internal/pickler.py”,第 318 行,在 load_session 中返回 dill.load_session(file_path) 文件“/usr/local/lib/python3.7/site-packages/dill/_dill.py”,第 368 行,在 load_session 模块 = unpickler.load() 文件中 "/usr/local/lib/python3.7/site-packages/dill/_dill.py",第 472 行,在加载 obj = StockUnpickler.load(self) 文件中“/usr/local/lib/python3.7/site-packages/dill/_dill.py”,第 462 行,在 find_class 返回 StockUnpickler.find_class(self, module, name) ModuleNotFoundError: No module named 'IPython'

在我的笔记本中安装和导入 ipython 没有帮助。这需要在 GCP 虚拟机的某个地方进行配置吗?

【问题讨论】:

【参考方案1】:

该错误通常是由使用 save_main_session=True 选项引起的。请参阅Handle nameerrors when launching Dataflow jobs with Apache Beam notebooks,了解有关确保工作人员在运行时拥有正确代码的其他方法的讨论。

【讨论】:

这是我需要的提示。我设置 options.view_as(SetupOptions).save_main_session = False 然后在我的情况下,DoFns 所需的所有导入以及它们所依赖的所有类只需要在 process() 方法本身中导入/定义。 GCP 数据流上的日志会告诉您哪些丢失以及在哪里丢失,直到它们全部被考虑在内。如果您想到它是有道理的,因为 DoFns 可以作为单独的作业运行。仍然不确定为什么 save_main_session 的行为不符合预期,但这种替代方法很好。

以上是关于使用 Apache Beam 在 GCP DataflowRunner 上没有名为“IPython”的模块的主要内容,如果未能解决你的问题,请参考以下文章

请求的身份验证范围不足 - GCP 上的 Dataflow/Apache Beam

GCP Dataflow + Apache Beam - 缓存问题

使用 Apache Beam 在 GCP DataflowRunner 上没有名为“IPython”的模块

从 Apache Beam(GCP 数据流)写入 ConfluentCloud

如何从 GCP 存储桶中读取 Apache Beam 中的多个文件

Apache Beam GCP 在动态创建的目录中上传 Avro