在PyODPS节点中调用第三方包

本文为您介绍在依赖普通的Python脚本和开源第三方包的场景下,如何使用DataWorks PyODPS节点调用第三方包。

背景信息

  • 在DataWorks资源组本地运行PyODPS节点代码时,若代码中需要调用第三方包,需要根据任务使用的资源组不同,采用不同方式在资源组上准备第三方包环境:

  • 如果您的PyODPS任务需要访问特殊的网络环境(如VPC网络或IDC网络中的数据源或服务等),请使用新版资源组或旧版独享调度资源组,并参考网络连通方案打通资源组与目标环境的网络连通。

  • PyODPS语法及更多信息请参见PyODPS文档

  • PyODPS节点分为PyODPS 2和PyODPS 3两种,二者的区别在于底层Python语言版本不同。PyODPS 2底层Python语言版本为Python 2,PyODPS 3底层Python语言版本为Python 3,请您根据实际使用的Python语言版本创建PyODPS节点。更多创建PyODPS节点信息,请参见开发PyODPS 2任务开发PyODPS 3任务

使用限制

  • DataWorks建议您在PyODPS节点内获取到本地处理的数据不超过50 MB,该操作受限于DataWorks执行资源的不同规格处理的本地数据过多并超出操作系统阈值时可能发生OOM(Got killed)错误。请避免在PyODPS节点中写入过多的数据处理代码。详情请参见PyODPS概述

  • 如果您发现有Got killed报错,即表明内存使用超限,进程被中止。因此,请尽量避免本地的数据操作。通过PyODPS发起的SQL和DataFrame任务(除to_pandas外)不受此限制。

  • 使用独享调度资源组时,非自定义函数代码可以使用平台预装的NumPy和Pandas。不支持其他带有二进制代码的第三方包。

  • 由于兼容性原因,在DataWorks中,options.tunnel.use_instance_tunnel默认设置为False。如果需要全局开启instance tunnel,需要手动将该值设置为True。

依赖普通的Python脚本

  1. 进入数据开发页面。

    登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的数据建模与开发 > 数据开发,在下拉框中选择对应工作空间后单击进入数据开发

  2. 创建Python资源。

    1. DataStudio(数据开发)页面,鼠标悬停至新建图标,单击新建资源 > Python

      您也可以展开业务流程目录下的目标业务流程,右键单击MaxCompute,选择新建资源 > Python

    2. 新建资源对话框中,输入名称(示例为pyodps_packagetest.py)。

      重要

      资源名称只能包含中文、字母、数字、点、下划线(_)、减号(-),且必须加后缀名.py

    3. 单击新建

    4. 在新建的Python资源中,输入需要引用的Python脚本,示例如下。

      # import os
      # print os.getcwd()
      # print os.path.abspath('.')
      # print os.path.abspath('..')
      # print os.path.abspath(os.curdir)
      
      def printname():
          print 'test2'
      print 123
    5. 单击工具栏中的提交图标。

  3. 创建PyODPS 2节点。

    1. 展开业务流程目录下的目标业务流程,右键单击MaxCompute,选择新建节点 > PyODPS 2

    2. 新建节点对话框中,输入名称(示例为pyodps_testpackage)。

      说明

      节点名称必须是大小写字母、中文、数字、下划线(_)和小数点(.),且不能超过128个字符。

    3. 单击确认

  4. 打开PyODPS 2节点的编辑页面,右键单击目标Python资源名称,选择引用资源

    引用后,PyODPS 2节点中会自动写入引用语句##@resource_reference{"pyodps_packagetest.py"}

    pyodps插图

  5. 在PyODPS 2节点内输入引用Python脚本的代码,示例如下。

    ##@resource_reference{"pyodps_packagetest.py"} #用于引用之前新建的Python资源,该语句必须添加。
    
    import sys
    import os
    sys.path.append(os.path.dirname(os.path.abspath('pyodps_packagetest.py'))) #引入资源至工作空间。
    import pyodps_packagetest #引用资源,资源名需要删除后缀.py。
    pyodps_packagetest.printname() #调用方法。
  6. 单击工具栏中的运行图标,在页面下方的运行日志区域查看结果。

    查看结果

依赖开源的三方包

如果您依赖一个开源的第三方包,需要使用PIP安装,可根据所使用的资源组不同,按需选择:

新版资源组(通用型资源组)配置第三方包

新版资源组支持自定义镜像,您可以根据需要,在创建自定义镜像时,选择所需的第三方包进行安装。然后在PyODPS任务的调度配置中,使用此镜像。

配置说明

在创建镜像页面,按需配置需要的第三方包。创建镜像的更多参数,请参见创建自定义镜像

关键参数:

  • 镜像名称/IDdataworks_pyodps_task_pod

  • 支持任务类型:按需选择PyODPS2PyODPS3

  • 安装包:按需选择需要使用的第三方包

说明

更多详细配置,请参见自定义镜像配置示例

独享调度资源组配置第三方包

该方法使用独享调度资源组,需要在独享调度资源组的运维助手中安装第三方包,详情请参见运维助手

PyODPS节点分为PyODPS 2和PyODPS 3:

  • 如果依赖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

    安装了需要的三方包后,使用import命令导入对应包即可使用。例如,通过运维助手使用pip3 -install oss2语句安装了oss2这个Python依赖包后,您可以在PyODPS 3节点中使用import oss2语句导入oss2依赖包并使用。

    执行命令后,如果提示需要升级PIP版本,请执行如下命令。

    /home/tops/bin/pip3 install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

    如果使用PyODPS 3出现如下报错,请提交工单申请开启权限。

    "/home/admin/usertools/tools/cmd-0.sh:行3: /home/tops/bin/python3: 没有那个文件或目录"