当标准的PyODPS功能无法满足复杂的业务需求时,开发者需要复用已有的Python代码逻辑,或利用开源库来完成任务。DataWorks核心方案包括通过资源引用加载本地脚本,或通过配置执行环境(自定义镜像或运维助手)来集成第三方库。本文介绍如何在DataWorks的PyODPS节点中调用自定义Python脚本或安装并使用开源第三方包,以扩展数据处理能力。
场景快速选择
根据您的环境和需求,选择对应的操作路径:
场景 | 资源组类型 | 方案 |
依赖开源三方包 | Serverless资源组 | |
独享调度资源组 | ||
仅依赖自定义的 | Serverless资源组/独享调度资源组 |
不同方案的主要流程如下图所示:
准备工作
在开始之前,请确保您理解以下两个关键概念,以决定您的配置方式。
PyODPS 2 VS PyODPS 3
PyODPS 2:基于 Python 2.7 环境。
PyODPS 3:基于 Python 3.7+ 环境。
建议:强烈推荐使用 PyODPS 3,因为Python 2已停止官方维护。本文主线教程将以PyODPS 3为例。
资源组:Serverless资源组 VS 独享调度资源组
说明您可以在DataWorks控制台工作空间详情的资源组页面,查看您工作空间绑定的资源组类型。
如果为通用型,则表示使用的Serverless资源组。
如果为数据调度,则表示使用的独享调度资源组。
通过自定义镜像安装三方包
此方法适用于Serverless资源组。
本教程将引导您完成一个完整的端到端案例:创建一个包含pendulum
包的自定义环境,并在PyODPS 3节点中调用它来获取并格式化特定时区的当前时间。
步骤一:创建包含 pendulum
的自定义镜像
自定义镜像是为Serverless资源组准备运行环境的方式。
登录DataWorks控制台,单击左侧导航栏上的镜像管理进入镜像管理页面。
切换至自定义镜像页签,进入自定义镜像列表页。
单击左上角的创建镜像按钮,在创建页面,配置以下关键参数:
参数
说明
镜像名称
自定义镜像的名称,例如
pyodps3_with_pendulum
。引用类型
选择DataWorks官方镜像。
镜像名称/ID
下拉选择DataWorks提供的官方镜像dataworks_pyodps_task_pod。
支持任务类型
选择PyODPS 3任务类型。
可同时选择PyODPS 2任务类型。
安装包
选择Python3,下拉选择系统提供的pendulum包。
更多安装命令说明,可参见附录:安装命令参考。
单击确认,完成自定义镜像创建。
在自定义镜像列表页,对目标镜像进行测试并发布。
仅当测试通过之后,方可发布。
在目标镜像操作列单击
,为自定义镜像绑定归属工作空间。
步骤二:创建并配置PyODPS 3节点
单击左侧导航栏的
,在下拉框中选择目标工作空间后单击进入数据开发。在已有的业务流程下创建一个新的PyODPS 3节点,例如命名为
pyodps_pendulum_test
。在
pyodps_pendulum_test
节点的代码编辑器中,编写Python 3代码:# 因为pendulum已在自定义镜像中安装,所以可以直接导入。Python3语法 import pendulum print("开始测试第三方包 pendulum...") try: # 使用pendulum获取“亚洲/上海”时区的当前时间 shanghai_time = pendulum.now('Asia/Shanghai') # 打印格式化后的时间和时区信息 print(f"成功导入 'pendulum' 包。") print(f"当前上海时间是: {shanghai_time.to_datetime_string()}") print(f"对应的时区是: {shanghai_time.timezone_name}") print("\n测试通过!PyODPS节点成功调用了第三方包。") except Exception as e: print(f"测试失败,发生错误: {e}")
步骤三:测试运行验证结果
单击工具栏
图标运行代码,在参数弹窗中选择您所创建的镜像
pyodps3_with_pendulum
。重要若找不到目标镜像,请将镜像绑定至当前工作空间。具体操作请参见步骤一的第6小步。
查看下方的运行日志,您将看到类似以下的输出,证明
pendulum
包已成功被调用:
步骤四:发布PyODPS 3节点
当完成测试后,需在节点编辑页面右侧的pyodps3_with_pendulum
。后续按正常流程发布节点至运维中心即可。
使用运维助手安装第三方包
此方法适用于旧版独享调度资源组,该类型资源组已不再推荐。建议您迁移至功能更强大、更灵活的Serverless资源组。
登录DataWorks工作空间列表,在顶部切换地域,然后找到目标工作空间,单击操作列的详情,进入工作空间详情页。
在左侧导航栏单击资源组,找到已绑定的独享调度资源组,单击操作列的
。在运维助手页面,单击左上角的创建命令。
根据您的Python版本输入相应命令:
Python 3 (PyODPS 3):保持其他默认选项,下拉选择Python3包类型下pendulum安装包。
Python 2 (PyODPS 2):选择手动输入模式,输入命令内容。
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple pip install "pendulum<2.0" -i https://pypi.tuna.tsinghua.edu.cn/simple
重要此处需要Serverless资源组绑定的VPC具备公网访问能力,具体操作请参见为资源组开通公网。
在运维助手页面,单击操作栏的运行命令。执行成功后,您便可以在对应的PyODPS节点中直接
import pendulum
使用。
依赖自定义 Python 脚本
如果您只是想调用自己写的另一个 .py
文件中的函数,操作如下:
创建Python资源:
在数据开发页面,右键单击目标业务流程,选择
。在新建资源对话框中,填写资源名称(示例名:
my_utils.py
),单击新建。在Python资源中输入如下代码。
# my_utils.py Python3语法 def say_hello(name): print(f"Hello, {name}! This is from my_utils module.")
保存并提交该资源。
创建PyODPS 3节点并引用资源:
在目标业务流程,右键单击MaxCompute,选择
,按界面完成节点创建。在节点中通过
##@resource_reference{"my_utils.py"}
引用上述资源,代码如下:##@resource_reference{"my_utils.py"} import sys import os #将资源所在的当前目录添加到Python解释器的搜索路径中 sys.path.append(os.path.dirname(os.path.abspath('my_utils.py'))) #现在可以像普通模块一样导入和使用了 import my_utils my_utils.say_hello("DataWorks")
运行节点,您将在日志中看到 "Hello, DataWorks! This is from my_utils module." 的输出。
常见问题
Q:通过命令手动安装包时,自定义镜像测试很久没进度。
如果任务运行的环境需要依赖位于公网的第三方包,则Serverless资源组绑定的VPC需要具备公网访问能力。具体操作请参见为资源组开通公网。
可切换尝试不同Python包来源,例如https://mirrors.aliyun.com/pypi/simple/。
Q:如果导入第三方包失败,请按以下步骤排查。
确认自定义镜像是否已发布成功。
确认镜像支持的任务类型(PyODPS 2/3)与您创建的节点类型匹配。
确认PyODPS节点的调度配置中,是否正确选择该自定义镜像。
资源组不可选择公共资源组。
检查安装的包版本是否与您的Python版本兼容(例如
pendulum
2.0+ 不支持Python 2)。
相关文档
附录:安装命令参考
如果使用自定义镜像的Script或运维助手的手动输入方式配置安装命令,则可以参考如下命令安装:
如果依赖PyODPS 2节点,请执行如下命令。
pip install <需要安装的包> -i https://pypi.tuna.tsinghua.edu.cn/simple
说明执行命令后,如果提示需要升级PIP版本,请执行命令
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
。如果依赖PyODPS 3节点,请执行如下命令。
/home/tops/bin/pip3 install <需要安装的包> -i https://pypi.tuna.tsinghua.edu.cn/simple
说明执行命令后,如果提示需要升级PIP版本,请执行命令
/home/tops/bin/pip3 install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
。如果出现报错
/home/admin/usertools/tools/cmd-0.sh:行3: /home/tops/bin/python3: 没有那个文件或目录
,请提交工单申请开启权限。