我正在从Google Cloud Composer运行Dataflow,该dataflow脚本包含一些非标准的依赖项,例如zeep,googleads。
必须将其安装在dataflow worker节点上,因此我将它们与setup.py打包在一起。当我尝试在dag中运行此文件时,composer正在验证数据流文件并抱怨No module names Zeep , googleads
。因此,我创建了pythonvirtualenvoperator并安装了所需的所有非标准依赖项,并尝试运行数据流作业,但它仍然抱怨要导入zeep和googleads。
这是我的代码库:
PULL_DATA = PythonVirtualenvOperator(
task_id=PROCESS_TASK_ID,
python_callable=execute_dataflow,
op_kwargs={
'main': 'main.py',
'project': PROJECT,
'temp_location': 'gs://bucket/temp',
'setup_file': 'setup.py',
'max_num_workers': 2,
'output': 'gs://bucket/output',
'project_id': PROJECT_ID},
requirements=['google-cloud-storage==1.10.0', 'zeep==3.2.0',
'argparse==1.4.0', 'google-cloud-kms==0.2.1',
'googleads==15.0.2', 'dill'],
python_version='2.7',
use_dill=True,
system_site_packages=True,
on_failure_callback=on_failure_handler,
on_success_callback=on_success_handler,
dag='my-dag')
和我的python可调用代码:
def execute_dataflow(**kwargs):
import subprocess
TEMPLATED_COMMAND = """
python main.py \
--runner DataflowRunner \
--project {project} \
--region us-central1 \
--temp_location {temp_location} \
--setup_file {setup_file} \
--output {output} \
--project_id {project_id}
""".format(**kwargs)
process = subprocess.Popen(['/bin/bash', '-c', TEMPLATED_COMMAND])
process.wait()
return process.returncode
我的main.py文件
import zeep
import googleads
{Apache-beam-code to construct dataflow pipeline}
有什么建议吗?
答案 0 :(得分:0)
我的工作有requirements.txt
。它没有像您一样使用--setup_file
选项,而是指定以下内容:
--requirements_file prod_requirements.txt
这告诉DataFlow在运行作业之前在requirements.txt
中安装库。
参考:https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/
答案 1 :(得分:0)
使用带有import googleads, zeep
的示例数据流管道脚本,我建立了一个测试Composer环境。 DAG与您一样,而我也遇到相同的错误。
然后,我进行了一些更改,以确保可以在辅助计算机上找到依赖项。
在DAG中,我使用普通的PythonOperator
,而不是PythonVirtualenvOperator
。
我有数据流管道和设置文件(main.py
和setup.py
)in a Google Cloud Storage bucket,因此Composer可以找到它们。
安装文件中列出了我需要的要求列表zeep和googleads。我改编了here中的示例设置文件,对此进行了更改:
REQUIRED_PACKAGES = [
'google-cloud-storage==1.10.0', 'zeep==3.2.0',
'argparse==1.4.0', 'google-cloud-kms==0.2.1',
'googleads==15.0.2', 'dill'
]
setuptools.setup(
name='Imports test',
version='1',
description='Imports test workflow package.',
install_requires=REQUIRED_PACKAGES,
packages=setuptools.find_packages(),
cmdclass={
# Command class instantiated and run during pip install scenarios.
'build': build,
'CustomCommands': CustomCommands,
}
)
我的DAG是
with models.DAG( 'composer_sample',
schedule_interval=datetime.timedelta(days=1),
default_args=default_dag_args) as dag:
PULL_DATA = PythonOperator(
task_id='PULL_DATA',
python_callable=execute_dataflow,
op_kwargs={
'main': '/home/airflow/gcs/data/main.py',
'project': PROJECT,
'temp_location': 'gs://dataflow-imports-test/temp',
'setup_file': '/home/airflow/gcs/data/setup.py',
'max_num_workers': 2,
'output': 'gs://dataflow-imports-test/output',
'project_id': PROJECT_ID})
PULL_DATA
,未更改可调用的Python。但是,使用这种配置,我仍然会收到错误消息。
Next step,在Google Cloud Platform(GCP)控制台中,通过导航菜单转到“ Composer”,然后单击环境名称。在“ PyPI软件包”标签上,添加zeep和googleads,然后单击“提交”。更新环境需要一些时间,但可以。
在此步骤之后,我的管道能够导入依赖关系并成功运行。我还尝试使用GCP控制台上指示的依赖项来运行DAG,但未遵循setup.py
的要求。工作流再次中断,但是在不同的地方。因此,请务必在两个地方都标明它们。
答案 2 :(得分:0)
您需要在 Cloud Composer 环境中安装这些库(请查看 this link)。有一种方法可以在控制台中执行此操作,但我发现这些步骤更容易:
requirements.txt
的每一行如果您为库提供的版本太旧,您可能会收到错误消息,因此请根据需要检查日志并更新数字。