如果运行在Serverless资源组上的任务需要特定的开发环境(例如第三方库依赖),您可以创建一个集成必要开发包与依赖的自定义镜像,然后在运行任务时,指定Serverless资源组作为执行资源,并指定该镜像作为运行环境。
前提条件
已创建Serverless资源组。该功能需要与Serverless资源组配合使用,Serverless资源组的更多详情,请参见新增和使用Serverless资源组。
(可选)如果任务运行的环境需要依赖位于公网的第三方包,则Serverless资源组绑定的VPC需要具备公网访问能力,具体配置详情,请参见使用公网NAT网关SNAT功能访问互联网。
已拥有AliyunDataWorksFullAccess或ModifyResourceGroup权限策略。授权详情请参见产品及控制台权限控制详情:RAM Policy。
使用限制
该功能仅支持与新Serverless资源组配合使用。
说明如果您使用旧版独享调度资源组运行PyODPS任务节点时,需要依赖第三方包,可使用运维助手,具体请参见独享调度资源组配置第三方包。
不同DataWorks版本,支持创建的自定义镜像最大个数存在限制:
基础版和标准版:10个。
专业版:50个。
企业版:100个。
仅专业版以上版本支持镜像构建能力。
每个地域最多支持两个镜像同时构建。
操作步骤
步骤一:查看DataWorks官方镜像
登录DataWorks控制台,切换至DataWorks工作空间所在地域后,单击左侧导航栏的镜像管理。
查看DataWorks官方镜像,目前支持如下镜像:
DataWorks Shell节点官方镜像:支持
Shell
任务类型。DataWorks PYODPS节点官方镜像:支持
PyODPS 2
和PyODPS 3
任务类型。DataWorks EMR datalake 5.15.1版本官方镜像:支持
EMR Spark
、EMR Spark SQL
和EMR SHELL
任务类型。说明该镜像支持EMR新版数据湖集群5.15.1版本的任务提交。
步骤二:创建自定义镜像
官方镜像作为预配置的基础镜像,为特定任务类型提供了标准化的执行环境。自定义镜像在此基础上进一步扩展了功能性和灵活性。您可以根据实际应用场景基于这些基础镜像进行个性化扩展,实现功能的按需定制,提升了数据处理任务的执行效率与灵活性。
您可以通过如下方式创建自定义镜像:
在DataWorks官方镜像页签,找到自定义镜像所需的基础官方镜像,单击操作列的创建自定义镜像。
在自定义镜像页签,单击创建镜像。
在创建镜像页面,配置如下参数。
参数
说明
镜像名称
自定义镜像的名称。
镜像描述
自定义镜像的说明。
引用类型
固定为DataWorks官方镜像,目前仅支持基于DataWorks官方镜像创建自定义镜像。
镜像命名空间
固定为DataWorks Default。
镜像仓库
固定为DataWorks Default。
镜像名称/ID
DataWorks官方镜像,支持选择:
dataworks_shell_task_pod:DataWorks Shell节点官方镜像。
dataworks_pyodps_task_pod:DataWorks PYODPS节点官方镜像。
dataworks_emr_datalake_5.15.1_task_pod:DataWorks EMR datalake 5.15.1版本官方镜像。
可见范围
支持配置自定义镜像的可见范围,包括仅创建者可见和全员可见。
使用子产品
当前自定义镜像仅支持用于数据开发。
支持任务类型
DataWorks Shell节点官方镜像:支持
Shell
任务类型。DataWorks PYODPS节点官方镜像:支持
PyODPS 2
和PyODPS 3
任务类型。DataWorks EMR datalake 5.15.1版本官方镜像:支持
EMR Spark
、EMR Spark SQL
和EMR SHELL
任务类型。
安装包
按需添加需要的第三方包。支持以下方式:
快捷安装:在安装包下拉选择框选择
Python2
、Python3
、Yum
,可以直接选择需要安装的环境、资源。手动输入:在安装包下拉选择框选择
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是否具备公网访问能力,为VPC配置公网,请参见使用公网NAT网关SNAT功能访问互联网。
如果测试失败,您可以在目标自定义镜像的操作列单击
,修改镜像配置。
步骤四:修改镜像归属空间
在自定义镜像页签,查看并找到已发布的自定义镜像。
在目标镜像操作列单击
,为自定义镜像绑定归属工作空间。
步骤五:使用镜像
进入数据开发页面。
登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的 ,在下拉框中选择对应工作空间后单击进入数据开发。
在数据开发功能中找到待测试自定义镜像的任务节点,单击右侧调度配置,配置资源属性:
调度资源组:选择Serverless资源组。
说明为确保任务节点顺利运行,请确保调度资源组与发布镜像时选择的测试资源组一致。
镜像:选择已发布并绑定了当前工作空间的自定义镜像。
保存并提交修改。
说明数据开发中修改的镜像不会同步到生产环境中,您需要通过发布任务将任务发布后,才能在生产环境中生效。
步骤六:构建持久化镜像
完成步骤五后,您已经可以正常在业务中使用自定义镜像,但每次运行任务节点时,DataWorks都会重新部署镜像环境,下载第三方包。该场景下会增加节点运行时间且可能承担更多的计算费用,因此,DataWorks支持将自定义镜像构建为持久化镜像,无需每次都重新部署镜像环境,每次运行任务节点时使用同一个镜像环境,不仅确保了运行环境的一致性,还有效节省了任务运行时间、计算成本和流量成本。
具体配置步骤如下:
登录DataWorks控制台,切换至DataWorks工作空间所在地域后,单击左侧导航栏的镜像管理。
在自定义镜像页签,查看并找到已发布的自定义镜像。
在目标镜像操作列单击
,将自定义镜像构建为持久化镜像。在弹出的请选择构建镜像的资源组对话框中,配置构建镜像使用的资源组,然后单击继续。
配置示例
场景说明
假设需要对MaxCompute表中的某一列数据进行分词,然后将分词结果存入另一张表中,用于下游调度节点使用。
可以使用此方案,在自定义镜像中预装jieba分词工具包,然后通过PyODPS任务使用该镜像对表数据进行分词处理并存储结果至新表,无缝集成至下游调度流程。
操作步骤
创建测试数据。
创建MaxCompute数据源,并在DataWorks数据开发中绑定已创建的MaxCompute数据源。详情请参见创建MaxCompute数据源。
在数据开发中,创建ODPS节点,新建测试表并添加测试数据。
说明如下示例使用了调度参数,请在右侧调度配置中设置参数名为
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, '天生我材必有用,千金散尽还复来。');
保存并发布。
创建自定义镜像。
参见步骤二:创建自定义镜像,关键参数如下:
镜像名称/ID:选择
dataworks_pyodps_task_pod
,DataWorks PYODPS节点官方镜像。支持任务类型:选择
PyODPS 3
。安装包:选择
Python3
和jieba
。
发布自定义镜像并修改归属项目空间。具体请参见步骤三:发布镜像和步骤四:修改镜像归属空间。
在调度任务中使用自定义镜像。
在数据开发中,创建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)
在右侧调度配置中,设置如下关键参数:
调度参数:参数名
bday
,参数值为$[yyyymmdd]
。调度资源组:选择Serverless资源组,与发布镜像时选择的测试资源组相同。
镜像:选择已发布并绑定了当前工作空间的自定义镜像。
保存并带参运行。
(可选)新建临时查询,使用如下SQL查询产出表中是否有数据。
SELECT * FROM participle_tb WHERE ds=<分区日期>;
将PyODPS节点发布至生产环境。
说明数据开发中修改的镜像不会同步到生产环境中,您需要通过发布任务将任务发布后,才能在生产环境中生效。
将自定义镜像构建为持久化镜像。具体请参见步骤六:构建持久化镜像。
相关文档
使用自定义镜像时,调度资源组必须配置为Serverless资源组,Serverless资源组的更多信息,请参见新增和使用Serverless资源组。
PyODPS的更多用法,请参见PyODPS概述。
数据开发中更多参数配置说明,请参见任务调度属性配置概述。