Files
spark-mcp/ARCHITECTURE.md
T
tao.chenandClaude d6dd2b846f Phase 6: 部署文档 + 启动脚本 + 配置样例
- README.md (英文): 项目概览 + 11 Tool 表格 + 12 env 变量全表
  + 6 admin 端点 + 安全模型 (3 道防线 + 4 项额外保证) + dev 命令
- .env.example: 12 env 变量 + 默认值 + 必填标注
- scripts/dev.sh: 一键 build + 后台启动 (nohup + PID 文件) + healthz 验证
- scripts/seed.sh: admin POST 一个示例 cluster (从 .env 读 admin token)
- ARCHITECTURE.md (中文): 包依赖图 + 数据流 + 11 Tool 分类 + 关键设计决策
- docs/runbook.md (中文): 部署 + 升级 + 故障排查 (401/404/422 等)
- docs/systemd/spark-mcp-go.service: systemd unit 模板

README 安全模型小修正: 第 3 道防线从"spark_submit flag 白名单"
(实际不存在) 改为 "upload_file 路径白名单", 加 Additional guarantees
小节列 slice form / json:"-" / 跨主机 redirect / per-tool log 权限。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-10 17:24:19 +08:00

2.6 KiB
Raw Blame History

spark-mcp-go 架构说明

包依赖图

main
  ├─ config
  ├─ logging
  ├─ storage (SQLite)
  ├─ admin
  │    └─ storage / cluster / audit
  ├─ mcp
  │    ├─ tools
  │    │    ├─ rm
  │    │    ├─ httpclient
  │    │    ├─ analyzer
  │    │    └─ storage / cluster
  │    └─ server (mark3labs/mcp-go)
  └─ middleware
  • admin 只依赖 storageclusterauditmiddleware
  • tools 依赖 rmResourceManager 客户端)、httpclient(通用 HTTP 原语)、analyzer(日志分析)。
  • mcp 聚合所有 Tools,注册到 mark3labs/mcp-go 的 Streamable HTTP server。
  • main 负责加载配置、打开数据库、挂载路由、启动 HTTP 服务。

数据流

  1. 管理员调用 /admin/clusters POST,写入 cluster JSON。
  2. storage 把 cluster 持久化到 SQLite(后续会对敏感字段加密)。
  3. LLM Agent 调用 /mcp Tool(如 list_clusters)。
  4. Tool 从 storage 读取 cluster,携带 auth 信息,通过 httpclient 或本地 spark-submit 调用 YARN/Spark。
  5. 结果返回给 LLM;每次 Tool 调用同时写入独立审计日志。

11 Tools 分类

分类 Tools
discovery list_clusters
exec spark_submit
RM list_applications, get_application_status, get_application_logs, kill_application, fetch_cluster_env
SHS fetch_spark_metrics
analyzer analyze_spark_log
原语 fetch_url, upload_file

关键设计决策

  • slice-form spark_submit:参数以字符串数组传入,避免 shell 拼接和注入。
  • cluster url_allowlist:所有外发 HTTPfetch_url、RM、SHS)必须匹配 allowlist,防止 SSRF。
  • 日志降级链get_application_logs 依次尝试 amContainerLogs、aggregated-logs、通用 logs 端点。
  • 多 token adminADMIN_TOKENS 支持逗号分隔多管理员 token,便于轮换。
  • per-tool 独立审计日志:每个 Tool 每次调用写入 ${LOG_DIR}/tools/<tool>.log,文件权限 0600
  • auth_password 不可通过 JSON 创建:字段带 json:"-" tag,避免接口泄露密码;生产通过专用端点或数据库初始化写入。

安全模型(三道防线)

  1. Token 鉴权ADMIN_TOKENS 保护管理面,AGENT_TOKEN 保护 MCP 面。
  2. SSRF 防护fetch_url 与所有集群请求都走 cluster allowlist,且内置 DNS rebinding 检查。
  3. 路径/参数白名单spark_submit 仅允许 jar、class、--conf 等安全参数;禁止 shell 元字符与重定向。

运行与部署

详见 docs/runbook.md