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类。

Spark-ThriftServer源码分析_第1张图片

通过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,前者为客户端的实现,后者是服务端的实现:

Spark-ThriftServer源码分析_第2张图片

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

Spark-ThriftServer源码分析_第3张图片

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

Spark-ThriftServer源码分析_第4张图片

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

Spark-ThriftServer源码分析_第5张图片

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

Spark-ThriftServer源码分析_第6张图片

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

Spark-ThriftServer源码分析_第7张图片

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

Spark-ThriftServer源码分析_第8张图片

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

你可能感兴趣的:(Spark-ThriftServer源码分析)