简介
大数据 SQL 就是 大数据环境中使用 SQL 来处理和分析海量数据的技术和方法。 让用户能使用熟悉的 SQL 语法来查询、分析和操作大规模分布式数据集,而不需要深入了解底层的分布式计算原理。
今天要讲的 SparkThriftServer 也是一种大数据SQL的实现,分享一下最近学习和实践 SparkThriftServer 得到的一些经验和认知,以下的内容大部分会围绕着 SparkThriftServer 来进行阐述
这是hiveServer 和 Spark 的时间节点
2009 2012 2013 2014 2015
|-------------------------|-------------------|---------------|-----------------|-----------------|
Hive 初版 HiveServer2 Spark 0.8 Spark 1.0 Spark 1.2
HiveServer1 (增强版ThriftServer) (Spark项目崭露头角) (引入SparkSQL) (引入SparkThriftServer)
(早期ThriftServer实现)
SparkThriftServer 是 Spark 提供的一个RPC服务,提供JDBC,ODBC等方式的访问 (类似flink sql gateway) ,充当客户端和 Spark SQL 之间的桥梁,使得用户可以在最小改动的情况下,从 Hive 过渡到 Spark SQL。我们快速取数之前的的spark就是以这种方式运行的。
它目的是取代 HiveServer 。得益于Spark的优秀处理能力,它能大幅提高查询速度和处理效率
SparkThriftServer其实就是一个Driver,相比于其他的Driver,它额外的对外开发了端口,处理了session
SparkThriftServer工作流程
服务启动简介
启动后如何调用?
//生成connection 需要有Driver -- org.apache.hive.jdbc.HiveDriver
Connection connection = DriverManager.getConnection(
"jdbc:hive2://localhost:10000",
"user",
"password"
);
Statement statement = connection.createStatement();
String sql= "select 1";
ResultSet resultSet = statement.executeQuery(sql);
程序初始化流程
graph TD
A[应用程序启动] --> B[加载配置]
B --> C[SparkSession 初始化]
C --> D[SparkThriftServer 实例化]
D --> E[服务组件初始化]
E --> F[连接到 HMS]
E --> G[CLIService 初始化]
E --> H[SessionManager 初始化]
E --> I[OperationManager 初始化]
E --> J[Thrift 服务器启动]
J --> L[线程池与端口绑定]
E --> M[日志记录]
E --> N[健康检查与监控]
J --> O[等待客户端连接]
O --> P[处理客户端请求]
style A fill:#f9f,stroke:#333,stroke-width:4px
style B fill:#bbf,stroke:#333,stroke-width:2px
style C fill:#bbf,stroke:#333,stroke-width:2px
style D fill:#bbf,stroke:#333,stroke-width:2px
style E fill:#bbf,stroke:#333,stroke-width:2px
style F fill:#ccf,stroke:#333,stroke-width:1px
style G fill:#ccf,stroke:#333,stroke-width:1px
style H fill:#ccf,stroke:#333,stroke-width:1px
style I fill:#ccf,stroke:#333,stroke-width:1px
style J fill:#bbf,stroke:#333,stroke-width:2px
style L fill:#ccf,stroke:#333,stroke-width:1px
style M fill:#ccf,stroke:#333,stroke-width:1px
style N fill:#ccf,stroke:#333,stroke-width:1px
style O fill:#bbf,stroke:#333,stroke-width:2px
style P fill:#ccf,stroke:#333,stroke-width:1px
SparkThriftServer是如何隔离不同查询的资源的?
但也存在问题,虽然是在不同的session进行了资源隔离,但是如果有jar包类冲突,并没有额外的classLoader进行处理
实际访问流程图
具体的事项 是CLIService中的 SessionManager ,OperatorManager 和 ExecuteStatementOperation 进行的处理
下面是从SQL到具体的执行会经历的流程
#1 输入Sql
SELECT name, age FROM users WHERE age > 18;
#2 解析SQL - AST
(sqlStatement
(selectStatement
(querySpecification
SELECT
(selectElements
(selectElement name),
(selectElement age))
FROM
(tableSource users)
WHERE
(expression
(predicate
(comparisonOperator >)
18)))));
#3 逻辑计划 能基于RBO优化
Project [name, age]
Filter [age > 18]
Relation [users]
#4 物理计划 能基于CBO优化
*(1) Project [name, age]
+- *(1) Filter [age > 18]
+- *(1) Scan JDBCRelation(users) [age#0, name#1]
将每个物理操作对应一个或多个RDD, 并生成DAG图 然后划分Stages,每个阶段包含一组可以并行的任务 生成jar包 -> 分发到Excutor上执行
使用和限制
| 优点 | 缺点 | |
|---|---|---|
| HiveServer | 生态完备 稳定性,可用性高 | 基于MapReduce 性能较低 |
| SparkThriftServer | 性能较好 与hive的兼容性好 | Server是一个Driver,承担太多工作,服务可用性问题资源隔离问题 |
| trino/presto | 性能好 多数据源支持 | 内存需求较高 容错能力较低 不能执行批处理 |
Kyuubi 较好 | server轻量 支持多种隔离级别 可用性高 | 基于spark,系统复杂度增加 |
SparkThriftServer也可以基于Zookeeper或其他的协调服务实现高可用解决方案 但是需要处理一系列复杂的问题,包括负载均衡、状态同步、故障检测和切换、资源隔离等
SparkThriftServer 能做什么
1 血缘解析
2 校验sql
3 校验权限