在PyODPS节点中调用第三方包

当标准的PyODPS功能无法满足复杂的业务需求时,开发者需要复用已有的Python代码逻辑,或利用开源库来完成任务。DataWorks核心方案包括通过资源引用加载本地脚本,或通过配置执行环境(自定义镜像或运维助手)来集成第三方库。本文介绍如何在DataWorksPyODPS节点中调用自定义Python脚本或安装并使用开源第三方包,以扩展数据处理能力。

场景快速选择

根据您的环境和需求,选择对应的操作路径:

场景

资源组类型

方案

依赖开源三方包

Serverless资源组

通过自定义镜像安装三方包

独享调度资源组

使用运维助手安装第三方包

仅依赖自定义的.py脚本文件

Serverless资源组/独享调度资源组

依赖自定义 Python 脚本

不同方案的主要流程如下图所示:

image

准备工作

在开始之前,请确保您理解以下两个关键概念,以决定您的配置方式。

  1. PyODPS 2 VS PyODPS 3

    • PyODPS 2:基于 Python 2.7 环境。

    • PyODPS 3:基于 Python 3.7+ 环境。

    • 建议强烈推荐使用 PyODPS 3,因为Python 2已停止官方维护。本文主线教程将以PyODPS 3为例。

  2. 资源组:Serverless资源组 VS 独享调度资源组

    • Serverless资源组推荐使用。弹性、免运维,通过自定义镜像来管理第三方依赖,功能强大且灵活。

    • 独享调度资源组:旧版方案,不再推荐。需要手动维护资源组,通过运维助手安装依赖,限制较多。

    说明

    您可以在DataWorks控制台工作空间详情资源组页面,查看您工作空间绑定的资源组类型。

    • 如果为通用型,则表示使用的Serverless资源组。

    • 如果为数据调度,则表示使用的独享调度资源组。

通过自定义镜像安装三方包

重要

此方法适用于Serverless资源组。

本教程将引导您完成一个完整的端到端案例:创建一个包含pendulum包的自定义环境,并在PyODPS 3节点中调用它来获取并格式化特定时区的当前时间。

步骤一:创建包含 pendulum 的自定义镜像

自定义镜像是为Serverless资源组准备运行环境的方式。

  1. 登录DataWorks控制台,单击左侧导航栏上的镜像管理进入镜像管理页面。

  2. 切换至自定义镜像页签,进入自定义镜像列表页。

  3. 单击左上角的创建镜像按钮,在创建页面,配置以下关键参数:

    参数

    说明

    镜像名称

    自定义镜像的名称,例如pyodps3_with_pendulum

    引用类型

    选择DataWorks官方镜像

    镜像名称/ID

    下拉选择DataWorks提供的官方镜像dataworks_pyodps_task_pod

    支持任务类型

    选择PyODPS 3任务类型。

    可同时选择PyODPS 2任务类型。

    安装包

    选择Python3,下拉选择系统提供的pendulum包。

    更多安装命令说明,可参见附录:安装命令参考

    当您选择Python2时,查看配置。

    选择script模式,使用 Python 2 的 pip 命令。

    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
    pendulum 2.0+版本不再支持Python 2,因此需要指定安装旧版本。若镜像发布时测试失败,可尝试替换来源地址为https://mirrors.aliyun.com/pypi/simple/。
    重要

    此处需要Serverless资源组绑定的VPC具备公网访问能力,具体操作请参见为资源组开通公网

  4. 单击确认,完成自定义镜像创建。

  5. 自定义镜像列表页,对目标镜像进行测试发布

    仅当测试通过之后,方可发布。
  6. 在目标镜像操作列单击image > 修改归属工作空间,为自定义镜像绑定归属工作空间。

    image

步骤二:创建并配置PyODPS 3节点

  1. 单击左侧导航栏的数据开发与运维 > 数据开发,在下拉框中选择目标工作空间后单击进入数据开发

  2. 在已有的业务流程下创建一个新的PyODPS 3节点,例如命名为 pyodps_pendulum_test

  3. 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}")

    当您使用PyOPDS 2节点时,单击查看代码。

    # -*- coding: utf-8 -*- Python2语法
    import pendulum
    
    print "开始测试第三方包 pendulum..." # 使用 print 语句
    try:
        # 使用pendulum获取“亚洲/上海”时区的当前时间
        shanghai_time = pendulum.now('Asia/Shanghai')
        
        # 打印格式化后的时间和时区信息
        print "成功导入 'pendulum' 包。"
        print "当前上海时间是: {0}".format(shanghai_time.to_datetime_string())
        print "对应的时区是: {0}".format(shanghai_time.timezone_name)
    
        print "\n测试通过!PyODPS节点成功调用了第三方包。"
    except Exception as e:
        print "测试失败,发生错误: {0}".format(e)

步骤三:测试运行验证结果

  1. 单击工具栏**图标运行代码,在参数弹窗中选择您所创建的镜像pyodps3_with_pendulum

    重要

    若找不到目标镜像,请将镜像绑定至当前工作空间。具体操作请参见步骤一的第6小步。

  2. 查看下方的运行日志,您将看到类似以下的输出,证明pendulum包已成功被调用:

    image

步骤四:发布PyODPS 3节点

当完成测试后,需在节点编辑页面右侧的调度配置 > 资源属性,选择准备的Serverless资源组并修改镜像为创建的镜像pyodps3_with_pendulum。后续按正常流程发布节点至运维中心即可。

使用运维助手安装第三方包

重要

此方法适用于旧版独享调度资源组,该类型资源组已不再推荐。建议您迁移至功能更强大、更灵活的Serverless资源组。

  1. 登录DataWorks工作空间列表,在顶部切换地域,然后找到目标工作空间,单击操作列的详情,进入工作空间详情页。

  2. 在左侧导航栏单击资源组,找到已绑定的独享调度资源组,单击操作列的image > 运维助手

  3. 运维助手页面,单击左上角的创建命令

  4. 根据您的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具备公网访问能力,具体操作请参见为资源组开通公网

  5. 运维助手页面,单击操作栏的运行命令。执行成功后,您便可以在对应的PyODPS节点中直接 import pendulum 使用。

依赖自定义 Python 脚本

如果您只是想调用自己写的另一个 .py 文件中的函数,操作如下:

  1. 创建Python资源

    1. 在数据开发页面,右键单击目标业务流程,选择新建资源 > MaxCompute > Python

    2. 新建资源对话框中,填写资源名称(示例名:my_utils.py),单击新建

    3. Python资源中输入如下代码。

      # my_utils.py Python3语法
      def say_hello(name):
          print(f"Hello, {name}! This is from my_utils module.")
    4. 保存并提交该资源。

  2. 创建PyODPS 3节点并引用资源

    • 在目标业务流程,右键单击MaxCompute,选择新建节点 > PyODPS 3,按界面完成节点创建。

    • 在节点中通过##@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")
  3. 运行节点,您将在日志中看到 "Hello, DataWorks! This is from my_utils module." 的输出。

常见问题

  • Q:通过命令手动安装包时,自定义镜像测试很久没进度。

    • 如果任务运行的环境需要依赖位于公网的第三方包,则Serverless资源组绑定的VPC需要具备公网访问能力。具体操作请参见为资源组开通公网

    • 可切换尝试不同Python包来源,例如https://mirrors.aliyun.com/pypi/simple/。

  • Q:如果导入第三方包失败,请按以下步骤排查。

    1. 确认自定义镜像是否已发布成功

    2. 确认镜像支持的任务类型(PyODPS 2/3)与您创建的节点类型匹配。

    3. 确认PyODPS节点的调度配置中,是否正确选择该自定义镜像。

      资源组不可选择公共资源组。
    4. 检查安装的包版本是否与您的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: 没有那个文件或目录,请提交工单申请开启权限。