You need to enable JavaScript to run this app.
文档中心
E-MapReduce

E-MapReduce

复制全文
下载 pdf
CLI 参考
EMR Agent CLI 参考
复制全文
下载 pdf
EMR Agent CLI 参考

EMR Agent CLI 是 火山引擎 EMR 的官方命令行工具,提供 EMR 的调用鉴权、各类 EMR 形态的任务调用、EMR AI 智能助手调用等核心功能的命令,结合 AI 智能体的应用,您可在消耗更少的 Token 的同时,通过简单的任务描述即可便捷地集成并使用 EMR。本文为您介绍 EMR Agent CLI 命令的安装及使用要点。

支持的命令

命令分类

支持的命令

子命令

说明

配置管理

config

path get set unset list site

读取/写入配置文件(等效设置环境变量)

EMR on ECS

ecs

不涉及

EMR on ECS 操作封装

EMR Serverless

serverless

不涉及

EMR Serverless 操作封装

EMR on VKE

vke

不涉及

EMR on VKE 操作封装

EMR Agent

agent

不涉及

EMR Agent 操作封装

交互式问答

expert

不涉及

EMR Agent 交互式诊断/问答

Serverless 提交

submit

sql jar pyspark ray

提交 Serverless 任务

安装 EMR Agent CLI

环境要求

  • 已安装 python3 (推荐python3.12)、已安装 pip。
  • 已开通火山引擎 EMR 服务,并已获取 火山引擎 账号的 AK/SK 信息,用于后续使用 EMR 服务的鉴权配置。

安装 EMR Agent CLI

  1. 单击下方的附件链接,下载 EMR Agent CLI 的安装包。

    emr_cli-0.1.0-py3-none-any.whl
    未知大小

  2. 在安装环境中通过 pip 安装 EMR Agent CLI。

    pip install <安装包所在的目录>/emr_cli-0.1.0-py3-none-any.whl
    
    # 示例:pip install /Users/bytedance/Documents/emr_cli-0.1.0-py3-none-any.whl
    
    • 安装完成后,可以执行 emr-cli -h 命令来检查是否已正确安装 EMR Agent CLI
    • 您可以将以下安装命令直接发送给 Agent,由 Agent 为您安装 LAS CLI,也可在终端中执行运行以下安装命令。以下为安装示例。
Agent 配置示例

您可以在 ArkClaw 中将安装包上传至网盘,然后通过自然语言描述安装 EMR Agent CLI。
Image

终端运行命令示例

Image

卸载 EMR Agent CLI

执行以下命令即可卸载 EMR Agent CLI。

#卸载命令
pip uninstall <安装包所在的目录>/emr_cli-0.1.0-py3-none-any.whl

使用 EMR Agent CLI

step1:初始化配置 EMR Agent CLI

首次安装 EMR Agent CLI 后,您需要调用 congif 命令来对 EMR 进行初始化配置,主要需要完成 EMR 服务的调用鉴权相关配置。

注意

您可以使用 congif 命令来设置认证信息 AK/SK,也可设置其他例如站点(默认为 volcengine)、地域(默认为cn-beijing)等信息,如果您的服务信息与默认值一致,则无需进行除了认证信息外的其他信息的配置。

场景1:在 ArkClaw 中安装使用 EMR Agent CLI

如果您是在 ArkClaw 上安装使用 EMR Agent CLI,您需配置 ArkClaw 的 API 调用的认证信息通过此认证信息来调用 EMR Agent CLI、使用 EMR 服务。

  1. 您可以在 ArkClaw 的终端页面执行 cat /root/.openclaw/.env 命令,在环境变量中查看 ARK_SKILL_API_BASEARK_SKILL_API_KEY 的取值。
    • ARK_SKILL_API_BASE:为 ArkClaw 的 SkillHub API 服务地址。
    • ARK_SKILL_API_KEY:为 ArkClaw 的 SkillHub 的访问秘钥。
  2. 参考下方配置命令进行配置。
    # 当写入配置(KEY=VALUE 写法,等价)
    emr-cli config set ARK_SKILL_API_BASE https://your-ark-host
    emr-cli config set ARK_SKILL_API_KEY your_api_key
    

场景2:在其他环境中安装使用 EMR Agent CLI

在除 ArkClaw 外的其他环境中安装使用 EMR Agent CLI 时,您需配置 EMR 服务的认证 AK/SK 信息。您可以在 IAM 控制台 的 “API访问密钥”页面获取账号的AK、SK信息,参考下方配置命令进行配置。

# 写入配置(KEY VALUE 写法)
# 会把 KV 写入配置文件,等效于“持久化环境变量”
emr-cli config set VOLCENGINE_AK your_ak
emr-cli config set VOLCENGINE_SK your_sk

step2:使用 EMR 服务

完成初始化相关的配置后,您即可使用 EMR Agent CLI 命令使用 EMR 服务。以下为一个使用示例。

  1. 调用 Serverless 作业查询命令,命令查询作业实例列表。

    emr-cli serverless \
    --action ListJobInstances \
    --method GET \
    --body '{
    }'
    
  2. 基于返回的作业ID,可调用 Agent 诊断命令,诊断作业。

    emr-cli expert --question "诊断一下这个作业:33248****"
    
  3. 查看当前 EMR AI 助手的报告列表。

    emr-cli agent \
    --action ListReports \
    --body '{
    }'
    
  4. 查看某个详细的诊断报告。

    emr-cli agent \
    --action GetReportResult \
    --body '{ 
    "ReportId": "emr-report-6ac2a5bc-b26e-4cac-8029-73360a*****"
    }'
    

更多使用可参考下文的详细 EMR Agent CLI 命令说明章节。

参考:EMR Agent CLI 命令说明

config

命令格式

emr-cli config {path,get,set,unset,list,site} ...

子命令说明

子命令

命令格式

说明

path

emr-cli config path

打印当前使用的配置文件路径

get

emr-cli config get <key>

读取配置项(环境变量优先)

set

emr-cli config set <key> [value]

写入配置项 KEY=VALUE

unset

emr-cli config unset <key>

删除配置项

list

emr-cli config list

列出所有配置项(脱敏)

site

emr-cli config site [{byteplus,volcengine}]

查看或设置站点模式

参数说明:config set

emr-cli config set key [value]

参数

类型

必填

默认值

说明

key

positional string

支持配置的参数,枚举值如下:

  • VOLCENGINE_AK:无默认值,在非 ArkClaw 环境中使用 EMR Agent CLI 时必须配置,用于 EMR 服务的鉴权。需配置为有权限的火山账号的 AK 信息。
  • VOLCENGINE_SK:无默认值,在非 ArkClaw 环境中使用 EMR Agent CLI 时必须配置,用于 EMR 服务的鉴权。需配置为有权限的火山账号的 SK 信息。
  • VOLCENGINE_REGION:设置使用的 EMR 服务所在的地域,默认值为cn-beijing
  • EMR_DEFAULT_QUEUE:设置使用的 EMR 服务时的队列资源,默认值为公共队列。
  • ARK_SKILL_API_BASE:无默认值,在 ArkClaw 环境中使用 EMR Agent CLI 时必须配置,用于 EMR 服务的鉴权。需配置为 ArkClaw 的 SkillHub 的BASE URL 信息。
  • ARK_SKILL_API_KEY:无默认值,在 ArkClaw 环境中使用 EMR Agent CLI 时必须配置,用于 EMR 服务的鉴权。需配置为 ArkClaw 的 SkillHub 的 API KEY 信息。

value

positional string

参数说明:config get

emr-cli config get key

参数

类型

必填

默认值

说明

key

positional string

枚举值如下:

  • VOLCENGINE_AK:使用 EMR Agent CLI 时用于 EMR 服务的鉴权的 AK 信息。
  • VOLCENGINE_SK:使用 EMR Agent CLI 时用于 EMR 服务的鉴权的 SK 信息。
  • VOLCENGINE_REGION:使用的 EMR 服务所在的地域。
  • EMR_DEFAULT_QUEUE:使用的 EMR 服务时的队列资源。
  • ARK_SKILL_API_BASE:在 ArkClaw 环境中使用 EMR Agent CLI 时用于 EMR 服务的鉴权信息。
  • ARK_SKILL_API_KEY:在 ArkClaw 环境中使用 EMR Agent CLI 时用于 EMR 服务的鉴权信息。

参数说明:config unset

emr-cli config unset key

参数

类型

必填

默认值

说明

key

positional string

枚举值如下:

  • VOLCENGINE_AK:使用 EMR Agent CLI 时用于 EMR 服务的鉴权的 AK 信息。
  • VOLCENGINE_SK:使用 EMR Agent CLI 时用于 EMR 服务的鉴权的 SK 信息。
  • VOLCENGINE_REGION:使用的 EMR 服务所在的地域。
  • EMR_DEFAULT_QUEUE:使用的 EMR 服务时的队列资源。
  • ARK_SKILL_API_BASE:在 ArkClaw 环境中使用 EMR Agent CLI 时用于 EMR 服务的鉴权信息。
  • ARK_SKILL_API_KEY:在 ArkClaw 环境中使用 EMR Agent CLI 时用于 EMR 服务的鉴权信息。

参数说明:config list

查询当前所有已配置的配置项的取值,敏感信息会自动为您脱敏。

emr-cli config list

参数说明:config site

emr-cli config site [{byteplus,volcengine}]

参数

类型

必填

默认值

说明

{byteplus,volcengine}

positional enum

volcengine

查看或设置站点模式。

参数说明:config path

打印当前使用的配置文件路径

emr-cli config path

ecs

命令格式

emr-cli ecs --action ACTION [--service SERVICE] [--version VERSION] [--region REGION] [--method METHOD] [--query QUERY] [--body BODY]

参数说明

参数

类型

必填

默认值

说明

--action ACTION

string

API 操作名称

--service SERVICE

string

emr

服务名称

--version VERSION

string

2023-08-15

API 版本

--region REGION

string

VOLCENGINE_REGIONcn-beijing

区域

--method METHOD

string

POST

HTTP 方法

--query QUERY

string

查询参数,JSON 格式

--body BODY

string

请求体,JSON 格式

-h, --help

flag

显示帮助并退出

-help

flag

显示帮助并退出

action 列表

说明

基于 EMR Agent CLI 命令使用 EMR on ECS 服务时,命令参数与调用 API 接口的方式一致,当前支持的 Action 列表如下,对应 Action 支持的查询参数与配置说明可参见 OpenAPI 文档:EMR API概览

模块

Action 名称

说明

操作管理

ListOperations

操作列表

集群管理

ListClusters

集群列表

GetCluster

获取集群

UpdateClusterAttribute

更新集群属性

节点组管理

UpdateNodeGroupEcsSpec

更新节点组ECS规格

ScaleUpNodeGroupDisk

扩容节点组磁盘

ListNodes

节点列表

UpdateNodeGroupAttribute

更新节点组属性

ListNodeGroups

节点组列表

应用管理

ListComponents

组件列表

ListComponentInstances

组件实例列表

ListApplications

应用列表

RunApplicationAction

执行应用操作

ListApplicationConfigFiles

集群配置文件列表

GetApplicationConfigFile

获取集群配置文件信息

ListApplicationConfigs

配置项列表

用户管理

CreateClusterUser

创建集群用户

UpdateClusterUser

修改已创建用户信息

ListClusterUsers

获取集群用户列表

UpdateClusterUserPassword

更新集群用户密码

GetClusterUsers

获取EMR管控用户详情

用户组管理

UpdateClusterUserGroup

更新集群用户组

CreateClusterUserGroup

创建集群用户组

ListClusterUserGroups

获取集群用户组列表/详情

serverless

命令格式

emr-cli serverless --action ACTION [--service SERVICE] [--version VERSION] [--region REGION] [--method METHOD] [--query QUERY] [--body BODY] [--endpoint ENDPOINT]

参数说明

参数

类型

必填

默认值

说明

--action ACTION

string

API 操作名称

--service SERVICE

string

服务名称

--version VERSION

string

API 版本

--region REGION

string

cn-beijing

区域

--method METHOD

string

HTTP 方法

--query QUERY

string

查询参数,JSON 格式

--body BODY

string

请求体,JSON 格式

--endpoint ENDPOINT

string

显式指定 endpoint(将走 direct request)

-h, --help

flag

显示帮助并退出

-help

flag

显示帮助并退出

action 列表

说明

基于 EMR Agent CLI 命令使用 EMR Serverless 服务时,命令参数与调用 API 接口的方式一致,当前支持的 Action 列表如下,对应 Action 支持的查询参数与配置说明可参见 OpenAPI 文档:Open API

模块

Action 名称

说明

资源队列

ListTagQueue

队列列表查询

GetQueue

队列详情查询

权限管理

ListAuthorizedPrincipalsForQueue

获取队列权限列表

ListIAMUsersWithQueueRole

模糊搜索队列权限

GrantQueuePrivilege

添加用户权限

AlterQueuePrivilege

修改用户的队列权限

操作审计

ListOperationLogs

操作日志查询

作业管理

ListJobDefinitions

作业列表

GetJobDefinition

获取作业详情

CreateJobDefinition

创建作业

RunJobDefinition

执行作业

UpdateJobDefinition

修改作业定义

vke

命令格式

emr-cli vke --action ACTION [--body BODY]

参数说明

参数

类型

必填

默认值

说明

--action ACTION

string

API 操作名称

--body BODY

string

请求体,JSON 格式

-h, --help

flag

显示帮助并退出

-help

flag

显示帮助并退出

action 列表

说明

基于 EMR Agent CLI 命令使用 EMR on VKE 服务时,命令参数与调用 API 接口的方式一致,当前支持的 Action 列表如下,对应 Action 支持的查询参数与配置说明可参见 OpenAPI 文档:API概览

模块

Action 名称

说明

集群管理

ListVirtualClusters

查询集群列表

GetVirtualCluster

查询集群详情

操作日志

ListOperations

查询集群的操作日志列表

GetOperation

查询集群的操作日志详情

服务管理

ListApplications

查询集群的应用列表

RebootApplications

重启应用(服务)

ListComponentInstances

查询服务的组件实例列表

RebootComponentInstance

重启应用(服务)的组件

ListConfigs

获取应用配置参数

UpdateConfig

更新服务配置参数

expert

命令格式

emr-cli expert [--question QUESTION] [--chat-id CHAT_ID]

参数说明

参数

类型

必填

默认值

说明

--question QUESTION

string

提问内容

--chat-id CHAT_ID

string

会话 ID,指定 ID 可以保持会话历史

-h, --help

flag

显示帮助并退出

-help

flag

显示帮助

agent

命令格式

emr-cli agent --action ACTION [--body BODY]

参数说明

参数

类型

必填

默认值

说明

--action ACTION

string

API 操作名称

--body BODY

string

请求体,JSON 格式

-h, --help

flag

显示帮助并退出

-help

flag

显示帮助并退出

action 列表

说明

基于 EMR Agent CLI 命令使用 EMR AI 助手时,当前支持的 Action 列表如下,对应 Action 支持的查询参数与配置说明可参见下文的参考文档章节:参考:Agent-action 命令参数详情

模块

接口

功能

作业/集群/服务诊断 及知识助手

CreateChat

创建会话

ChatCompletions

会话接口

GetReportResult

获取报告内容

ListReports

报告列表

ListChats

会话列表

GetChat

会话详情

submit

命令格式

emr-cli submit {sql,jar,pyspark,ray} ...

子命令说明

子命令

命令格式

说明

sql

emr-cli submit sql --engine {spark,presto} --query QUERY [options]

提交 SQL 任务

jar

emr-cli submit jar --jar JAR --main-class MAIN_CLASS [options]

提交 Spark Jar 任务

pyspark

emr-cli submit pyspark --script SCRIPT [options]

提交 PySpark 任务

ray

emr-cli submit ray --entrypoint-cmd ENTRYPOINT_CMD --entrypoint-resource ENTRYPOINT_RESOURCE [options]

提交 Ray 任务

参数说明:submit sql

emr-cli submit sql --engine {spark,presto} --query QUERY [--name NAME] [--queue QUEUE] [--compute-group COMPUTE_GROUP] [--conf CONF]

参数

类型

必填

默认值

说明

--engine {spark,presto}

enum

执行引擎

--query QUERY

string

SQL 内容

--name NAME

string

任务名称

--queue QUEUE

string

任务运行的队列名称

--compute-group COMPUTE_GROUP

string

任务运行队列中的计算组名称

--conf CONF

string

Spark运行时参数,可参考:Spark 配置官网文档

参数说明:submit jar

emr-cli submit jar --jar JAR --main-class MAIN_CLASS [--main-args MAIN_ARGS] [--depend-jars DEPEND_JARS] [--files FILES] [--archives ARCHIVES] [--name NAME] [--queue QUEUE] [--compute-group COMPUTE_GROUP] [--conf CONF]

参数

类型

必填

默认值

说明

--jar JAR

string

Jar 包路径或引用

--main-class MAIN_CLASS

string

主类名,即Spark application 的 main class

--main-args MAIN_ARGS

string

spark application 的 main function 参数;不传默认为 empty list

--depend-jars DEPEND_JARS

string

依赖的jar文件,对应spark-submit的--jars选项,例如:['tos://bucket/path/to/jar']

--files FILES

string

依赖的文件,对应spark-submit的--files选项, ,例如:['tos://bucket/path/to/file']

--archives ARCHIVES

string

依赖的archive文件,对应spark-submit的--archieves选项, ,例如:['tos://bucket/path/to/archive']

--name NAME

string

任务名;如果不指定会以 SparkJarTask_${current_time} 的方式生成

--queue QUEUE

string

指定运行队列名,不填则将选用公共队列

--compute-group COMPUTE_GROUP

string

任务运行队列中的计算组名称

--conf CONF

string

用于指定任务参数,默认为空

参数说明:submit pyspark

emr-cli submit pyspark --script SCRIPT [--args ARGS] [--pyfiles PYFILES] [--depend-jars DEPEND_JARS] [--files FILES] [--archives ARCHIVES] [--name NAME] [--queue QUEUE] [--compute-group COMPUTE_GROUP] [--conf CONF]

参数

类型

必填

默认值

说明

--script SCRIPT

string

任务执行时使用的 SparkJar 资源,需传入tos路径,例如:['tos://bucket/path/to/pyfile']

--args ARGS

string

spark application 的 main function 参数,默认为 empty list

--pyfiles PYFILES

string

依赖的文件,对应spark-submit的--files选项, ,例如:['tos://bucket/path/to/file']

--depend-jars DEPEND_JARS

string

依赖的jar文件,对应spark-submit的--jars选项,例如:['tos://bucket/path/to/jar']

--files FILES

string

依赖的文件,对应spark-submit的--files选项, ,例如:['tos://bucket/path/to/file']

--archives ARCHIVES

string

依赖的archive文件,对应spark-submit的--archieves选项, ,例如:['tos://bucket/path/to/archive']

--name NAME

string

任务名。如果不指定会以 SparkJarTask_${current_time} 的方式生成

--queue QUEUE

string

指定运行队列名,不填则将选用公共队列

--compute-group COMPUTE_GROUP

string

任务运行队列中的计算组名称

--conf CONF

string

用于指定任务参数,默认为空

参数说明:submit ray

emr-cli submit ray --entrypoint-cmd ENTRYPOINT_CMD --entrypoint-resource ENTRYPOINT_RESOURCE [--head-cpu HEAD_CPU] [--head-memory HEAD_MEMORY] [--worker-cpu WORKER_CPU] [--worker-memory WORKER_MEMORY] [--worker-replicas WORKER_REPLICAS] [--runtime-env RUNTIME_ENV] [--name NAME] [--queue QUEUE] [--compute-group COMPUTE_GROUP] [--conf CONF]

参数

类型

必填

默认值

说明

--entrypoint-cmd ENTRYPOINT_CMD

string

入口命令

--entrypoint-resource ENTRYPOINT_RESOURCE

string

入口资源

--head-cpu HEAD_CPU

string

设置Ray head node的cpu,格式与k8s resource一致,例如 4Gi

--head-memory HEAD_MEMORY

string

设置Ray head node的memory,格式与k8s resource一致,例如 4Gi

--worker-cpu WORKER_CPU

string

设置Ray worker node的cpu,格式与k8s resource一致,例如 4Gi

--worker-memory WORKER_MEMORY

string

设置Ray worker node的memory,格式与k8s resource一致,例如 4Gi

--worker-replicas WORKER_REPLICAS

string

设置Ray worker node的节点个数

--runtime-env RUNTIME_ENV

string

设置Ray作业的运行时环境,可用于指定环境变量/工作目录/pip安装依赖

--name NAME

string

作业名称

--queue QUEUE

string

指定运行队列名,不填则将选用公共队列

--compute-group COMPUTE_GROUP

string

任务运行队列中的计算组名称

--conf CONF

string

用于指定任务参数,默认为空

参考:Agent-action 命令参数详情

创建会话 - CreateChat

  • Action:CreateChat
  • URL:/emr-ai-agent/api/v1/session/create
  • 请求方式:POST

入参

参数名

参数类型

是否必选

说明

Verbose

Boolean

创建的session是否设置为详细报告版:true/false
默认为true

返回

参数名

参数类型

是否必选

说明

ChatId

String

会话ID

示例

  • 请求
curl -X POST 'http://127.0.0.1:8080/emr-ai-agent/api/v1/session/create' -H 'Content-Type: application/json' -H 'X-Top-Account-Id: 21000*****' -d '{
    
}'
  • 返回
{
  "ResponseMetadata": {
    "RequestId": null,
    "Action": null,
    "Version": null,
    "Service": null,
    "Region": null,
    "Error": null,
    "Deprecated": false
  },
  "Result": {
    "ChatId": "session_52614d9e-4d0b-4b6c-b912-1969a92afc1a"
  }
}

会话接口 - ChatCompletions

  • Action:ChatCompletions
  • URL:/emr-ai-agent/api/v1/chat/stream
  • 请求方式:POST
  • 交互协议SSE
  • 可以先调用“创建会话”接口获取会话ChatId

请求头

参数名

参数类型

是否必选

说明

X-Resume-Task-Id

String

断点续传时需要在请求头传入该参数(ChatID)

X-Resume-From-Index

String

断点续传时需要在请求头传入该参数 (可以传0)

入参

参数名

参数类型

是否必选

说明

ChatId

String

会话标识

  • 标识一次会话

MessageId

String

消息ID

  • 一次问答的标识

JobId

String

作业ID / 查询ID(Serverless SQL查询ID)

ClusterId

String

集群ID

ServiceName

String

服务名称

QueueId

String

队列ID

ChatType

String

会话类型

  • 当传递了该值后,意味着不需要意图识别,意图是明确的
  • 可选值有
    • job_diagnose 作业诊断
    • cluster_diagnose 集群诊断
    • service_diagnose 服务诊断
    • serverless_instance_diagnose olap实例诊断

Content

String

会话内容

ContentType

String

默认是text ,当前可选值:

  • text
  • form

ConfirmMessageId

String

如果是用户提交了表单,需要关联一下提交表单的id

Product

String

产品名称,可选值:

  • tob_onecs:EMR on ECS 服务
  • tob_onvke:EMR on VKE 服务
  • tob_serverless:EMR Serverless 服务

Verbose

Boolean

是否返回详细版本报告:true/false,默认为true

InstanceId

String

Serverless实例ID(诊断Serverless SQL的时候需要用到)

返回(SSE流事件协议)

响应头

参数名

参数类型

是否必选

说明

X-Task-Id

String

任务ID,用于断点续传。断点续传时,将该值放入X-Resume-Task-Id值中

响应体

SSE流事件响应体。

获取报告内容 - GetReportResult

  • Action: GetReportResult
  • URL:emr-ai-agent/api/v1/report/get_result
  • 请求方式:POST

入参

参数名

参数类型

是否必选

说明

ReportId

String

报告ID

返回

参数名

参数类型

是否必选

说明

ReportId

String

报告ID

ChatId

String

会话ID

TotalTokens

String

消耗的Token总量

ReportContent

String

报告内容

DeepReasoning

String

深度思考内容

示例

  • 请求
curl -X POST 'http://127.0.0.1:8080/emr-ai-agent/api/v1/report/get_result' -H 'Content-Type: application/json' -H 'X-Top-Account-Id: 21000*****' -d '{
    "ReportId":"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d"
}'
  • 返回
{
  "ResponseMetadata": {
    "RequestId": null,
    "Action": null,
    "Version": null,
    "Service": null,
    "Region": null,
    "Error": null,
    "Deprecated": false
  },
  "Result": {
    "ReportId": "emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d",
    "ChatId": "session_52614d9e-4d0b-4b6c-b912-1969a92afc1a",
    "TotalTokens": 6133,
    "ReportContent": "\n### 作业诊断报告:JobID-30557****\n\n### 诊断概述\n- **分析过程**:\n  - 结合基础信息、日志和指标逐步分析:\n    1. 作业状态为 **COMPLETED**(成功),总耗时 63 秒(12:01:13 - 12:02:16)\n    2. 提交日志存在弃用配置告警但无致命错误\n    3. Spark 详情显示:\n       - 仅一个 Stage 且状态为 COMPLETE\n       - Executor 资源使用率极低(内存 275MB/7GB,CPU 几乎空闲)\n       - 无 Shuffle 操作(`shuffle_read_bytes=0`)\n       - 单任务执行耗时仅 1.7 秒(`executor_run_time=1045ms`)\n    4. 实际计算时间仅占全程 3%(2秒/63秒)\n- **严重级别**:⚠️ **警告**  \n  (资源利用率过低导致隐性成本浪费)\n\n---\n\n### 失败分析\n- **错误摘要**:无失败信息  \n  (作业成功完成,无错误日志)\n- **根因分析**:不适用\n\n---\n\n### 性能分析\n#### 📊 Stage 关键指标\n| 指标                | 值       | 分析结论               |\n|---------------------|----------|-----------------------|\n| 总耗时              | 63 秒    | 99%时间为等待资源分配 |\n| Executor 运行时间    | 1.045 秒 | 有效计算时间占比极低   |\n| Executor 内存使用量 | 275 MB   | 远低于分配额度(7GB)  |\n| Shuffle 数据量      | 0 B      | 无数据交换操作        |\n| 输出记录数           | 1 行     | 极轻量写入任务         |\n\n#### 🧩 瓶颈定位\n1. **资源启动开销过大**  \n   - 冷启动耗时占总耗时 97%(约 61 秒)\n   - 典型 Serverless 问题:资源分配时间长于计算本身\n2. **资源配置严重冗余**  \n   - 4 核 Executor 仅处理单行数据插入\n   - 内存使用率不足 4% → 隐性成本浪费\n3. **表分区写入开销**  \n   - `PARTITION (dt='1')` 产生额外 HDFS 元数据操作\n   - 对小批量写入不高效\n\n---\n\n### 优化建议\n#### ⚙️ 配置优化\n1. **降低 Executor 规格**  \n   ```python\n   # 当前:4 核 7GB → 建议:1 核 2GB\n   spark.executor.cores=1\n   spark.executor.memory=2g\n   ```\n   **理由**:适配轻量任务特性,减少资源空闲浪费,降低 50%+ 成本\n\n2. **启用会话复用**  \n   ```python\n   spark.serverless.session.reuse=true\n   spark.serverless.session.timeout=300s\n   ```\n   **理由**:避免冷启动开销,后续同类作业可复用资源池,缩短耗时至 5 秒内\n\n#### ✨ 代码优化\n1. **批量写入代替单行插入**  \n   ```sql\n   -- 当前:单行插入\n   INSERT ... VALUES(1,'test',18);\n   \n   -- 优化:批量插入(示例)\n   INSERT INTO table PARTITION(dt='1')\n   SELECT 1, 'test', 18 UNION ALL\n   SELECT 2, 'demo', 20; -- 添加更多行\n   ```\n   **理由**:分摊启动开销,提升吞吐量\n\n2. **避免小文件写入**  \n   ```python\n   # 写入前合并小分区\n   spark.conf.set(\"spark.sql.adaptive.enabled\", true)\n   spark.conf.set(\"spark.sql.adaptive.coalescePartitions.enabled\", true)\n   ```\n   **理由**:预防高频小批量写入产生海量小文件,减轻 HDFS 压力\n\n#### 💰 成本优化\n1. **触发模式优化**  \n   - 从按需触发 → 定时批处理(如每 5 分钟聚合写入)  \n   **理由**:减少作业次数,利用规模效应降低成本 60%+\n\n2. **监控资源闲置率**  \n   ```sql\n   -- 添加监控指标(示例)\n   SELECT\n     SUM(max_memory) AS allocated_mem,\n     SUM(memory_used) AS used_mem,\n     (SUM(used_mem)/SUM(allocated_mem)) AS mem_util\n   FROM __executor_metrics__\n   ```\n   **理由**:持续追踪利用率,动态调整资源规格\n\n---\n\n### 总结\n作业因 **过度分配资源+冷启动延迟** 导致隐性成本浪费,通过会话复用、规格降配、批量写入可优化至 **5 秒内完成,成本降低 70%**。建议重点优化资源配置策略和写入模式。",
    "DeepReasoning": "我们开始分析这个Spark作业。首先,作业的基本信息如下:\n- Job ID: 30557****\n- 名称: inspection-insert-spark-jar-source-table\n- 队列: inspection_dont_del\n- 提交者: inspection_ss\n- 状态: COMPLETED(成功完成)\n- 任务类型: SQL\n- 开始时间: 2025-08-29 12:01:13\n- 结束时间: 2025-08-29 12:02:16(总耗时约63秒)\n- 引擎类型: SparkCli\n\n查询语句为:\n```sql\ninsert into inspection_ss_ss_inspection_vci_schema_inspection_dont_del_sparktest.parquet_spark_source_name PARTITION (dt='1') values(1,'test',18)\n```\n这是一个向分区表插入单行数据的简单操作。\n\n接下来,查看日志和Spark应用详情:\n\n1. **提交日志摘要(Submission Log Summary)**:\n   - 有几条关于配置项弃用的WARN日志,但只是警告,不影响作业执行。\n   - 另外有一条警告:`The client is using resource type 'sparkapplications' with unstable version 'v1beta2'`,这可能是客户端版本问题,但作业成功完成,因此不是关键问题。\n\n2. **执行日志摘要(Execution Log Summary)**:显示“No logs available”,没有执行日志可用。这可能是因为作业简单且成功完成,没有产生错误日志。\n\n3. **Spark应用详情**:\n   - **Executors(执行器)**:\n     - Driver:内存使用约275MB(281393KB),总内存约7.02GB(7542197452字节)。无任务运行。\n     - Executor 1:4核,内存使用同样约275MB。完成了1个任务,总任务时间1746毫秒(约1.7秒)。\n   - **Jobs**:一个作业(Job 0),状态为SUCCEEDED,提交到完成时间约2.16秒(2025-08-29T04:01:47.109GMT 到 2025-08-29T04:01:49.268GMT)。\n   - **Stages**:一个Stage(Stage 0),状态为COMPLETE。该Stage有1个任务,全部完成。Stage的详细指标:\n     - Executor反序列化时间:627毫秒\n     - Executor运行时间:1045毫秒\n     - 结果序列化时间:2毫秒\n     - 输入输出记录:输出1条记录(对应插入一行数据)\n     - 无shuffle操作(shuffle读写均为0)\n\n**诊断过程**:\n- 作业状态为成功(COMPLETED),说明没有失败。\n- 整个作业耗时63秒,但实际Spark作业执行时间只有2.16秒(从Job提交到完成)。这说明大部分时间消耗在作业提交和资源分配上(约60秒),而非实际计算。\n- 在服务器实例环境中,作业提交和启动Driver/Executor可能涉及资源分配(如Pod启动),这通常称为\"冷启动\"开销。对于如此简单的作业,这种开销占主导地位。\n- 资源使用方面:Executor内存使用很低(275MB),且CPU时间也很短(实际运行时间约1秒)。没有数据倾斜或GC问题。\n\n**严重性级别**:\n- 由于作业成功,没有失败问题→无Critical。\n- 性能方面:虽然实际计算快,但总耗时63秒(其中60秒为启动开销),对于这个简单操作来说可能过长→警告(Warning)。\n- 优化机会:减少启动开销(例如重用资源)和配置简化→信息(Info)。\n\n**具体分析**:\n- **性能瓶颈**:主要瓶颈是作业提交和资源分配(冷启动)时间。实际计算只占3%的时间。\n- **资源利用**:资源分配(1个Driver+1个Executor/4核)相对于这个作业过大(只需插入一行),但服务器实例环境的最小分配可能受限。\n- **配置检查**:作业配置中`serverless.spark.analysis=true`已开启,但未利用重用机制(如会话重用)。另外,弃用配置项虽不影响运行,但建议更新以避免未来问题。\n\n**优化建议**:\n1. **配置优化**:\n   - 移除弃用配置项:替换`spark.maxRemoteBlockSizeFetchToMem`为`spark.network.maxRemoteBlockSizeFetchToMem`,以及`spark.scheduler.listenerbus.eventqueue.size`为`spark.scheduler.listenerbus.eventqueue.capacity`,以保持兼容性。\n   - 对于简单作业,考虑降低资源分配(例如Executor核数),但服务器实例环境可能有最小限制。可尝试配置更小的Executor(例如1核1G),但要测试是否允许。\n   - 开启或优化会话重用:使用`spark.serverless.session.reuse=true`来避免重复启动资源(如果集群支持)。这样多个作业可共享同一上下文,减少启动开销。\n\n2. **代码优化**:\n   - 当前SQL是单行插入,效率低。如果需插入多行,应批量插入(如通过`INSERT INTO ... VALUES (...), (...)`)或从文件加载。\n   - 但本例仅插入一行,无代码优化空间。\n\n3. **成本优化**:\n   - 虽然实际计算资源使用少,但占用整个Executor约60秒(从启动到释放)。建议合并简单操作:例如,若有多个类似插入操作,可在一个作业中批量执行,而非提交多个独立作业。\n   - 利用会话重用减少资源分配时间。\n\n4. **服务器实例特定优化**:\n   - 若作业频繁运行(如每分钟运行一次),强烈建议使用会话池(Session Pool),以避免冷启动。\n   - 监控网络延迟:虽然本例无网络问题,但启动慢可能包含网络调度延迟,确保集群健康。\n\n**最终报告**如下:\n"
  }
}

报告列表 - ListReports

  • Action: ListReports
  • URL: /emr-ai-agent/api/v1/report/list
  • 请求方式:POST

入参

参数名

参数类型

是否必选

说明

PageNum

Int

页码,默认1开始

PageSize

Int

页大小,默认10

ReportStatus

String

报告状态

  • 可选值
    • start 开始
    • progress 处理中
    • complete 完成
    • exception 异常

ReportType

String

报告类型

  • 可选值
    • job 作业类型
    • service 服务类型
    • cluster 集群类型
    • queue 队列类型

ReportSubType

String

报告子类型

  • 可选值
    • spark
    • doris
    • starrocks
    • presto
    • ray
    • on_ecs
    • on_vke
    • on_serverless

MinProcessingDuration

Int

MaxProcessingDuration

Int

OrderBy

String

顺序

  • created_at_desc(默认)
  • created_at_asc
  • processing_duration_desc
  • processing_duration_asc

ChatId

String

会话ID

返回

参数名

参数类型

是否必选

说明

Items

Array of Report

用户身份标识

TotalCount

Int

总数

PageSize

Int

页大小

PageNum

Int

页码

Report

参数名

参数类型

是否必选

说明

ReportId

String

报告ID

ReportType

String

报告类型

  • 可选值
    • job 作业类型
    • service 服务类型
    • cluster 集群类型
    • queue 队列类型

ReportSubType

String

报告子类型

  • 可选值
    • spark
    • doris
    • starrocks
    • presto
    • ray
    • on_ecs
    • on_vke
    • on_serverless

ReportName

String

报告名字

UserId

String

用户ID

ReportStatus

String

报告状态

  • 可选值
    • start 开始
    • progress 处理中
    • complete 完成
    • exception 异常

CreatedAt

String

创建时间

  • 示例:2025-08-29T15:34:29.683000

UpdatedAt

String

更新时间

  • 示例:2025-08-29T15:34:29.683000

CompletedAt

String

完成时间

  • 示例:2025-08-29T15:34:29.683000

TriggerMethod

String

触发方式

  • 可选值
    • realtime 实时
    • periodic 周期

TenantId

String

租户ID

JobId

String

作业ID

ClusterId

String

集群ID

ServiceId

String

服务ID

QueueId

String

队列ID

ProcessingDuration

Int

处理耗时

TotalTokens

Int

消耗token总量

ChatId

String

会话ID

示例

  • 请求
curl -X POST 'http://127.0.0.1:8080/emr-ai-agent/api/v1/report/list' -H 'Content-Type: application/json' -H 'X-Top-Account-Id: 21000*****' -d '{
    
}'
  • 返回
{
  "ResponseMetadata": {
    "RequestId": null,
    "Action": null,
    "Version": null,
    "Service": null,
    "Region": null,
    "Error": null,
    "Deprecated": false
  },
  "Result": "{\"Items\": [{\"ReportId\": \"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\", \"ReportType\": \"job\", \"ReportSubType\": \"spark\", \"ReportName\": \"job-spark-30557****\", \"UserId\": \"21000*****\", \"ReportStatus\": \"complete\", \"CreatedAt\": \"2025-09-01T15:16:01.448000\", \"UpdatedAt\": \"2025-09-01T15:17:44.146000\", \"CompletedAt\": \"2025-09-01T15:17:43.807000\", \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"30557****\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": 359305, \"TotalTokens\": 6133, \"ChatId\": \"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a\"}, {\"ReportId\": \"emr-report-87fcb056-d94e-42f3-9087-e553eb9a5d76\", \"ReportType\": \"job\", \"ReportSubType\": \"spark\", \"ReportName\": \"job-spark-30557****\", \"UserId\": \"21000*****\", \"ReportStatus\": \"complete\", \"CreatedAt\": \"2025-09-01T11:54:57.833000\", \"UpdatedAt\": \"2025-09-01T11:56:54.180000\", \"CompletedAt\": \"2025-09-01T11:56:53.826000\", \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"30557****\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": 993497, \"TotalTokens\": 6038, \"ChatId\": \"session_21c725d0-c9a7-4fe6-bcda-2812fa349e88\"}, {\"ReportId\": \"emr-report-8752ba3d-3fdc-41df-8cee-b6cdadd3ab73\", \"ReportType\": \"job\", \"ReportSubType\": \"spark\", \"ReportName\": \"job-spark-30557****\", \"UserId\": \"21000*****\", \"ReportStatus\": \"progress\", \"CreatedAt\": \"2025-09-01T11:49:42.583000\", \"UpdatedAt\": \"2025-09-01T11:49:49.217000\", \"CompletedAt\": null, \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"30557****\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": null, \"TotalTokens\": null, \"ChatId\": \"session_21c725d0-c9a7-4fe6-bcda-2812fa349e88\"}, {\"ReportId\": \"emr-report-06b457d4-607a-468b-8904-c9d27b77c6d7\", \"ReportType\": \"job\", \"ReportSubType\": \"spark\", \"ReportName\": \"job-spark-30557****\", \"UserId\": \"21000*****\", \"ReportStatus\": \"exception\", \"CreatedAt\": \"2025-09-01T11:43:57.708000\", \"UpdatedAt\": \"2025-09-01T11:45:15.858000\", \"CompletedAt\": null, \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"30557****\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": null, \"TotalTokens\": null, \"ChatId\": \"session_21c725d0-c9a7-4fe6-bcda-2812fa349e88\"}, {\"ReportId\": \"emr-report-5d87fefa-cafb-4b2a-b6c5-df4d3725f919\", \"ReportType\": \"job\", \"ReportSubType\": \"spark\", \"ReportName\": \"job-spark-30557****\", \"UserId\": \"21000*****\", \"ReportStatus\": \"progress\", \"CreatedAt\": \"2025-09-01T11:36:49.991000\", \"UpdatedAt\": \"2025-09-01T11:36:56.224000\", \"CompletedAt\": null, \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"30557****\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": null, \"TotalTokens\": null, \"ChatId\": \"session_21c725d0-c9a7-4fe6-bcda-2812fa349e88\"}, {\"ReportId\": \"emr-report-e63d471f-c7db-484b-995a-d524d98d22b9\", \"ReportType\": \"job\", \"ReportSubType\": \"\", \"ReportName\": \"job-None-application_1755978717999_2135918\", \"UserId\": \"21000*****\", \"ReportStatus\": \"complete\", \"CreatedAt\": \"2025-09-01T01:38:28.242000\", \"UpdatedAt\": \"2025-09-01T01:40:09.533000\", \"CompletedAt\": \"2025-09-01T01:40:09.275000\", \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"application_1755978717999_2135918\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": 33132, \"TotalTokens\": 10975, \"ChatId\": \"session_9cf9053c-0662-472b-967f-29f058e133b6\"}, {\"ReportId\": \"emr-report-8b86ea9b-4da9-40f6-9760-8b2a382f942e\", \"ReportType\": \"job\", \"ReportSubType\": \"\", \"ReportName\": \"job-None-application_1755767253999_9679157\", \"UserId\": \"21000*****\", \"ReportStatus\": \"complete\", \"CreatedAt\": \"2025-09-01T01:19:17.986000\", \"UpdatedAt\": \"2025-09-01T01:21:03.637000\", \"CompletedAt\": \"2025-09-01T01:21:03.395000\", \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"application_1755767253999_9679157\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": 409488, \"TotalTokens\": 12939, \"ChatId\": \"session_9cf9053c-0662-472b-967f-29f058e133b6\"}, {\"ReportId\": \"emr-report-adfe5a76-818f-4f55-b2f1-c23ed18f69fd\", \"ReportType\": \"job\", \"ReportSubType\": \"\", \"ReportName\": \"job-None-application_1755767253999_9679157\", \"UserId\": \"21000*****\", \"ReportStatus\": \"progress\", \"CreatedAt\": \"2025-08-31T23:49:22.613000\", \"UpdatedAt\": \"2025-08-31T23:49:29.276000\", \"CompletedAt\": null, \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"application_1755767253999_9679157\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": null, \"TotalTokens\": null, \"ChatId\": \"session_a4aaca21-0399-4a4a-bf00-f75241224510\"}, {\"ReportId\": \"emr-report-dfb73554-9086-48fd-96bc-5ef447e6b026\", \"ReportType\": \"job\", \"ReportSubType\": \"\", \"ReportName\": \"job-None-application_1755767253999_9679157\", \"UserId\": \"21000*****\", \"ReportStatus\": \"progress\", \"CreatedAt\": \"2025-08-31T23:46:52.408000\", \"UpdatedAt\": \"2025-08-31T23:46:56.682000\", \"CompletedAt\": null, \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"application_1755767253999_9679157\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": null, \"TotalTokens\": null, \"ChatId\": \"session_a4aaca21-0399-4a4a-bf00-f75241224510\"}, {\"ReportId\": \"emr-report-1b546b27-327d-4d0c-8c40-5c4c316ff785\", \"ReportType\": \"job\", \"ReportSubType\": \"\", \"ReportName\": \"job-None-application_1755767253999_9679157\", \"UserId\": \"21000*****\", \"ReportStatus\": \"progress\", \"CreatedAt\": \"2025-08-31T23:46:21.456000\", \"UpdatedAt\": \"2025-08-31T23:46:26.752000\", \"CompletedAt\": null, \"TriggerMethod\": \"realtime\", \"TenantId\": \"default\", \"JobId\": \"application_1755767253999_9679157\", \"ClusterId\": null, \"ServiceId\": null, \"QueueId\": null, \"ProcessingDuration\": null, \"TotalTokens\": null, \"ChatId\": \"session_a4aaca21-0399-4a4a-bf00-f75241224510\"}], \"TotalCount\": 10, \"PageSize\": 10, \"PageNum\": 1}"
}

会话列表 - ListChats

  • Action: ListChats
  • URL:/emr-ai-agent/api/v1/session/list
  • 请求方式:POST

入参

参数名

参数类型

是否必选

说明

JobId

String

作业ID。

ClusterId

String

集群ID。服务诊断时需要

ServiceName

String

服务名称。服务诊断时需要

PageNum

Int

页码

PageSize

Int

页大小

返回结果

参数名

参数类型

是否必选

说明

Items

Array of Chat

用户身份标识

TotalCount

Int

总数

PageSize

Int

页大小

PageNum

Int

页码

Chat

参数名

参数类型

是否必选

说明

Name

String

会话名称

UserId

String

用户ID

LastActive

String

上次会话活跃时间

Status

String

会话状态

  • active
  • closed

CreatedAt

String

2025-09-01T11:25:35.379042

示例

  • 请求
curl -X POST 'http://127.0.0.1:8080/emr-ai-agent/api/v1/session/list' -H 'Content-Type: application/json' -H 'X-Top-Account-Id: 21000*****' -d '{
    
}'
  • 返回
{
  "ResponseMetadata": {
    "RequestId": null,
    "Action": null,
    "Version": null,
    "Service": null,
    "Region": null,
    "Error": null,
    "Deprecated": false
  },
  "Result": {
    "TotalCount": null,
    "Items": [
      {
        "Name": "请帮我诊断该作业",
        "UserId": "21000*****",
        "LastActive": "2025-09-01T15:17:37.766413",
        "Status": "active",
        "CreatedAt": "2025-09-01T15:14:29.323165"
      },
      {
        "Name": null,
        "UserId": null,
        "LastActive": null,
        "Status": null,
        "CreatedAt": null
      },
      {
        "Name": "请帮我诊断该作业",
        "UserId": "21000*****",
        "LastActive": "2025-09-01T11:56:52.113865",
        "Status": "active",
        "CreatedAt": "2025-09-01T11:25:35.379042"
      },
      {
        "Name": "请分析诊断我这个作业",
        "UserId": "21000*****",
        "LastActive": "2025-09-01T10:37:56.239084",
        "Status": "active",
        "CreatedAt": "2025-09-01T10:35:58.706089"
      },
      {
        "Name": "请分析诊断我这个作业",
        "UserId": "21000*****",
        "LastActive": "2025-09-01T01:40:07.784632",
        "Status": "active",
        "CreatedAt": "2025-09-01T01:19:17.680629"
      },
      {
        "Name": "请分析诊断我这个作业",
        "UserId": "21000*****",
        "LastActive": "2025-08-31T23:35:22.530058",
        "Status": "active",
        "CreatedAt": "2025-08-31T23:33:19.810215"
      }
    ],
    "PageNum": 1,
    "PageSize": 10
  }
}

会话详情 - GetChat

  • Action: GetChat
  • URL:/emr-ai-agent/api/v1/session/get
  • 请求方式:POST

入参

参数名

参数类型

是否必选

说明

ChatId

String

会话ID

返回

参数名

参数类型

是否必选

说明

Name

String

会话名称

UserId

String

用户ID

History

Array of ChatHistory

对话历史

LastActive

String

上次会话活跃时间

Status

String

会话状态

  • active
  • closed

CreatedAt

String

2025-09-01T11:25:35.379042

Verbose

Boolean

是否返回生成详细版报告

ChatHistory

参数名

参数类型

是否必选

说明

Role

String

角色

  • user 用户角色
  • assistant Agent角色

Content

String

JSON

  • Role值为user
    • Content内容为text
  • Role值为assistant
    • Content内容为json
    • 示例:
      {       "EventContents": [],
             "DeepReasoning": "",
             "ResponseContent": ""
           }
      

MessageId

String

消息ID

IsLike

String

是否点赞:

  • True:点赞
  • False:点踩
  • null:未操作

示例

  • 请求
curl -X POST 'http://127.0.0.1:8080/emr-ai-agent/api/v1/session/get' -H 'Content-Type: application/json' -H 'X-Top-Account-Id: 21000*****' -d '{
"ChatId":"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a"
}'
  • 返回
{
  "ResponseMetadata": {
    "RequestId": null,
    "Action": null,
    "Version": null,
    "Service": null,
    "Region": null,
    "Error": null,
    "Deprecated": false
  },
  "Result": {
    "Name": "请帮我诊断该作业",
    "UserId": "21000*****",
    "History": [
      {
        "Role": "user",
        "Content": "请帮我诊断该作业"
      },
      {
        "Role": "assistant",
        "Content": {
          "EventContents": [
            "{\"Type\": \"json\", \"Event\": \"action-init-start\", \"Name\": \"\\u64cd\\u4f5c\\u521d\\u59cb\\u5316\", \"Content\": {\"ReportId\": \"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\"}, \"ChatId\": \"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a\", \"MessageId\": \"message_350f4951-f9ac-4563-bb9a-8c64d7f94199\", \"Timestamp\": \"2025-09-01T15:13:10.838530\"}",
            "{\"Type\": \"json\", \"Event\": \"collect-start\", \"Name\": \"\\u8bca\\u65ad\\u4e0a\\u4e0b\\u6587\\u91c7\\u96c6\\u5f00\\u59cb\", \"Content\": {\"ReportId\": \"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\"}, \"ChatId\": \"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a\", \"MessageId\": \"message_350f4951-f9ac-4563-bb9a-8c64d7f94199\", \"Timestamp\": \"2025-09-01T15:13:10.838530\"}",
            "{\"Type\": \"json\", \"Event\": \"collect-end\", \"Name\": \"\\u8bca\\u65ad\\u4e0a\\u4e0b\\u6587\\u91c7\\u96c6\\u7ed3\\u675f\", \"Content\": {\"ReportId\": \"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\", \"ContextUrl\": \"http://127.0.0.1:8080/emr-ai-agent/api/v1/report/emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\"}, \"ChatId\": \"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a\", \"MessageId\": \"message_350f4951-f9ac-4563-bb9a-8c64d7f94199\", \"Timestamp\": \"2025-09-01T15:13:10.838530\"}",
            "{\"Type\": \"json\", \"Event\": \"check-collect-start\", \"Name\": \"\\u6821\\u9a8c\\u8bca\\u65ad\\u4e0a\\u4e0b\\u6587\\u5f00\\u59cb\", \"Content\": {\"ReportId\": \"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\"}, \"ChatId\": \"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a\", \"MessageId\": \"message_350f4951-f9ac-4563-bb9a-8c64d7f94199\", \"Timestamp\": \"2025-09-01T15:13:10.838530\"}",
            "{\"Type\": \"json\", \"Event\": \"check-collect-end\", \"Name\": \"\\u6821\\u9a8c\\u8bca\\u65ad\\u4e0a\\u4e0b\\u6587\\u7ed3\\u675f\", \"Content\": {\"ReportId\": \"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\"}, \"ChatId\": \"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a\", \"MessageId\": \"message_350f4951-f9ac-4563-bb9a-8c64d7f94199\", \"Timestamp\": \"2025-09-01T15:13:10.838530\"}",
            "{\"Type\": \"json\", \"Event\": \"diagnose-start\", \"Name\": \"\\u8bca\\u65ad\\u5f00\\u59cb\", \"Content\": {\"ReportId\": \"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\"}, \"ChatId\": \"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a\", \"MessageId\": \"message_350f4951-f9ac-4563-bb9a-8c64d7f94199\", \"Timestamp\": \"2025-09-01T15:13:10.838530\"}",
            "{\"Type\": \"json\", \"Event\": \"diagnose-end\", \"Name\": \"\\u8bca\\u65ad\\u7ed3\\u675f\", \"Content\": {\"ReportId\": \"emr-report-6f0ddf58-55af-4cd2-8c4e-5a90889d182d\", \"TotalTokens\": 6133}, \"ChatId\": \"session_52614d9e-4d0b-4b6c-b912-1969a92afc1a\", \"MessageId\": \"message_350f4951-f9ac-4563-bb9a-8c64d7f94199\", \"Timestamp\": \"2025-09-01T15:13:10.838530\"}"
          ],
          "DeepReasoning": "我们开始分析这个Spark作业。首先,作业的基本信息如下:\n- Job ID: 30557****\n- 名称: inspection-insert-spark-jar-source-table\n- 队列: inspection_dont_del\n- 提交者: inspection_ss\n- 状态: COMPLETED(成功完成)\n- 任务类型: SQL\n- 开始时间: 2025-08-29 12:01:13\n- 结束时间: 2025-08-29 12:02:16(总耗时约63秒)\n- 引擎类型: SparkCli\n\n查询语句为:\n```sql\ninsert into inspection_ss_ss_inspection_vci_schema_inspection_dont_del_sparktest.parquet_spark_source_name PARTITION (dt='1') values(1,'test',18)\n```\n这是一个向分区表插入单行数据的简单操作。\n\n接下来,查看日志和Spark应用详情:\n\n1. **提交日志摘要(Submission Log Summary)**:\n   - 有几条关于配置项弃用的WARN日志,但只是警告,不影响作业执行。\n   - 另外有一条警告:`The client is using resource type 'sparkapplications' with unstable version 'v1beta2'`,这可能是客户端版本问题,但作业成功完成,因此不是关键问题。\n\n2. **执行日志摘要(Execution Log Summary)**:显示“No logs available”,没有执行日志可用。这可能是因为作业简单且成功完成,没有产生错误日志。\n\n3. **Spark应用详情**:\n   - **Executors(执行器)**:\n     - Driver:内存使用约275MB(281393KB),总内存约7.02GB(7542197452字节)。无任务运行。\n     - Executor 1:4核,内存使用同样约275MB。完成了1个任务,总任务时间1746毫秒(约1.7秒)。\n   - **Jobs**:一个作业(Job 0),状态为SUCCEEDED,提交到完成时间约2.16秒(2025-08-29T04:01:47.109GMT 到 2025-08-29T04:01:49.268GMT)。\n   - **Stages**:一个Stage(Stage 0),状态为COMPLETE。该Stage有1个任务,全部完成。Stage的详细指标:\n     - Executor反序列化时间:627毫秒\n     - Executor运行时间:1045毫秒\n     - 结果序列化时间:2毫秒\n     - 输入输出记录:输出1条记录(对应插入一行数据)\n     - 无shuffle操作(shuffle读写均为0)\n\n**诊断过程**:\n- 作业状态为成功(COMPLETED),说明没有失败。\n- 整个作业耗时63秒,但实际Spark作业执行时间只有2.16秒(从Job提交到完成)。这说明大部分时间消耗在作业提交和资源分配上(约60秒),而非实际计算。\n- 在服务器实例环境中,作业提交和启动Driver/Executor可能涉及资源分配(如Pod启动),这通常称为\"冷启动\"开销。对于如此简单的作业,这种开销占主导地位。\n- 资源使用方面:Executor内存使用很低(275MB),且CPU时间也很短(实际运行时间约1秒)。没有数据倾斜或GC问题。\n\n**严重性级别**:\n- 由于作业成功,没有失败问题→无Critical。\n- 性能方面:虽然实际计算快,但总耗时63秒(其中60秒为启动开销),对于这个简单操作来说可能过长→警告(Warning)。\n- 优化机会:减少启动开销(例如重用资源)和配置简化→信息(Info)。\n\n**具体分析**:\n- **性能瓶颈**:主要瓶颈是作业提交和资源分配(冷启动)时间。实际计算只占3%的时间。\n- **资源利用**:资源分配(1个Driver+1个Executor/4核)相对于这个作业过大(只需插入一行),但服务器实例环境的最小分配可能受限。\n- **配置检查**:作业配置中`serverless.spark.analysis=true`已开启,但未利用重用机制(如会话重用)。另外,弃用配置项虽不影响运行,但建议更新以避免未来问题。\n\n**优化建议**:\n1. **配置优化**:\n   - 移除弃用配置项:替换`spark.maxRemoteBlockSizeFetchToMem`为`spark.network.maxRemoteBlockSizeFetchToMem`,以及`spark.scheduler.listenerbus.eventqueue.size`为`spark.scheduler.listenerbus.eventqueue.capacity`,以保持兼容性。\n   - 对于简单作业,考虑降低资源分配(例如Executor核数),但服务器实例环境可能有最小限制。可尝试配置更小的Executor(例如1核1G),但要测试是否允许。\n   - 开启或优化会话重用:使用`spark.serverless.session.reuse=true`来避免重复启动资源(如果集群支持)。这样多个作业可共享同一上下文,减少启动开销。\n\n2. **代码优化**:\n   - 当前SQL是单行插入,效率低。如果需插入多行,应批量插入(如通过`INSERT INTO ... VALUES (...), (...)`)或从文件加载。\n   - 但本例仅插入一行,无代码优化空间。\n\n3. **成本优化**:\n   - 虽然实际计算资源使用少,但占用整个Executor约60秒(从启动到释放)。建议合并简单操作:例如,若有多个类似插入操作,可在一个作业中批量执行,而非提交多个独立作业。\n   - 利用会话重用减少资源分配时间。\n\n4. **服务器实例特定优化**:\n   - 若作业频繁运行(如每分钟运行一次),强烈建议使用会话池(Session Pool),以避免冷启动。\n   - 监控网络延迟:虽然本例无网络问题,但启动慢可能包含网络调度延迟,确保集群健康。\n\n**最终报告**如下:\n",
          "ResponseContent": "\n### 作业诊断报告:JobID-30557****\n\n### 诊断概述\n- **分析过程**:\n  - 结合基础信息、日志和指标逐步分析:\n    1. 作业状态为 **COMPLETED**(成功),总耗时 63 秒(12:01:13 - 12:02:16)\n    2. 提交日志存在弃用配置告警但无致命错误\n    3. Spark 详情显示:\n       - 仅一个 Stage 且状态为 COMPLETE\n       - Executor 资源使用率极低(内存 275MB/7GB,CPU 几乎空闲)\n       - 无 Shuffle 操作(`shuffle_read_bytes=0`)\n       - 单任务执行耗时仅 1.7 秒(`executor_run_time=1045ms`)\n    4. 实际计算时间仅占全程 3%(2秒/63秒)\n- **严重级别**:⚠️ **警告**  \n  (资源利用率过低导致隐性成本浪费)\n\n---\n\n### 失败分析\n- **错误摘要**:无失败信息  \n  (作业成功完成,无错误日志)\n- **根因分析**:不适用\n\n---\n\n### 性能分析\n#### 📊 Stage 关键指标\n| 指标                | 值       | 分析结论               |\n|---------------------|----------|-----------------------|\n| 总耗时              | 63 秒    | 99%时间为等待资源分配 |\n| Executor 运行时间    | 1.045 秒 | 有效计算时间占比极低   |\n| Executor 内存使用量 | 275 MB   | 远低于分配额度(7GB)  |\n| Shuffle 数据量      | 0 B      | 无数据交换操作        |\n| 输出记录数           | 1 行     | 极轻量写入任务         |\n\n#### 🧩 瓶颈定位\n1. **资源启动开销过大**  \n   - 冷启动耗时占总耗时 97%(约 61 秒)\n   - 典型 Serverless 问题:资源分配时间长于计算本身\n2. **资源配置严重冗余**  \n   - 4 核 Executor 仅处理单行数据插入\n   - 内存使用率不足 4% → 隐性成本浪费\n3. **表分区写入开销**  \n   - `PARTITION (dt='1')` 产生额外 HDFS 元数据操作\n   - 对小批量写入不高效\n\n---\n\n### 优化建议\n#### ⚙️ 配置优化\n1. **降低 Executor 规格**  \n   ```python\n   # 当前:4 核 7GB → 建议:1 核 2GB\n   spark.executor.cores=1\n   spark.executor.memory=2g\n   ```\n   **理由**:适配轻量任务特性,减少资源空闲浪费,降低 50%+ 成本\n\n2. **启用会话复用**  \n   ```python\n   spark.serverless.session.reuse=true\n   spark.serverless.session.timeout=300s\n   ```\n   **理由**:避免冷启动开销,后续同类作业可复用资源池,缩短耗时至 5 秒内\n\n#### ✨ 代码优化\n1. **批量写入代替单行插入**  \n   ```sql\n   -- 当前:单行插入\n   INSERT ... VALUES(1,'test',18);\n   \n   -- 优化:批量插入(示例)\n   INSERT INTO table PARTITION(dt='1')\n   SELECT 1, 'test', 18 UNION ALL\n   SELECT 2, 'demo', 20; -- 添加更多行\n   ```\n   **理由**:分摊启动开销,提升吞吐量\n\n2. **避免小文件写入**  \n   ```python\n   # 写入前合并小分区\n   spark.conf.set(\"spark.sql.adaptive.enabled\", true)\n   spark.conf.set(\"spark.sql.adaptive.coalescePartitions.enabled\", true)\n   ```\n   **理由**:预防高频小批量写入产生海量小文件,减轻 HDFS 压力\n\n#### 💰 成本优化\n1. **触发模式优化**  \n   - 从按需触发 → 定时批处理(如每 5 分钟聚合写入)  \n   **理由**:减少作业次数,利用规模效应降低成本 60%+\n\n2. **监控资源闲置率**  \n   ```sql\n   -- 添加监控指标(示例)\n   SELECT\n     SUM(max_memory) AS allocated_mem,\n     SUM(memory_used) AS used_mem,\n     (SUM(used_mem)/SUM(allocated_mem)) AS mem_util\n   FROM __executor_metrics__\n   ```\n   **理由**:持续追踪利用率,动态调整资源规格\n\n---\n\n### 总结\n作业因 **过度分配资源+冷启动延迟** 导致隐性成本浪费,通过会话复用、规格降配、批量写入可优化至 **5 秒内完成,成本降低 70%**。建议重点优化资源配置策略和写入模式。"
        }
      }
    ],
    "LastActive": "2025-09-01T15:17:37.766413",
    "Status": "active",
    "CreatedAt": "2025-09-01T15:14:29.323165"
  }
}
最近更新时间:2026.08.11 11:53:40
这个页面对您有帮助吗?
有用
有用
无用
无用