Python Apache beam DataFlow runner抛出设置错误
我们正在使用Beam Python SDK构建数据管道,并尝试在Dataflow上运行,但出现以下错误:Python Apache beam DataFlow runner抛出设置错误,python,google-cloud-dataflow,apache-beam,Python,Google Cloud Dataflow,Apache Beam,我们正在使用Beam Python SDK构建数据管道,并尝试在Dataflow上运行,但出现以下错误: A setup error was detected in beamapp-xxxxyyyy-0322102737-03220329-8a74-harness-lm6v. Please refer to the worker-startup log for detailed information. 但找不到详细的工作程序启动日志 我们尝试增加内存大小、工作计数等,但仍然得到相同的错误 这
A setup error was detected in beamapp-xxxxyyyy-0322102737-03220329-8a74-harness-lm6v. Please refer to the worker-startup log for detailed information.
但找不到详细的工作程序启动日志
我们尝试增加内存大小、工作计数等,但仍然得到相同的错误
这是我们使用的命令
python run.py \
--project=xyz \
--runner=DataflowRunner \
--staging_location=gs://xyz/staging \
--temp_location=gs://xyz/temp \
--requirements_file=requirements.txt \
--worker_machine_type n1-standard-8 \
--num_workers 2
管道片段
data = pipeline | "load data" >> beam.io.Read(
beam.io.BigQuerySource(query="SELECT * FROM abc_table LIMIT 100")
)
data | "filter data" >> beam.Filter(lambda x: x.get('column_name') == value)
上面的管道只是从BigQuery加载数据,并基于某个列值进行过滤。此管道在DirectRunner中工作得很好,但在数据流中失败
我们有没有明显的设置错误?还有谁会犯同样的错误?我们需要一些帮助来解决这个问题
更新:
我们的管道代码分布在多个文件中,因此我们创建了一个python包。我们通过传递
--setup\u file
参数而不是--requirements\u file
解决了设置错误问题。我们通过向数据流发送一组不同的参数来解决此设置错误问题。我们的代码分布在多个文件中,因此必须为其创建一个包。如果我们使用--requirements\u file
,作业将启动,但最终会失败,因为它无法在workers中找到包。beampythonsdk有时不会为这些任务抛出显式错误消息,而是会重试该作业并失败。要使代码与包一起运行,需要传递--setup\u file
参数,该参数中列出了依赖项。确保由python setup.py sdist
命令创建的包包含管道代码所需的所有文件
如果您有一个私有托管的python包依赖项,则将路径传递给package.tar.gz文件。更好的方法是存储在GCS存储桶中,并在此处传递路径
我已经编写了一个示例项目来开始使用数据流上的Apache Beam Python SDK-
在这里阅读-我正在使用ApacheBeam/Dataflow构建一个预测管道。我需要在远程工作者可用的依赖项中包含模型文件。数据流作业失败,错误日志相同:
Error message from worker: A setup error was detected in beamapp-xxx-xxxxxxxxxx-xxxxxxxx-xxxx-harness-xxxx. Please refer to the worker-startup log for detailed information.
但是,此错误消息没有提供有关工作程序启动日志的任何详细信息。最后,我找到了一种方法来记录worker日志并解决这个问题
众所周知,Dataflow创建计算引擎来运行作业并在其上保存日志,以便我们可以访问vm以查看日志。我们可以通过SSH从GCP控制台连接到数据流作业使用的vm。然后我们可以检查位于/var/log/dataflow/taskrunner/harness
中的boot json.log
文件:
$ cd /var/log/dataflow/taskrunner/harness
$ cat boot-json.log
这里我们要注意。在批处理模式下运行时,Dataflow创建的vm是短暂的,并且在作业失败时关闭。如果虚拟机已关闭,我们将无法再访问它。但包含失败项的进程会重试4次,因此通常我们有足够的时间打开boot json.log
,看看发生了什么
最后,我将Python安装解决方案放在这里,这可能会帮助其他人:
main.py
舱单
setup.py
运行数据流管道
$ python main.py --setup_file=/absolute/path/to/setup.py ...
您可以在GCP Stackdriver中找到日志(转到GCP控制台->日志->日志并选择DataFlow作业,但失败了)。我们的管道代码分布在多个文件中,因此我们创建了一个python包。我们通过传递
--setup\u file
参数解决了安装错误问题。--requirements\u file和--setup\u文件在过去对我不起作用,所以我建议您使用--extra\u包并传递模块的tar.gz,您可以通过调用python setup.py sdist
来获得它。我认为将您的更新作为
include models/*.*
REQUIRED_PACKAGES = [...]
setuptools.setup(
...
include_package_data=True,
install_requires=REQUIRED_PACKAGES,
packages=setuptools.find_packages()
)
$ python main.py --setup_file=/absolute/path/to/setup.py ...