Apache beam DataFlow runner抛出设置错误

时间:2018-03-23 05:05:53

标签: 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.

但找不到详细的工作者启动日志。

我们尝试增加内存大小,工作人员数量等,但仍然遇到相同的错误。

这是我们使用的命令,

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中的一个魅力,但在Dataflow上失败了。

我们是否有任何明显的设置错误?其他人得到同样的错误?我们可以使用一些帮助来解决问题。

更新

我们的管道代码分布在多个文件中,因此我们创建了一个python包。我们通过传递--setup_file参数而不是--requirements_file解决了设置错误问题。

2 个答案:

答案 0 :(得分:1)

我们通过向数据流发送一组不同的参数来解决此安装错误问题。我们的代码分布在多个文件中,因此必须为它创建一个包。如果我们使用--requirements_file,作业将启动,但最终会失败,因为它无法在工作人员中找到包。 Beam Python SDK有时不为这些抛出显式错误消息,它将重试该作业并失败。要使代码与代码一起运行,您需要传递--setup_file参数,该参数中包含依赖项。确保python setup.py sdist命令创建的包包含管道代码所需的所有文件。

如果您有一个私有托管的python包依赖项,那么将--extra_package传递给package.tar.gz文件的路径。更好的方法是存储在GCS存储桶中并在此处传递路径。

我已经编写了一个示例项目来开始使用Dataflow上的Apache Beam Python SDK - https://github.com/RajeshHegde/apache-beam-example

在此处阅读 - https://medium.com/@rajeshhegde/data-pipeline-using-apache-beam-python-sdk-on-dataflow-6bb8550bf366

答案 1 :(得分:0)

我正在使用Apache Beam / 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-startup日志的任何详细信息。最后,我找到了一种记录工作人员并解决问题的方法。

众所周知,Dataflow创建了计算引擎来运行作业并在其上保存日志,以便我们可以访问vm来查看日志。我们可以通过SSH从GCP控制台连接到Dataflow作业正在使用的虚拟机。然后,我们可以检查位于boot-json.log中的/var/log/dataflow/taskrunner/harness文件:

$ cd /var/log/dataflow/taskrunner/harness
$ cat boot-json.log

在这里我们应该注意。当以批处理模式运行时,由Dataflow创建的虚拟机是临时的,并在作业失败时关闭。如果虚拟机已关闭,我们将无法再访问它。但是,包含失败项的过程将重试4次,因此通常我们有足够的时间打开boot-json.log并查看发生了什么。

最后,我将我的Python设置解决方案放在这里,这可能会对其他人有所帮助:

main.py

...
model_path = os.path.dirname(os.path.abspath(__file__)) + '/models/net.pd'
# pipeline code
...

MANIFEST.in

include models/*.*

setup.py complete example

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 ...