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命令参数说明
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) 及其依赖加入 CLASSPATH3. 停止 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 驱动。
评论