
# 创建自定义数据处理作业
本节介绍如何使用自定义数据处理作业，用户可参考[创建数据处理任务](https://support.huaweicloud.com/usermanual-cloudrobo/cloudrobo_02_0071.html)。
运行自定义作业时，重点关注两个环境变量：
- SOURCE_DATASET_PATH：容器内挂载数据集路径，例如：{"dataset-1":"/tmp/source/dataset/1"}
- TARGET_DATASET_PATH：容器内产物存储路径，请将数据处理的产物保存到该环境变量对应的目录下，例如：/tmp/target/dataset。
#### 前提条件
- 用户当前工作空间绑定的OBS桶需可用且OBS桶策略正常，否则功能无法正常使用。
  - 如果OBS桶不可用，可根据界面提示重新选择存储地址。普通成员如遇配置失败，请联系管理员处理。
  
  - 如果OBS桶策略异常，可根据界面提示重新配置OBS桶策略。普通成员如遇配置失败，请联系管理员处理。
  
  - 如果因其他服务异常导致查询当前工作空间绑定的OBS桶详情失败，请联系华为云技术支持人员处理或[提交工单](https://support.huaweicloud.com/usermanual-ticket/zh-cn_topic_0127038618.html)。
   
- 已上传数据到空间资产或OBS存储。
- 已上传自定义镜像到空间资产。
- 根据自定义镜像创建自定义算法。
 
#### 操作步骤
参考[创建数据处理任务](https://support.huaweicloud.com/usermanual-cloudrobo/cloudrobo_02_0071.html)，在选择"处理算法"时选择"空间资产-算法"或"OBS算法"，其余步骤无差异。
#### 单容器作业示例
1. 制作镜像。 
   创建一个Dockerfile_HelloWorld文件。
   ```
   # 拉取 Python 基础镜像
   FROM python:3.11-slim
   # 设置容器内的工作目录
   WORKDIR /app
   # 将当前目录下的脚本复制到容器的工作目录中
   COPY hello_world.py /app
   # 指定容器启动时执行的命令
   ENTRYPOINT ["python", "/app/hello_world.py"]
   ```
   上面的hello_world.py脚本参考：
   ```
   import os
   print("hello_world")
   print(os.getenv("SOURCE_DATASET_PATH"))
   print(os.getenv("TARGET_DATASET_PATH"))
   ```
   
   
2. 将上述镜像上传到SWR平台后，先根据[注册镜像](https://support.huaweicloud.com/usermanual-cloudrobo/cloudrobo_02_0056.html)操作，例如hello_world:1.0，然后再根据[创建算法](https://support.huaweicloud.com/usermanual-cloudrobo/cloudrobo_02_0057.html)操作。启动命令设置为python hello_world.py。
3. 创建任务，在算法栏选择"空间资产-算法"并选择[步骤2]创建的算法资产。
   
   ![](https://support.huaweicloud.com/usermanual-cloudrobo/zh-cn_image_0000002743931495.png "点击放大")
   
   
4. 创建任务后，在详情可查看用户日志。
   
   ![](https://support.huaweicloud.com/usermanual-cloudrobo/zh-cn_image_0000002744091467.png "点击放大")
   
   
 
#### 分布式作业示例
平台分布式作业内部使用Ray作为引擎，用户可提交编排好的Ray作业流程在启动脚本中，适用于批处理任务、AI模型训练与评估等分布式任务。
1. 基于本地开发者环境，制作作业镜像。 
   ```
   FROM rayproject/ray:latest
   # ray作业默认健康检查会调用curl命令检查当前容器内ray进程状态，需要安装curl命令
   USER root
   RUN apt update -y && apt install -y curl
   USER ray
   COPY cal.py /home/ray
   WORKDIR /home/ray
   ```
   上述dockerfile中的参考脚本cal.py：
   ```
   import os
   import ray
   import socket
   import time
   # 1. 连接到 Ray 集群（如果在集群节点上运行，可省略 address） 
   ray.init()  
   # 2. 定义一个分布式远程函数 (Task) 
   @ray.remote 
   def square(x): 
       return x * x  
   @ray.remote
   def summary(x):
       print(x)
       time.sleep(30)
       print(socket.gethostname())
       print(os.getenv("SOURCE_DATASET_PATH"))
       print(os.getenv("TARGET_DATASET_PATH"))
   # 3. 并行执行任务 
   futures = [square.remote(i) for i in range(10)]  
   # 4. 获取结果 
   results = ray.get(futures) 
   print("计算结果:", results)  
   # 5. 并行任务2：打印host信息和数据集挂载信息
   futures = [summary.remote(i) for i in range(10)]
   results = ray.get(futures)
   # 6. 断开连接 
   ray.shutdown()
   ```
   
   
2. 在空间资产-镜像页面，注册上述构建的镜像，具体操作可参照[注册自定义镜像](https://support.huaweicloud.com/usermanual-cloudrobo/cloudrobo_02_0018.html)。
3. 在空间资产-算法页面，单击"创建算法"，选择[步骤2]中创建的"空间资产镜像"，具体操作可参照[创建自定义算法](https://support.huaweicloud.com/usermanual-cloudrobo/cloudrobo_02_0021.html)，启动命令可参照具体应用场景，在该示例场景下填写python cal.py。
4. 在数据准备-数据处理页面，单击"创建任务"，选择 [步骤3]中创建的空间资产-算法，添加数据集输入。作业类型选择分布式作业。配置资源规格，当选择2个worker及以上时会将作业分发到不同的作业节点。选择输出数据集名称或OBS存储位置，单击"立即创建"提交作业。
5. 单击[步骤4]中创建的数据处理任务，进入任务详情页，再切换到日志页，可观察运行过程中日志信息。用户可参考当前示例或Ray官方文档编排数据处理作业，将任务调度到不同节点上运行。
   
   ![](https://support.huaweicloud.com/usermanual-cloudrobo/zh-cn_image_0000002714332566.png "点击放大")
   
   
 
