mcpField
S
Spark SQL

Spark SQL

本地服务
github.com/aidancorrell数据库137 周前更新

关于 Spark SQL

Spark SQL 是用于查询 HiveServer2 兼容集群的 MCP 服务,适用于 Spark、EMR、Hive、Impala 和 Presto。它为需要访问集群数据的 AI 助手提供结构发现和带安全限制的只读 SQL 查询。

主要功能

  1. 01执行只读 SQL 查询
  2. 02发现数据库和数据表
  3. 03支持多种身份验证方式
  4. 04为无界查询自动添加 LIMIT
  5. 05清理数据库错误信息

适用场景

  1. 01查看数据库和表结构
  2. 02查询 Spark 集群中的分析数据
  3. 03连接 EMR 或其他 HiveServer2 系统

MCP 相关

向 MCP 客户端提供数据库列表、数据表列表、表结构查看和只读查询工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"aidancorrell-spark-sql": {
"command": "uvx",
"args": [
"spark-sql-mcp-server"
],
"env": {
"SPARK_HOST": "<SPARK_HOST>",
"SPARK_PORT": "<SPARK_PORT>",
"SPARK_DATABASE": "<SPARK_DATABASE>",
"SPARK_AUTH": "<SPARK_AUTH>",
"SPARK_USERNAME": "<SPARK_USERNAME>",
"SPARK_PASSWORD": "<SPARK_PASSWORD>",
"SPARK_KERBEROS_SERVICE_NAME": "<SPARK_KERBEROS_SERVICE_NAME>"
}
}
}
}
启动命令uvx spark-sql-mcp-server
需要配置的环境变量
SPARK_HOSTHostname of the Spark Thrift Server
SPARK_PORTPort of the Spark Thrift Server (default: 10000)
SPARK_DATABASEDefault database to use
SPARK_AUTH密钥Authentication method: NONE, LDAP, KERBEROS, CUSTOM, or NOSASL
SPARK_USERNAMEUsername for LDAP authentication
SPARK_PASSWORD密钥Password for LDAP authentication
SPARK_KERBEROS_SERVICE_NAMEKerberos service name (default: hive)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypispark-sql-mcp-server0.1.2

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Spark SQL MCP 服务

一个 MCP 服务,可通过 Thrift/HiveServer2 协议让 AI 助手查询 Spark SQL 集群。

兼容任何 HiveServer2 系统:Apache Spark、AWS EMR、Hive、Impala、Presto。

功能

  • 查询 Spark SQL — 对 Spark 集群执行只读 SQL 查询
  • 发现架构 — 列出数据库、表并查看表结构
  • 多种身份验证方式 — 支持 NONE、LDAP、NOSASL、CUSTOM 和 Kerberos 身份验证
  • 兼容 EMR — 开箱即用,适用于 AWS EMR 集群
  • 只读限制 — 仅允许 SELECT、SHOW、DESCRIBE、EXPLAIN 和 WITH 语句
  • 安全默认设置 — 为无界查询自动添加 LIMIT 子句,并清理错误消息

安装

pip install spark-sql-mcp-server

或者直接使用 uvx 运行:

uvx spark-sql-mcp-server

快速开始

1. 设置环境变量
export SPARK_HOST="your-emr-master-node.amazonaws.com"
export SPARK_PORT="10000"        # default
export SPARK_DATABASE="default"  # default
export SPARK_AUTH="NONE"         # NONE | LDAP | KERBEROS | CUSTOM | NOSASL
2. 添加到 Claude Code

全局(所有项目)——在项目的 mcpServers 下添加到 ~/.claude.json:

{
  "mcpServers": {
    "spark-sql": {
      "command": "uvx",
      "args": ["spark-sql-mcp-server"],
      "env": {
        "SPARK_HOST": "your-emr-master-node.amazonaws.com",
        "SPARK_PORT": "10000",
        "SPARK_AUTH": "NONE"
      }
    }
  }
}

项目级别——在仓库中的 .claude/mcp.json 添加:

{
  "mcpServers": {
    "spark-sql": {
      "command": "uvx",
      "args": ["spark-sql-mcp-server"],
      "env": {
        "SPARK_HOST": "your-emr-master-node.amazonaws.com",
        "SPARK_PORT": "10000",
        "SPARK_AUTH": "NONE"
      }
    }
  }
}
3. 添加到 Claude Desktop

添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "spark-sql": {
      "command": "uvx",
      "args": ["spark-sql-mcp-server"],
      "env": {
        "SPARK_HOST": "your-emr-master-node.amazonaws.com",
        "SPARK_PORT": "10000"
      }
    }
  }
}
4. 查询

可以向 Claude 提出以下问题:

  • “我们的 Spark 集群中有哪些数据库?”
  • “显示 sales.transactions 表的架构”
  • “从 analytics 数据库中查询收入最高的 10 位客户”

可用工具

工具说明
list_databases列出所有可用数据库
list_tables列出数据库中的表
describe_table获取表架构(列、类型)
execute_query运行只读 SQL 查询并返回格式化结果

身份验证

无身份验证(默认)
export SPARK_AUTH="NONE"
LDAP
export SPARK_AUTH="LDAP"
export SPARK_USERNAME="your-username"
export SPARK_PASSWORD="your-password"
Kerberos
export SPARK_AUTH="KERBEROS"
export SPARK_KERBEROS_SERVICE_NAME="hive"  # default
# Ensure you have a valid Kerberos ticket (kinit)

AWS EMR 设置

  1. 安全组 — 允许来自你 IP 的入站流量访问端口 10000
  2. SSH 隧道(推荐):
    ssh -i your-key.pem -L 10000:localhost:10000 hadoop@your-emr-master
    
  3. 设置 SPARK_HOST=localhost

开发

git clone https://github.com/aidancorrell/spark-sql-mcp-server.git
cd spark-sql-mcp-server
pip install -e ".[dev]"
pytest
ruff check .
使用 Docker 进行本地测试

Docker Compose 配置提供本地 Spark Thrift Server,并附带示例数据,用于集成测试。

# Start the Spark Thrift Server
cd docker && docker compose up -d

# Wait for it to be ready (takes ~30s on first start)
docker logs -f spark-thrift-server  # look for "Sample data loaded."

# Run integration tests
pytest -m integration -v

# Tear down
cd docker && docker compose down -v

本地服务包含示例表:default.employees、default.orders 和 test_db.metrics。

默认情况下,pytest 会运行单元测试(除非指定 -m integration,否则会跳过集成测试)。

在 Claude Code 中使用本地服务

Docker Spark 服务运行后,将其添加到 MCP 配置中,即可交互式测试该服务。

全局——在项目的 mcpServers 下添加到 ~/.claude.json:

{
  "spark-sql": {
    "command": "uvx",
    "args": ["spark-sql-mcp-server"],
    "env": {
      "SPARK_HOST": "localhost",
      "SPARK_PORT": "10000",
      "SPARK_AUTH": "NONE"
    }
  }
}

项目级别——添加到 .claude/mcp.json:

{
  "mcpServers": {
    "spark-sql": {
      "command": "uvx",
      "args": ["spark-sql-mcp-server"],
      "env": {
        "SPARK_HOST": "localhost",
        "SPARK_PORT": "10000",
        "SPARK_AUTH": "NONE"
      }
    }
  }
}

然后启动新的 Claude Code 会话,并让它查询示例数据。

安全

只读限制

execute_query 工具仅允许执行只读 SQL 语句。查询必须以以下关键字之一开头:SELECT、SHOW、DESCRIBE、DESC、EXPLAIN 或 WITH。所有其他语句类型(DROP、INSERT、DELETE、CREATE、ALTER、SET、ADD JAR 等)都会在到达 Spark 集群前被拒绝。

错误信息清理

数据库错误会在返回给 MCP 客户端之前进行清理。不会暴露服务器主机名、文件路径和堆栈跟踪等内部细节。连接失败时只报告目标主机/端口和错误类型。

凭据处理
  • 密码不会包含在日志输出或错误消息中
  • SparkConfig 对象在字符串表示中会隐藏密码
  • 在 MCP 注册表架构中,SPARK_PASSWORD 被标记为密钥
已知限制
  • 不支持 TLS/SSL — Thrift 连接未加密。在生产环境中使用 LDAP 身份验证时,请通过 SSH 隧道保护传输中的凭据。
  • 无查询超时 — 长时间运行的查询不会自动取消。请依赖 Spark 集群级别的超时配置。
  • 无按用户访问控制 — 所有查询都以配置的 Spark 用户权限执行。请使用 HiveServer2 授权(Ranger、Sentry)在数据库级别限制访问。
  • 身份验证模式默认为 NONE — 适用于本地开发,但不适用于生产环境。在需要身份验证的环境中,将 SPARK_AUTH 设置为 LDAP 或 KERBEROS。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。