Spark 3.3.2 中启动一个可以让外部服务连接并进行即席查询的 Spark SQL 服务,最标准的方法是启动 ThriftServer。ThriftServer 充当一个 JDBC/ODBC 服务,它允许各种客户端(如 BI 工具、Python脚本使用 pyspark 连接、Java 应用等)通过标准的 JDBC 或 ODBC 协议来连接到 Spark 并执行 SQL 查询。

以下是启动 ThriftServer 的步骤和相关配置:

1. 启动 ThriftServer

Spark 的安装包里自带了启动脚本。

# YARN 模式
$SPARK_HOME/sbin/start-thriftserver.sh \
    --master yarn \
    --deploy-mode client \
    --conf spark.driver.memory=1g \
    --conf spark.executor.instances=1 \
    --conf spark.executor.memory=1g \
    --conf spark.executor.cores=1 \
    --conf spark.sql.hive.thriftServer.port=10000

命令参数说明

参数

作用

--master yarn

指定运行模式为 YARN

--deploy-mode client

Thrift Server 必须用 client 模式(driver 运行在启动节点)

spark.sql.hive.thriftServer.port

自定义 Thrift Server 端口(默认 10000)

spark.yarn.queue

指定 YARN 队列(若集群有队列划分)

2. 连接到 ThriftServer

启动成功后,你就可以使用支持 JDBC/ODBC 的工具或代码来连接了。

使用 Beeline (Spark 自带的 CLI 客户端):

$SPARK_HOME/bin/beeline -u jdbc:hive2://192.168.1.212:10000

注:192.168.1.212是提交ThriftServer的机器

使用 Python (PyHive 或 impyla):

from pyhive import hive
# or from impala.dbapi import connect (if using impyla)

conn = hive.Connection(host='my-spark-server', port=10000, username='your_username', auth='NOSASL')
cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table LIMIT 5")
for row in cursor.fetchall():
    print(row)
cursor.close()
conn.close()

使用 Java (JDBC):

import java.sql.*;

public class SparkSQLClient {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:hive2://my-spark-server:10000/";
        Connection con = DriverManager.getConnection(url, "your_username", "");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SHOW DATABASES");
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }
        // ... close resources
        rs.close(); stmt.close(); con.close();
    }
}
// 注意:需要将 Hive JDBC driver (e.g., hive-jdbc) 及其依赖加入 CLASSPATH

3. 停止 ThriftServer

当需要停止服务时,可以使用对应的停止脚本:

$SPARK_HOME/sbin/stop-thriftserver.sh

重要提示:

  • Metastore: ThriftServer 通常与 Hive Metastore 集成以管理元数据(数据库、表结构等)。如果你的数据是通过 Spark 创建的临时视图,那么它们只存在于启动 ThriftServer 的那个 SparkSession 中。如果需要持久化元数据,需要配置 hive.metastore.uris 指向你的 Hive Metastore 服务。

  • 安全性: NOSASL 认证非常不安全,仅适用于开发和测试环境。生产环境必须配置适当的安全措施。

  • 资源管理: ThriftServer 作为一个 Spark 应用,会消耗集群资源。请根据预期负载合理分配 driver-memory, executor-memory, num-executors 等参数。

  • 依赖: 客户端连接时需要相应的 JDBC/ODBC 驱动。