我正在尝试在DataflowRunner上测试我的数据流管道。我的代码总是在1小时1分钟停留并说:数据流似乎被卡住了。在挖掘Dataflow堆栈驱动程序的堆栈跟踪时,我遇到了错误data.table
。我看到其他堆栈溢出消息说当pip包不兼容时可能会导致这种情况。这导致我的工作人员启动总是失败。
这是我目前的setup.py。有人可以帮我理解我所缺少的东西。工作编号为2018-02-09_08_22_34-6196858167817670597。
setup.py
Failed to install packages: failed to install workflow: exit status 1
答案 0 :(得分:2)
在所需的setup.py
软件包中包括“工作流”软件包。包含错误后即可解决。
from setuptools import setup, find_packages
requires = [
'numpy==1.14.0',
'google-cloud-storage==1.7.0',
'pandas==0.22.0',
'sqlalchemy-vertica[pyodbc,turbodbc,vertica-python]==0.2.5',
'sqlalchemy==1.2.2',
'apache_beam[gcp]==2.2.0',
'google-cloud-dataflow==2.2.0',
'workflow' # Include this line
]
setup(
name="dataflow_pipeline_dependencies",
version="1.0.0",
description="Beam pipeline for flattening ism data",
packages=find_packages(),
install_requires=requires
)
答案 1 :(得分:1)
所以我发现在这种情况下工作流不是pypi包,而是实际上由Dataflow创建的包含源代码的.tar的名称。 Dataflow将压缩您的源代码并在暂存环境中创建workflow.tar文件,然后它将尝试运行pip install workflow.tar。如果此安装出现任何问题,则无法将软件包安装到工作程序上。
我的问题通过以下几点解决:1)我在我的要求中添加了六个== 1.10.0,因为我发现:工作流程失败。原因:(35af2d4d3e5569e4):数据流似乎卡住了,最新版本的六个版本存在问题。 2)我意识到sqlalchemy-vertica和sqlalchemy不同步并且存在依赖版本的问题。因此,我删除了对两者的需求,并找到了一个不同的vertica客户端。
答案 2 :(得分:0)
我处理大量的Python软件包以及如何管理每个软件包的所有版本,不兼容性和需求都不是天才。
但是,我可以阅读错误消息。
在您的情况下,消息显示“无法安装工作流程”。快速搜索谷歌后,我发现“workflow”实际上是一个Python包。
所以错误只是抱怨你没有安装workflow
并且尝试这样做失败了。
解决此问题:
workflow
。这是Google向我展示的最新版本。或的
pip install workflow
。任何一种方法都应该安装所需的包。 安装完成后,特定错误消息应该消失。
我希望这个答案能帮到你!
答案 3 :(得分:0)
您的行驶里程可能会有所不同,但对我而言,以上所有方法均无效(Python 3.7)。
相反,解决方案似乎是将我的依赖项保存在requirements.txt
文件中,然后将所有其他内容保存在setup.py
中。重要的是,我不将requirements.txt
行加载到install_requires
属性中。无论采用哪种方式,无论是否使用workflow
,都使用install_requires
似乎会导致我遇到此错误。
相反,我的setup.py
根本没有指定依赖项。运行管道时,我同时给出了--requirements_file
和--setup_file
参数。那为我解决了这个问题,并且管道的构建和启动方式有明显的不同,因为依赖项以这种方式存储在登台位置中,而之前则没有。
例如:
setup.py
import setuptools
setuptools.setup(
name='my_pipeline',
version='0.0.0',
packages=setuptools.find_packages()
)
requirements.txt
google-cloud-bigquery==1.24.0
google-cloud-storage==1.25.0
jinja2==2.11.1
[...etc...]
run_pipeline.sh
#!/usr/bin/env bash
[...code to set vars...]
if [ "${1}" = "dataflow" ]; then
RUNNER="--runner DataflowRunner"
fi
python "${PIPELINE_FILE}" \
--output "${OUTPUT}" \
--project myproject \
--region us-west1 \
--temp_location "${TEMP}" \
--staging_location "${STAGING}" \
--no_use_public_ips \
--requirements_file requirements.txt \
--setup_file "./setup.py" \
${RUNNER}