任务配置
开发机 to 任务管理
在开发机调通的脚本,在任务管理运行时报连不上 ray client
需要在 python 脚本中补充几行代码:
import ray
ray.init(dashboard_host="0.0.0.0")
daft.context.set_runner_ray("ray://127.0.0.1:10001")
开发机测通的脚本,在任务管理上起不来,head 探活不通过
- 用户自己安装 daft/ray 框架把 LAS 内置镜像自带的框架覆盖了,导致在任务启动时缺少 LAS 相关组件。
- 需使用内置镜像或安装指定版本的 Daft 框架。
开发机测通的脚本,通过代码访问公网 TOS 地址,在任务管理中报"TOS 地址连接超时"
- 任务设置了跨 VPC 参数,网络请求优先走绑定的 VPC,默认无法访问公网
- 需为这个 VPC 开通并绑定 NAT 外网访问功能
工作流配置
工作流启动的任务实例如何和同一个工作流下的其它任务实例相互配合?
- 启动工作流实例时,可以填写全局环境变量,各任务实例可以根据这个环境变量配合,例如用相同 tos 文件夹传递数据
- 另外,任务实例 pod 中可以获取下面环境变量:
- LAS_TASK_ID=t-xxx (任务模板 Id)
- LAS_TASK_INSTANCE_ID=ti-xxx (任务实例 Id)
- LAS_TASK_WORKFLOW_TEMPLATE_ID=wf-tpl-xxx (工作流模板 Id)
- LAS_TASK_WORKFLOW_INSTANCE_ID=wf-tpl-xxx-xxx (工作流实例 Id)
- LAS_TASK_WORKFLOW_INSTANCE_TIMESTAMP_MS=1779872124749 (工作流实例启动时间戳)
启动工作流时如何给不同节点设置不同环境变量?
- 启动工作流时只能设置一套全局环境变量,不能单独设置
- 不同节点的脚本可以关注不同 Key 值,这样只读取关心的 Key 值即可
- 对于同一个工作流内有多个节点是相同任务模板的情况,可以让脚本先读取 KeyName,然后再以 KeyName 的 value 作为 Key 值读环境变量,相当于多转换一次,然后在不同节点设置不同 KeyName 即可
任务运行
Daft 任务
Daft 类型的任务运行到最后卡住
- 任务执行 log 正常,到最后没有退出卡住
- 原因是有些 task 分配到了 head 上,需要在启动脚本里加一行
运行 Daft 任务时报错: "缺少 ray..."
- 需要使用内置 Daft/Ray 镜像,或者基于这两种镜像创建的自定义镜像。
- 如果必须要使用自定义基础镜像,则需要安装合适版本的 Daft,Ray 等依赖
Python 任务
运行 Python 任务时报错,"StartTaskInstance..."
- 原因是入口命令中存在这样的语句:
cd /aa/bb && python cc.py --xx - Python 任务的入口命令只能是一个命令,不支持多条命令
- 可以优化为:
python /aa/bb/cc.py --xx - 对于复杂命令
- 可以在入口命令填写
sh -c,然后在"Python 作业参数"填入一行复杂命令:cd /../ && ... && ... - 可以写在一个脚本文件中,用 tos 挂载到某目录,用一条入口命令启动:
python /test/test.py
Spark 任务
Serverless spark执行作业时提示用户无操作权限
2024-05-08 15:16:59-ERROR: analysis.AnalysisException: Permission denied: user [1025770] does not have privilege in:
[Resource{resourceScope='TABLE', catalogName='hive', schemaName='test_lf', tableName='table_20240507'}], action:[SELECT]
原因:用户对对象没有权限。
解决方案:到LAS - 权限管理,对用户授权对应对象。
详细说明:权限管理
组件通用
运行任务时,没有执行日志
- 如果任务执行时间过短(<5s),则可能未保存 log。测试的话可以输出后 sleep 下
- 用
print()打印日志时,可能因为缓存没有及时输出导致未收集,可以主动 flush 或使用 log 库(自带 flush)
任务无法启动,基础组件问题,比如拉镜像失败
- 从 ECS 监控可以看到 vdb 写带宽被占满(180MB/s),导致系统基本功能阻塞
- 原因是客户向默认地址"/tmp/..."写入大量数据,该路径在系统盘,导致系统无法正常运行
- 解决方法:用户把数据写入
/data/...目录,有专门的数据盘。如果数据盘速度或容量不够,可以找 SRE 更换数据盘。
队列资源问题
任务启动后,提交日志报错"Insufficient ... eni"(网卡不足)
- 队列资源的 ENI(弹性网卡)是有限的,下面资源可能占用 eni:
- head/worker 占用一个
- vepfs/nas 挂载时 fsx agent 会在每个节点占用一个
- 一般可调整 worker 数量避免 eni 消耗过多
计算队列任务执行报错"ValueError: Job with submission_id las-0aqk9jhz-4mm2t already exists. Please use a different submission_id."
- 一般前面已经出错了,SubmitPod 自动重试导致报错。可以往前面找找真正的报错 log
提交 Daft 任务到 EmrServerless 公共队列,申请 64CPU 卡住
- 公共队列主机规格最大 64CPU,但是可能有其它资源会占用一点,所以任务最大一般填 32CU
日志与组件 UI
任务实例处理中可以查看 DaftUI 中的 log,执行完毕后无法查看 RayUI 中的 log
- 用户使用自定义镜像缺少必要依赖导致 log 无法收集,自定义镜像需满足下面条件:
python命令必须默认指向python3.x- 确保已安装收集 log 需要的包
pip install tos, requests
RayUI 页面 Ray Core Overview 不显示内容
- Task 数量超过一定阈值(大概 3000)就无法显示具体任务情况了