Spark-ThriftServer源码分析

Spark1.1之后的版本引入了ThriftServer和CLI,使得Hive用户和RDBMS用户可以直接通过JDBC方式提交SQL至Spark运行而无需编写sparksql代码,下面对spark-thriftserver的源码进行简单分析。

执行${SPARK_HOME}/sbin/start-thriftserver.sh即可启动thriftserver,默认端口为10000,HiveStatement提交sql时对应的url为 jdcb:hive2://localhost:10000/default,此时通过Hive提交的sql将在sparksql中执行。


通过start-thriftserver.sh的代码可以发现,后台是提交了org.apache.spark.sql.hive.thriftserver.HiveThriftServer2类至spark-submit执行。对HiveThriftServer2源码的阅读可以发现,HiveThriftServer2注册了ThriftBinaryCLIService服务,而thriftserver服务端绑定的Processor为TCLIService.Processor类。


通过getProcessMap方法可以发现,Processor类中已经预先注册了相关的thrift调用接口。

ThriftBinaryCLIService类中通过启动TThreadPoolServer来监听thrift客户端请求,下面以HiveStatement的executeQuery为例,分析整个执行流程。

executeQuery方法在内部调用sendBase向thrift服务器发送请求,sendBase方法的签名为void sendBase(String methodNmae, TBase args); methodName为接口名,args为参数,在这里methodName为"ExecuteStatement"。

服务端收到请求之后,解析出method参数名为ExecuteStatement,从processMap中获取TCLIService.Processor.ExecuteStatement,调用该类的getReasult方法,该方法中调用iface.ExecuteStatement,iface.ExecuteStatement的实现有两种,TCLIService.ExecuteStatement和ThriftCLIService.ExecuteStatement,前者为客户端的实现,后者是服务端的实现:


由cliService.executeStatementAsync一直看下去,最终到了HiveSessionIml.executeStatementInternal,具体实现为


getOperationManager方法返回org.apache.spark.sql.hive.thriftserver.server.SparkSQLOperationManager类,其newExecuteStatementOperation的具体实现为:


可以看到其返回了SparkExecuteStatementOperation类,最终operation.run方法是调用了SparkExecuteStatementOperation的execute方法:


可以看到execute方法中通过sqlContext执行对应的sql语句并返回结果,TCLIService.Processor.ExecuteStatement.getResult执行完成后,通过thrift协议返回结果给客户端:


整体的服务流程通过TThreadPoolServer类的run方法可以看得很清楚:


最后给出ThriftServer的Processor端处理的时序图:


写得比较乱,欢迎各位交流指正!

Spark-ThriftSpark-SQL是Spark框架中的两个组件,它们有以下区别: 1. Spark-SQL是Spark的一个模块,用于处理结构化数据,支持SQL查询和DataFrame API。它提供了一种高效且易于使用的方法来处理和分析结构化数据。用户可以使用SQL语句或DataFrame API来查询和操作数据。Spark-SQL允许用户直接在Spark应用程序中使用SQL查询,而无需编写复杂的MapReduce代码。 2. Spark-ThriftSpark的一个独立服务,它提供了一个标准的Thrift接口,用于执行SQL查询。它可以作为一个独立的进程运行,并通过网络接收来自客户端的SQL查询请求,并将查询转发到Spark集群中的Spark-SQL模块进行处理。Spark-Thrift使得可以使用不同的编程语言,如Java、Python、R等,通过Thrift接口与Spark集群交互。 因此,Spark-SQL是Spark框架中用于处理结构化数据的模块,而Spark-Thrift是提供Thrift接口让用户可以使用不同编程语言与Spark-SQL模块交互的独立服务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CDH15.0支持spark-sql和spark-thrift-server](https://blog.csdn.net/u012458821/article/details/87635599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [122.Thriftspark-sql客户端部署](https://blog.csdn.net/m0_47454596/article/details/126856172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值