我有一个 Dataflow Flex 模板,我正在尝试运行它,它必须安装一个私人存储库。我遵循了 Beam 文档here,它表示使用 --extra_package 管道选项来指定 tarball 的路径,而 Dataflow 文档here表示将该选项指定为元数据文件中的参数:
{
"description": "Dataflow flex template test",
"name": "dataflow-flex-test",
"parameters": [
{
"name": "kafka_topic",
"label": "kafka_topic",
"helpText": "Specify a confluent kafka topic to read from."
},
{
"name": "extra_package",
"label": "extra_package",
"helpText": "Specify a local package."
}
]
}
这是我的运行命令:
gcloud dataflow flex-template run ${JOB_NAME} \
--template-file-gcs-location ${GCS_PATH}/templates/${TEMPLATE_TAG}/${TEMPLATE_NAME}.json \
--region ${GCP_REGION} \
--staging-location ${GCS_PATH}/staging \
--temp-location ${GCS_PATH}/temp \
--subnetwork ${SUBNETWORK} \
--parameters kafka_topic=${KAFKA_TOPIC} \
--parameters extra_package=${PACKAGE}
其中 package 只是我的包的名称
ModuleNotFoundError: No module named <my_module>
我想知道 Flex 模板是否支持 extra_package 选项?我查看了日志,extra_package 在启动参数中,但它似乎什么也没做。我还检查了包含 SDK tarball、腌制主会话等的临时存储桶 - 当我认为它应该存在时,它也不存在。如何安装我的私人存储库以用于 Dataflow 作业?谢谢你。
我通过忽略 --extra_package 命令行选项并使用 $FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES 环境变量在 Dockerfile 中指定我的自定义包来实现此工作。这正确地将其安装在工人身上。我在目录中使用了 tar.gz 文件以及我的 Dockerfile。
这对我有用......确保 Dockerfile 从我的项目根目录引用 setup.py (在我的例子中是 /template )
#Dockerfile
ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="/template/setup.py"
然后确保 setup.py 使用相对路径列出我的子目录模块:
#setup.py
import setuptools
from setuptools import find_packages
setuptools.setup(
packages=find_packages() +
find_packages(where="./models") +
find_packages(where="./pardo") +
find_packages(where="./utils"),
install_requires=[],
name="Dataflow stuff"
)