SparkThriftServer原理和实践

122 阅读3分钟

简介

大数据 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的优秀处理能力,它能大幅提高查询速度和处理效率

image-20240523234123777.png

SparkThriftServer其实就是一个Driver,相比于其他的Driver,它额外的对外开发了端口,处理了session

SparkThriftServer工作流程

服务启动简介

txt010_33.jpg

启动后如何调用?

//生成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是如何隔离不同查询的资源的?

image-20240523232844126.png

但也存在问题,虽然是在不同的session进行了资源隔离,但是如果有jar包类冲突,并没有额外的classLoader进行处理

实际访问流程图

SparkSQL@2.png

具体的事项 是CLIService中的 SessionManager ,OperatorManager 和 ExecuteStatementOperation 进行的处理

SparkSQL@3.png

下面是从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或其他的协调服务实现高可用解决方案 但是需要处理一系列复杂的问题,包括负载均衡、状态同步、故障检测和切换、资源隔离等

image-20240523223235572.png

Kyuubi-01.png

SparkThriftServer 能做什么

1 血缘解析

2 校验sql

3 校验权限