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端处理的时序图:


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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值