自定义镜像

当 DataWorks 的默认运行环境无法满足任务(如 PyODPS、Shell)的特定依赖需求时,例如需要安装额外的 Python 库 (pandas,jieba),可以创建自定义镜像。通过将所有依赖预先打包并固化,自定义镜像提供一个可复用、标准化的任务执行环境,确保环境一致性并显著提升开发与部署效率。

适用范围

  • 版本限制

    • 所有版本均可创建和使用自定义镜像。

    • 仅专业版及以上版本支持镜像构建能力。

  • 资源组限制:镜像功能仅支持Serverless资源组

    旧版资源组请使用运维助手安装外部依赖。
  • 权限限制:拥有AliyunDataWorksFullAccessModifyResourceGroup权限策略。

    授权详情请参见产品及控制台权限控制详情:RAM Policy

配额与限制

  • 镜像数量:不同DataWorks版本,支持创建的自定义镜像数量上限不同。

    • 基础版和标准版:10个。

    • 专业版:50个。

    • 企业版:100个。

  • 构建并发:每个地域最多支持 2 个镜像同时进行构建。

  • ACR 镜像要求

    • 实例版本:仅支持企业版的阿里云ACR实例。

    • 实例架构:仅支持AMD64架构。

    • 镜像大小:单个镜像大小不能超过5GB

    • 时区配置:需要安装时区相关的基础包tzdata,避免因与DataWorks设置的时区不一致导致容器异常退出。

  • 镜像构建:仅支持基于 DataWorks 官方镜像创建的自定义镜像。引用阿里云 ACR 镜像创建的自定义镜像不支持持久化构建,每次运行任务时均需重新拉取和部署。

  • 支持的节点类型与对应方式:

    节点类型

    直接基于官方镜像构建

    引用ACR镜像构建

    PyODPS2

    支持

    不支持

    PyODPS3

    支持

    不支持

    EMR Spark

    支持

    不支持

    EMR Spark SQL

    支持

    不支持

    EMR SHELL

    支持

    不支持

    Shell

    支持

    支持

    Python

    支持

    支持

    Notebook

    不支持

    支持

    CDH

    支持

    不支持

    赋值节点

    支持

    不支持

操作流程

一、创建自定义镜像

DataWorks创建自定义镜像时,支持以DataWorks官方镜像阿里云ACR镜像作为镜像引用类型来创建镜像,以下为选择不同引用类型时的不同配置参数:

基于DataWorks官方镜像直接创建

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

  2. DataWorks官方镜像页签下,选择目标镜像作为基础,单击操作栏的创建自定义镜像。在弹窗中系统将自动填充目标镜像相关信息,其他参数如下。

    引用类型:默认选中DataWorks官方镜像。镜像命名空间:默认选中DataWorks Default。镜像仓库:默认选中DataWorks Default。

    参数

    说明

    镜像名称/ID

    默认选中目标官方镜像,可按需切换。

    可见范围

    支持配置自定义镜像的可见范围,包括仅创建者可见全员可见

    使用子产品

    当前自定义镜像仅支持用于数据开发

    支持任务类型

    根据不同镜像类型,按需选择需要支持的节点任务类型。在数据开发中运行匹配的节点任务时,可配置该镜像为其运行的镜像。

    安装包

    按需添加第三方包,可同时选择多种模式并安装多个包。支持以下方式:

    • 快捷安装:在安装包下拉选择框选择Python2Python3Yum,可以直接选择需要安装的环境、资源。

      若下拉列表中没有需要的第三方包,切换至Script模式手动安装。
    • 手动输入:在安装包下拉选择框选择Script。可通过Script命令框手动输入安装命令。您可选择以下手动输入示例命令下载第三方包。

      • pip示例命令:pip install xx,支持Python2使用。

      • pip3示例命令:/home/tops/bin/pip3 install 'urllib3<2.0' ,支持Python3使用。

      • yum示例命令:yum install -y git

      • wget示例命令:wget git

        更多安装命令说明,请参见附录:安装命令参考
    重要

    若需安装或依赖位于公网的第三方包,则Serverless资源组绑定的VPC具备公网访问能力

  3. 单击确定,完成镜像创建。

基于阿里云ACR镜像创建

基于ACR镜像创建自定义镜像,需开通容器镜像服务。仅支持通过企业版AMD64架构的阿里云ACR镜像实例来创建DataWorks镜像。

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

  2. 自定义镜像页签下,单击创建镜像。在弹窗中配置关键参数:

    参数

    说明

    引用类型

    选择阿里云ACR镜像

    镜像实例ID

    选择在阿里云容器镜像服务中创建的企业版实例

    镜像命名空间

    选择该镜像实例下的命名空间

    镜像仓库

    选择该镜像实例下的镜像仓库

    镜像版本

    支持根据所选中的镜像仓库,选择镜像仓库下您需要创建自定义镜像的镜像版本。

    关联的VPC

    选择镜像实例绑定的VPC网络,配置VPC网络详情请参见:配置专有网络的访问控制

    重要

    DataWorks仅支持选择一个VPC访问阿里云ACR镜像实例。

    同步至MaxCompute

    默认为。选项与您选择的镜像实例有关,实例规格标准版及以上版本的ACR镜像实例是可选择的,其他默认不可选。

    • 选择:默认生成DataWorks自定义镜像,DataWorks镜像发布时同步构建为MaxCompute镜像。

      详情请参见个人开发环境制作MaxCompute镜像
    • 选择:仅生成DataWorks自定义镜像,不会同步构建为MaxCompute镜像。

    可见范围

    支持配置自定义镜像的可见范围,包括仅创建者可见全员可见

    使用子产品

    当前自定义镜像仅支持用于数据开发

    支持任务类型

    ACR镜像启动方式为启动命令+用户任务代码文件路径的方式启动,以下为不同任务类型和默认启动命令:

    • Shell

    • Python:若需将阿里云ACR镜像创建的自定义镜像应用于Python任务,需确认您的ACR镜像实例内是否包含Python环境,否则无法支持Python任务。

    • Notebook

      • 若需将阿里云ACR镜像创建的自定义镜像应用于Notebook任务,请将DataWorks提供的Notebook基础镜像作为您ACR镜像的基础镜像,为Notebook任务提供运行环境。DataWorks提供的Notebook基础镜像:dataworks-public-registry.cn-shanghai.cr.aliyuncs.com/public/dataworks-notebook:py3.11-ubuntu22.04-20241202

      • 请确保您构建镜像使用的环境已具备公网访问能力,以便正常获取DataWorks提供的Notebook基础镜像。

  3. 单击确定,完成镜像创建。

基于个人开发环境实例创建

Data Studio新版数据开发支持将个人开发环境制作成新的镜像,详情可参见:个人开发环境制作DataWorks镜像

二、测试与发布自定义镜像

DataWorks控制台的镜像管理 > 自定义镜像页签下,对目标镜像进行发布。只有测试成功的镜像才可以发布。如果测试失败,可在目标自定义镜像的操作列单击image > 修改,修改镜像配置。

测试与发布时,需注意以下内容:

三、绑定镜像归属空间

发布后的镜像,可通过修改镜像归属空间在不同工作空间中应用。

  1. DataWorks控制台的镜像管理 > 自定义镜像页签下,查看并找到已发布的自定义镜像。

  2. 在目标镜像操作列单击image > 修改归属工作空间,为自定义镜像绑定归属工作空间。

四、在任务中使用镜像

新版数据开发使用镜像

  1. 进入数据开发:进入DataWorks工作空间列表页,在顶部切换至目标地域,找到目标工作空间,单击操作列的快速进入 > Data Studio,进入Data Studio。

  2. 配置镜像:在数据开发功能中找到待测试自定义镜像的任务节点,单击右侧调度配置,配置资源属性。

    • 资源组:选择Serverless资源组

      如果此处未显示目标资源组,请检查是否将该资源组绑定至当前工作空间。您可以前往资源组列表页,找到目标资源组,然后单击操作列的绑定工作空间,完成绑定。
      重要

      为确保任务节点顺利运行,请确保资源组发布镜像时选择的测试资源组一致。

    • 镜像:选择已发布的自定义镜像

      若切换镜像,需将节点发布后,才能在生产环境中生效。

      image

  3. 调试节点:在节点右侧调试配置中,配置计算资源资源组计算CU镜像脚本参数,然后在节点顶部工具栏单击运行

  4. 发布节点:在节点顶部工具栏单击发布,将节点发布至生产环境。

旧版数据开发使用镜像

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

  2. 配置镜像:在数据开发功能中找到待测试自定义镜像的任务节点,单击右侧调度配置,配置资源属性。

    • 调度资源组:选择Serverless资源组

      如果此处未显示目标资源组,请检查是否将该资源组绑定至当前工作空间。您可以前往资源组列表页,找到目标资源组,然后单击操作列的绑定工作空间,完成绑定。
      重要

      为确保任务节点顺利运行,请确保调度资源组发布镜像时选择的测试资源组一致。

    • 镜像:选择已发布的自定义镜像

      若切换镜像,需将节点发布后,才能在生产环境中生效。

      image

  3. 调试节点:在节点顶部工具栏单击带参运行image),配置资源组名称运行CU镜像,然后单击运行

  4. 发布节点:在节点顶部工具栏单击保存提交,将节点发布至生产环境。

五、构建持久化镜像

重要

强烈建议在镜像发布并通过业务验证后进行镜像持久化。该做法可有效规避因镜像源依赖库被篡改或版本未明确指定,导致任务初始化时下载到非预期版本而引发运行失败的风险。

常规自定义镜像每次运行都会重新部署,会增加节点运行时间且可能承担更多的计算费用。DataWorks 的持久化镜像功能只需构建一次即可无限次复用,能够提升任务运行效率、降低计算与流量成本,同时确保环境的高度一致性。构建持久化镜像只支持通过官方镜像创建的自定义镜像。

  1. DataWorks控制台的镜像管理 > 自定义镜像页签下,查看并找到已发布的自定义镜像。

  2. 在目标镜像操作列单击image > 构建,将自定义镜像构建为持久化镜像。

  3. 在弹出的请选择构建镜像的资源组对话框中,配置构建镜像使用的资源组,然后单击继续

    重要

    为避免因网络等原因出现构建失败的情况,请确保构建镜像的资源组发布自定义镜像时选择的测试资源组一致。

  4. 构建镜像大约耗时5~10分钟,具体视镜像大小而定。成功构建之后,目标镜像的发布状态变成已发布(构建成功)

计费说明

构建镜像会按照CU数量 × 构建时长收取计算费用,系统默认分配0.5CU。计费详情,请参见Serverless资源组计费标准

应用于生产

为确保在生产环境中稳定、高效、经济地使用自定义镜像,请参考以下建议。

  • 持久化镜像:建议对已发布且配置稳定的镜像进行镜像构建,形成持久化镜像。这样可避免任务每次运行时都重新安装依赖,从而缩短启动时间、降低计算成本并提高稳定性。

  • 环境一致性:确保用于测试、构建和生产调度的Serverless 资源组所绑定的VPC和网络配置一致,尤其是在访问私有 ACR 仓库或公网时。

  • 版本锁定:在通过 Script方式安装依赖时,强烈建议明确指定版本号(如 pip install pandas==1.5.3),避免上游库更新导致非预期的行为变更。

  • 回滚方案:如果更新镜像后生产任务失败,可通过任务发布历史回滚到上一个版本,或在调度配置中将镜像重新指向旧的、稳定的版本。

场景实践案例

本实践演示如何通过PyODPS节点使用镜像实现中文分词能力。假设需要对MaxCompute表中的某一列中文数据进行分词,然后将分词结果存入另一张表中,用于下游调度节点使用。您可在自定义镜像中预装jieba分词工具包,然后通过PyODPS任务使用该镜像对数据表中的中文数据进行分词处理,并将结果存储至新表,无缝集成至下游调度流程。

  1. 创建测试数据。

    1. 创建DataWorks工作空间绑定MaxCompute计算资源。详情请参见创建工作空间计算资源管理

    2. 在数据开发中,创建ODPS节点(旧版数据开发)或MaxCompute SQL节点(新版数据开发),新建测试表并添加测试数据。

      说明

      如下示例使用了调度参数,请在右侧调度配置中设置参数名为bday,参数值为$[yyyymmdd]

      创建测试表。

      -- 创建测试表
      CREATE TABLE IF NOT EXISTS custom_img_test_tb
      (
          c_customer_id BIGINT NOT NULL,
          c_customer_text STRING NOT NULL,
          PRIMARY KEY (c_customer_id)
      )
      COMMENT 'TABLE COMMENT'
      PARTITIONED BY (ds STRING COMMENT '分区')
      LIFECYCLE 90;
      
      -- 向表中插入测试数据
      INSERT INTO custom_img_test_tb PARTITION (ds='${bday}') (c_customer_id, c_customer_text) VALUES
      (1, '晚来天欲雪,能饮一杯无?'),
      (2, '月落乌啼霜满天,江枫渔火对愁眠。'),
      (3, '山重水复疑无路,柳暗花明又一村。'),
      (4, '春眠不觉晓,处处闻啼鸟。'),
      (5, '静夜思,床前明月光,疑是地上霜。'),
      (6, '海上生明月,天涯共此时。'),
      (7, '旧时王谢堂前燕,飞入寻常百姓家。'),
      (8, '一行白鹭上青天,窗含西岭千秋雪。'),
      (9, '人生得意须尽欢,莫使金樽空对月。'),
      (10, '天生我材必有用,千金散尽还复来。');
    3. 保存并发布。

  2. 创建自定义镜像。

    参见创建自定义镜像,关键参数如下:

    • 镜像名称/ID:选择dataworks_pyodps_task_pod,DataWorks PyODPS节点官方镜像。

    • 支持任务类型:支持PyODPS2PyODPS 3

    • 安装包:选择Python3jieba

  3. 发布自定义镜像并修改归属项目空间。具体请参见发布自定义镜像修改镜像归属空间

  4. 在调度任务中使用自定义镜像。

    1. 在数据开发中,创建PyODPS3节点,配置如下内容:

      使用自定义镜像。

      import jieba
      from odps import ODPS
      from odps.models import TableSchema as Schema, Column, Partition
      
      # 读取表数据
      table = o.get_table('custom_img_test_tb')
      partition_spec = f"ds={args['bday']}"
      with table.open_reader(partition=partition_spec) as reader:
          records = [record for record in reader]
      
      # 对提取的文本进行分词
      participles = [' | '.join(jieba.cut(record['c_customer_text'])) for record in records]
      
      # 创建目标表
      if not o.exist_table("participle_tb"):
          schema = Schema(columns=[Column(name='word_segment', type='string', comment='分词结果')], partitions=[Column(name='ds', type='string', comment='分区字段')])
          o.create_table("participle_tb", schema)
      
      # 写入分词结果到目标表
      # 定义输出分区和表
      output_partition = f"ds={args['bday']}"
      output_table = o.get_table("participle_tb")
      
      # 如果分区不存在,先创建分区
      if not output_table.exist_partition(output_partition):
          output_table.create_partition(output_partition)
      
      # 将分词结果写入表
      record = output_table.new_record()
      with output_table.open_writer(partition=output_partition, create_partition=True) as writer:
          for participle in participles:
              record['word_segment'] = participle
              writer.write(record)
    2. 在右侧调度配置中,设置如下关键参数:

      • 调度参数:参数名bday,参数值为$[yyyymmdd]

      • 调度资源组:选择Serverless资源组,与发布镜像时选择的测试资源组相同。

      • 镜像:选择已发布并绑定了当前工作空间的自定义镜像。

    3. 节点调试。

      • 如果使用旧版数据开发,请在节点顶部工具栏单击带参运行image),配置资源组名称运行CU镜像自定义参数,然后单击运行

      • 如果使用新版数据开发,请在节点右侧调试配置中,配置计算资源资源组计算CU镜像脚本参数,然后在节点顶部工具栏单击运行

    4. (可选)新建临时查询(旧版数据开发)或在个人目录下创建SQL文件(新版数据开发),使用如下SQL查询产出表中是否有数据。

      -- 将<分区日期>替换成具体日期。
      SELECT * FROM participle_tb WHERE ds=<分区日期>;

      image

    5. PyODPS节点发布至生产环境。

      说明

      数据开发中修改的镜像不会同步到生产环境中,您需要将任务发布后,才能在生产环境中生效。详情请参见发布任务(旧版数据开发)节点/工作流发布(新版数据开发)

  5. 将自定义镜像构建为持久化镜像。具体请参见构建持久化镜像

常见问题

Q:Python任务报错urllib3 v2.0 only supports OpenSSL 1.1.1+。

A:urllib3 v2.0仅支持OpenSSL1.1.1+,可降低urllib3版本以兼容OpenSSL。例如,安装三方包的时候强行指定urllib3的版本:/home/tops/bin/pip3 install urllib3==1.26.16

相关文档

附录:安装命令参考

如果使用自定义镜像的Script方式配置安装命令,则可以参考如下命令安装:

  • 如果依赖PyODPS 2节点,请执行如下命令。

    pip install <需要安装的包> -i  https://pypi.tuna.tsinghua.edu.cn/simple
    pip install <需要安装的包>
    说明

    执行命令后,如果提示需要升级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
    /home/tops/bin/pip3 install <需要安装的包>
    说明
    • 执行命令后,如果提示需要升级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: 没有那个文件或目录,请提交工单申请开启权限。

    Python公开镜像源参考如下,可按需切换。

    机构/公司

    镜像地址

    阿里云 (Aliyun)

    https://mirrors.aliyun.com/pypi/simple/

    重要

    从阿里云获取Python包,无需开通公网访问能力。

    清华大学 (Tsinghua)

    https://pypi.tuna.tsinghua.edu.cn/simple

    中国科学技术大学 (USTC)

    https://pypi.mirrors.ustc.edu.cn/simple/