华为云数据工坊DWR全流程对接与实战指南
华为云数据工坊DWR全流程对接与实战指南
在数字化转型浪潮下,企业非结构化数据(图片、视频、文档等)规模呈爆发式增长,传统数据处理模式存在数据搬运成本高、处理链路长、实时性差等痛点。华为云数据工坊DWR(Data Work Room)作为一款开放的近数据处理服务,通过将计算能力下沉至存储侧,实现数据在存入或读出时的即时处理,可缩短60%以上的数据处理耗时,同时提供图形化工作流编排与开放算子生态,大幅降低开发门槛。本文将从基础概念出发,全面拆解DWR的对接准备、控制台操作、API集成、自定义开发、权限配置与场景落地,结合实战代码与避坑要点,帮助读者从零完成DWR对接与业务落地。
一、DWR核心概念与产品价值
1.1 什么是数据工坊DWR
数据工坊DWR是华为云推出的Serverless化近数据处理平台,核心是“数据不动计算动”,基于函数工作流FunctionGraph的算力底座,将数据处理逻辑编排为可视化工作流,通过事件触发或API调用驱动,对OBS对象存储中的数据进行自动化处理。DWR的核心定位是连接存储与计算的中间层服务,专注解决非结构化数据的轻量化、自动化处理需求。
1.2 核心产品优势
- 高效近数据处理:算子下推至OBS存储节点,避免数据跨节点迁移,处理耗时缩短60%,支持同步/异步两种处理模式。
- 低代码可视化编排:提供拖拽式图形化界面,无需编写复杂代码即可完成工作流搭建,开发效率提升90%,运维难度大幅降低。
- 开放算子生态:内置图片处理、视频转码、文档转换、AI推理等预置算子,同时支持第三方伙伴发布自定义算子,覆盖全场景数据处理需求。
- 无缝集成华为云生态:深度对接OBS、FunctionGraph、MPC、CDN等华为云服务,无需额外配置即可实现服务联动,降低架构复杂度。
- 高可靠容错机制:内置自动重试、异常捕获、断点续执行能力,支持工作流失败后从断点恢复,保障业务稳定运行。
1.3 典型应用场景
DWR聚焦非结构化数据处理,核心场景包括:
- 图片/视频处理:图片裁剪、压缩、水印、格式转换;视频转码、抽帧、截图、剪辑,适配多终端播放需求。
- 文档处理:Word/Excel/PDF互转、文档预览、脱密、格式标准化,支撑在线办公与内容管理。
- AI智能处理:图像识别、内容审核、OCR文字提取、语音转写,快速集成AI能力至业务流程。
- 数据预处理:日志解析、数据清洗、格式标准化,为大数据分析提供高质量数据源。
二、DWR对接前置准备
在正式对接DWR前,需完成华为云账号注册、服务开通、权限配置、OBS桶创建等基础准备工作,确保后续对接流程顺畅。
需要先登录华为云控制台,点击:华为云控制台,还没有账号,点击:注册并关联,已有账号点击:登录后关联
2.1 账号与服务开通
- 注册华为云账号并完成实名认证,登录华为云控制台。
- 在控制台顶部搜索框输入“数据工坊DWR”,进入DWR服务页面,点击“开通服务”,DWR采用按需计费模式,开通后无基础费用,仅按实际使用的算子调用次数、计算资源时长计费。
- 开通OBS对象存储服务(DWR依赖OBS存储待处理与处理后的数据),同样按需开通,新用户可享受免费存储额度。
2.2 IAM权限配置
DWR对接需严格配置IAM权限,避免权限过大导致安全风险或权限不足导致操作失败,核心权限包括DWR服务权限、OBS桶访问权限、FunctionGraph函数执行权限。
- 进入华为云控制台“IAM”服务,选择“用户”→“创建用户”,输入用户名,选择“编程访问”(用于API调用)与“控制台访问”(用于可视化操作),生成AK/SK密钥(API调用必备)。
- 为用户添加DWR权限策略:搜索并选择“DWR FullAccess”(全权限,测试环境使用)或自定义最小权限策略(生产环境推荐),自定义策略示例如下:
{
"Version": "1.1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dwr:workflow:createWorkflow",
"dwr:workflow:listWorkflows",
"dwr:workflow:executeAsync",
"dwr:workflow:getWorkflowExecutionInfo"
],
"Resource": "*"
}
]
}
- 为用户添加OBS权限策略:选择“OBS FullAccess”或自定义策略,确保DWR用户具备OBS桶的读取、写入权限,避免工作流无法读写数据。
2.3 OBS桶规划与创建
DWR处理数据依赖OBS桶,需创建两个独立桶(输入桶+输出桶),防止处理后的数据再次触发工作流,形成无限循环。
- 进入OBS控制台,点击“创建桶”,配置桶参数:
- 桶名称:全局唯一,如“dwr-input-xxx”(输入桶,存放待处理数据)、“dwr-output-xxx”(输出桶,存放处理后数据)。
- 区域:选择与DWR服务相同的区域,减少网络延迟。
- 存储类型:标准存储(适合高频访问数据)。
- 权限:私有(默认,确保数据安全)。
- 创建完成后,记录桶名称与区域,后续工作流配置需使用。
2.4 OBS桶授权给DWR
DWR需获得OBS桶的访问授权,才能读取输入桶数据、写入输出桶数据,授权步骤如下:
- 进入OBS控制台,选择输入桶“dwr-input-xxx”,点击“权限管理”→“桶授权”。
- 点击“添加授权”,授权用户选择“数据工坊DWR”,权限选择“读取”,点击“确定”。
- 同理,为输出桶“dwr-output-xxx”添加DWR授权,权限选择“写入”。
三、控制台可视化对接(核心流程)
控制台对接是DWR最基础、最常用的方式,通过拖拽式界面完成工作流创建、算子配置、触发器设置,无需编写代码,适合快速验证业务场景。以下以“图片裁剪+添加水印”工作流为例,详细讲解全流程操作。
3.1 进入DWR控制台
- 登录华为云控制台,搜索“数据工坊DWR”,进入DWR服务控制台。
- 左侧导航栏显示“工作流”“算子市场”“事件触发器”“运行记录”等核心模块,默认进入“工作流”页面。
3.2 创建工作流
- 在“工作流”页面,点击右上角“创建工作流”,输入工作流名称(如“ImageProcessDemo”)、描述,点击“确定”,进入工作流编排页面。
- 编排页面分为左侧算子库、中间画布、右侧配置面板,算子库包含系统算子(华为云预置)与自定义算子(用户自研)。
3.3 拖拽并配置算子
- 添加“图片裁剪”算子:在左侧算子库搜索“ImageCrop”,拖拽至画布,点击算子,右侧配置面板设置参数:
- 输出桶:选择提前创建的输出桶“dwr-output-xxx”。
- 裁剪宽度/高度:设置为500*500像素。
- 输出路径:设置为“crop/”(裁剪后图片存放目录)。
- 添加“图片水印”算子:搜索“ImageWatermark”,拖拽至画布,连接“图片裁剪”算子(数据流转顺序:裁剪→水印),配置参数:
- 水印图片:选择OBS桶中存放的水印图片路径。
- 水印位置:右下角。
- 透明度:50%。
- 输出路径:设置为“watermark/”(加水印后图片存放目录)。
- 点击画布右上角“保存”,完成工作流编排。
3.4 创建事件触发器(自动触发)
事件触发器用于绑定OBS输入桶,当桶内上传新图片时,自动触发工作流执行,实现数据处理自动化。
- 在工作流列表中,找到“ImageProcessDemo”,点击操作列“创建事件触发器”。
- 配置触发器参数:
- 触发器名称:自定义,如“Trigger-Image-Upload”。
- 事件源桶:选择输入桶“dwr-input-xxx”。
- 事件类型:选择“上传对象”。
- 前缀/后缀:可选,如仅处理jpg/png图片,后缀填写“.jpg,.png”。
- 点击“确定”,触发器创建完成,约5分钟后生效。
3.5 测试工作流
- 进入OBS控制台,打开输入桶“dwr-input-xxx”,上传一张jpg格式测试图片。
- 进入DWR控制台,点击“运行记录”,查看工作流执行状态(显示“运行中”→“成功”)。
- 进入输出桶“dwr-output-xxx”,查看“watermark/”目录,存在裁剪并加水印的图片,说明工作流执行成功。
四、API与SDK对接(开发集成)
对于需要深度集成至业务系统的场景,DWR提供RESTful API与多语言SDK(Python、Go、Java),支持通过代码创建工作流、触发执行、查询结果,灵活适配业务开发需求。以下从API调用准备、Python SDK实战、Go SDK示例三方面详细讲解。
4.1 API调用前置准备
- 获取AK/SK:IAM用户创建时生成的访问密钥,用于API鉴权。
- 获取终端节点(Endpoint):DWR不同区域的Endpoint不同,可在华为云控制台“地区和终端节点”查询,如华东-上海一的Endpoint为“dwr.cn-east-3.myhuaweicloud.com”。
- 请求鉴权:DWR API采用华为云标准签名认证(SDK已封装鉴权逻辑,无需手动实现)。
4.2 Python SDK对接实战
Python SDK适合快速开发与脚本化调用,以下示例实现“创建图片处理工作流”“同步触发工作流”“查询执行结果”核心功能。
4.2.1 安装SDK
pip install huaweicloudsdkdwr
4.2.2 代码实现
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkdwr.v1.region.dwr_region import DwrRegion
from huaweicloudsdkdwr.v1.client.dwr_client import DwrClient
from huaweicloudsdkdwr.v1.model.create_workflow_request import CreateWorkflowRequest
from huaweicloudsdkdwr.v1.model.execute_workflow_request import ExecuteWorkflowRequest
# 1. 配置鉴权信息
AK = "你的IAM用户AK"
SK = "你的IAM用户SK"
ENDPOINT = "dwr.cn-east-3.myhuaweicloud.com"
PROJECT_ID = "你的项目ID"
# 2. 创建DWR客户端
credentials = BasicCredentials(AK, SK, PROJECT_ID)
client = DwrClient.new_builder() \
.with_credentials(credentials) \
.with_region(DwrRegion.value_of("cn-east-3")) \
.with_endpoint(ENDPOINT) \
.build()
# 3. 创建工作流(图片裁剪+水印)
def create_image_workflow():
request = CreateWorkflowRequest()
request.graph_name = "SDK-ImageProcess"
# 定义工作流JSON(与控制台编排逻辑一致)
request.body = {
"States": [
{
"StateName": "Start",
"Type": "START"
},
{
"StateName": "ImageCrop",
"Type": "ACTION",
"ActionMode": "sync",
"TemplateName": "ImageCrop",
"Input": {
"bucket": "dwr-output-xxx",
"width": 500,
"height": 500,
"output_path": "crop/"
}
},
{
"StateName": "ImageWatermark",
"Type": "ACTION",
"ActionMode": "sync",
"TemplateName": "ImageWatermark",
"Input": {
"bucket": "dwr-output-xxx",
"watermark_path": "obs://dwr-input-xxx/watermark.png",
"position": "bottom_right",
"opacity": 50,
"output_path": "watermark/"
}
},
{
"StateName": "End",
"Type": "END"
}
]
}
response = client.create_workflow(request)
print(f"工作流创建成功,ID:{response.graph_id}")
return response.graph_id
# 4. 同步触发工作流(指定OBS图片路径)
def execute_workflow(graph_id):
request = ExecuteWorkflowRequest()
request.graph_id = graph_id
# 输入参数:待处理图片路径
request.body = {
"input": {
"obs_path": "obs://dwr-input-xxx/test.jpg"
}
}
response = client.execute_workflow(request)
print(f"工作流触发成功,执行ID:{response.execution_id}")
return response.execution_id
# 5. 主函数调用
if __name__ == "__main__":
workflow_id = create_image_workflow()
execute_workflow(workflow_id)
4.3 Go SDK对接示例
Go SDK适合高性能、高并发场景,以下示例实现查询系统预置算子列表功能。
4.3.1 引入依赖
go get github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dwr/v1
4.3.2 代码实现
package main
import (
"fmt"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dwr/v1"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dwr/v1/model"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dwr/v1/region"
)
func main() {
// 1. 配置鉴权
ak := "你的AK"
sk := "你的SK"
projectId := "你的项目ID"
credentials := basic.NewCredentialsBuilder().
WithAK(ak).
WithSK(sk).
WithProjectId(projectId).
Build()
// 2. 创建客户端
client := dwr.NewDwrClientBuilder().
WithCredentials(credentials).
WithRegion(region.CN_EAST_3).
Build()
// 3. 查询系统算子列表
request := &model.ListSystemActionTemplatesRequest{}
response, err := client.ListSystemActionTemplates(request)
if err != nil {
fmt.Printf("查询失败:%v\n", err)
return
}
// 打印算子名称
for _, template := range *response.Templates {
fmt.Printf("算子名称:%s\n", *template.TemplateName)
}
}
五、自定义函数与算子开发(高级扩展)
当系统预置算子无法满足业务需求时,DWR支持开发自定义函数并封装为自定义算子,实现个性化数据处理逻辑(如自定义算法、特殊格式转换等)。自定义函数基于FunctionGraph运行,支持Python、Node.js、Java等语言开发。
5.1 自定义函数开发规范
自定义函数需遵循DWR输入输出规范,确保能被工作流正常调用:
- 输入参数:event(包含OBS路径、工作流上下文等信息)、context(函数运行上下文)。
- 输出参数:必须返回JSON格式,包含处理结果、输出路径等信息。
- 运行环境:推荐Python 3.9、Node.js 16.x,避免使用非主流版本。
5.2 Python自定义函数示例(图片尺寸校验)
以下示例开发一个自定义函数,校验上传图片尺寸是否大于1000*1000,不符合则返回错误,符合则返回成功。
import json
import os
from PIL import Image
import obs
# OBS配置(用于读取图片)
OBS_AK = "你的AK"
OBS_SK = "你的SK"
OBS_ENDPOINT = "obs.cn-east-3.myhuaweicloud.com"
def handler(event, context):
try:
# 1. 获取输入参数(OBS图片路径)
obs_path = event.get("obs_path")
if not obs_path:
return {"code": -1, "msg": "缺少OBS路径参数"}
# 2. 解析OBS路径(桶名+对象名)
path_parts = obs_path.replace("obs://", "").split("/", 1)
bucket_name = path_parts[0]
object_key = path_parts[1]
# 3. 下载图片至本地临时目录
client = obs.ObsClient(OBS_AK, OBS_SK, OBS_ENDPOINT)
temp_file = f"/tmp/{os.path.basename(object_key)}"
client.getObject(bucket_name, object_key, temp_file)
# 4. 校验图片尺寸
with Image.open(temp_file) as img:
width, height = img.size
if width >= 1000 and height >= 1000:
return {
"code": 0,
"msg": "图片尺寸校验通过",
"width": width,
"height": height
}
else:
return {
"code": -2,
"msg": f"图片尺寸过小,当前{width}*{height},要求≥1000*1000"
}
except Exception as e:
return {"code": -3, "msg": f"处理异常:{str(e)}"}
5.3 封装自定义算子并发布
- 在FunctionGraph控制台创建函数,上传上述代码包,测试函数执行正常。
- 进入DWR控制台,左侧导航栏选择“发布算子”,点击“发布自定义算子”。
- 配置算子信息:名称、描述、输入参数(OBS路径)、输出参数(校验结果),关联FunctionGraph函数,点击“发布”。
- 发布成功后,算子将显示在DWR算子库中,可直接拖拽至工作流使用。
六、权限管理与安全最佳实践
DWR对接需重视权限安全,遵循“最小权限原则”,避免权限泄露导致数据安全风险,核心安全配置如下。
6.1 IAM权限精细化配置
- 生产环境禁止使用“DWR FullAccess”全权限策略,仅授予必要权限(如创建工作流、触发执行、查询结果)。
- 为不同业务系统创建独立IAM用户,分配专属权限,避免权限混用。
- 定期清理冗余IAM用户与权限,关闭不必要的访问权限。
6.2 OBS桶安全配置
- OBS桶权限设置为“私有”,禁止公开访问,防止数据泄露。
- 配置OBS桶防盗链,仅允许华为云DWR、CDN等服务访问,防止盗链。
- 开启OBS桶日志记录,监控桶内数据访问行为,便于问题追溯。
6.3 工作流安全配置
- 工作流输出路径设置为独立目录,避免覆盖源文件。
- 自定义函数代码进行安全审计,防止恶意代码注入。
- 开启工作流执行日志,记录每一步操作,便于异常排查。
七、典型场景实战与问题排查
7.1 视频转码场景实战
视频转码是DWR高频场景,可将上传视频转为多码率、多格式,适配不同终端播放。
- 创建OBS输入桶(video-input)、输出桶(video-output)。
- DWR控制台创建工作流,拖拽“媒资转码”算子,配置输出桶、转码模板(如H.265 1080P)、输出路径。
- 绑定输入桶事件触发器,上传视频自动触发转码。
- 转码完成后,输出桶生成多版本视频,可通过CDN加速分发。
7.2 常见问题排查
- 工作流触发无反应:检查事件触发器是否生效(约5分钟生效)、OBS桶是否授权给DWR、事件类型是否匹配(如上传对象)。
- 算子执行失败:查看运行记录中的错误日志,常见原因:OBS路径错误、输出桶无写入权限、算子参数配置错误、自定义函数代码异常。
- API调用鉴权失败:检查AK/SK是否正确、Project ID是否匹配、Endpoint是否对应区域、IAM用户是否具备API权限。
- 工作流无限循环:检查输入桶与输出桶是否为同一桶,需分开创建,避免处理后数据再次触发工作流。
八、总结
华为云数据工坊DWR以近数据处理为核心,结合可视化编排、开放算子生态、Serverless算力,为非结构化数据处理提供高效、低门槛的解决方案。本文从基础概念、前置准备、控制台对接、API/SDK开发、自定义函数扩展、安全配置到场景实战,全面覆盖DWR对接全流程,通过代码示例与避坑要点,帮助不同技术背景的用户快速掌握DWR使用方法。
随着企业非结构化数据持续增长,DWR的近数据处理能力将在内容管理、媒体处理、AI智能化等领域发挥更大价值,助力企业降低数据处理成本、提升业务响应效率,加速数字化转型落地。
常见问答
Q1:DWR是否收费?计费标准是什么?
A1:DWR采用按需计费,无基础费用,主要计费项包括算子调用次数、FunctionGraph函数运行时长、OBS存储与流量费用,具体价格可在华为云控制台查询。
Q2:DWR支持哪些数据类型处理?
A2:支持图片(JPG/PNG/GIF等)、视频(MP4/AVI/MKV等)、文档(Word/Excel/PDF等)、音频等非结构化数据,同时支持自定义数据格式处理。
Q3:DWR工作流执行超时怎么办?
A3:可在算子配置中调整超时时间(最长支持30分钟),同时优化处理逻辑(如拆分大文件、简化处理步骤),避免单次执行耗时过长。
Q4:是否可以跨区域使用DWR?
A4:支持跨区域调用,但跨区域会增加网络延迟与流量成本,建议DWR与OBS桶部署在同一区域,提升处理效率、降低成本。
Q5:DWR自定义函数支持哪些编程语言?
A5:支持Python、Node.js、Java、Go等主流编程语言,推荐使用Python(简单易开发)或Go(高性能)。
Q6:如何监控DWR工作流运行状态?
A6:可通过DWR控制台“运行记录”查看实时执行状态、日志与结果;也可通过API调用查询执行详情,或对接华为云云监控服务,配置告警规则,异常时及时通知。




