Spark ThriftServer接口介绍
简介
ThriftServer是Hive中的HiveServer2的另外一个实现,它底层使用了Spark SQL来处理SQL语句,从而比Hive拥有更高的性能。
ThriftServer是一个JDBC接口,用户可以通过JDBC连接ThriftServer来访问SparkSQL的数据。ThriftServer在启动的时候,会启动一个SparkSQL的应用程序,而通过JDBC连接进来的客户端共同分享这个sparkSQL应用程序的资源,也就是说不同的用户之间可以共享数据。ThriftServer启动时还会开启一个侦听器,等待JDBC客户端的连接和提交查询。所以,在配置ThriftServer的时候,至少要配置ThriftServer的主机名和端口,如果要使用Hive数据的话,还要提供Hive Metastore的URIs。
ThriftServer默认在安装节点上的10000端口起一个JDBC服务,可以通过Beeline或者JDBC客户端代码来连接它,从而执行SQL命令。
如果您需要了解ThriftServer的其他信息,请参见Spark官网。
Beeline
开源社区提供的Beeline连接方式,请参见:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients。
JDBC客户端代码
通过JDBC客户端代码连接ThriftServer,来访问SparkSQL的数据。
增强特性
对比开源社区,MRS还提供了两个增强特性,ThriftServer HA方案和设置ThriftServer连接的超时时间。
- ThriftServer HA方案,当ThriftServer主节点发生故障时,备节点能够主动切换为主节点,为集群提供服务。Beeline和JDBC客户端代码两种连接方式的操作相同。
连接HA模式下的ThriftServer,连接字符串和非HA模式下的区别在于需要将ip:port替换为ha-cluster,使用到的其他参数见表1。
表1 客户端参数列表 参数名称
含义
默认值
spark.thriftserver.ha.enabled
是否启用HA模式,设置为true表示启用。如果启用了HA,需要在连接字符串中将host:port修改为“ha-cluster”。否则会自动退出HA模式。
false
spark.thriftserver.zookeeper.dir
ThriftServer在ZooKeeper上存储元数据的路径,同服务端的同名参数,且需要和服务端配置一致。在此目录下存储命名为“active_thriftserver”的子目录,用于存储Hive ThriftServer的IP和端口号。
/thriftserver
spark.deploy.zookeeper.url
ZooKeeper的URL路径,同服务端的同名参数,且需要和服务端配置一致。
-
spark.thriftserver.retry.times
尝试连接服务端的最大次数。如果设置为负数或零,客户端将不会重新尝试连接服务端。
5
spark.thriftserver.retry.wait.time
重连服务端时的尝试时间间隔,单位秒。
10
表1中的参数应配置在客户端classpath下的“hive-site.xml”文件中,例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <configuration> <property> <name>spark.thriftserver.ha.enabled</name> <value>true</value> </property> </configuration>
“spark.deploy.zookeeper.url”参数也可以通过在连接字符串中的“zk.quorum”代替,例:
!connect jdbc:hive2://ha-cluster/default;zk.quorum=spark25:2181,spark 26:2181,spark27:2181
- 设置客户端与ThriftServer连接的超时时间。
- Beeline
在网络拥塞的情况下,这个特性可以避免beeline由于无限等待服务端的返回而挂起。使用方式如下:
启动beeline时,在后面追加“--socketTimeOut=n”,其中“n”表示等待服务返回的超时时长,单位为秒,默认为“0”(表示永不超时)。建议根据业务场景,设置为业务所能容忍的最大等待时长。
- JDBC客户端代码
在网络拥塞的情况下,这个特性可以避免客户端由于无限等待服务端的返回而挂起。使用方式如下:
在执行“DriverManager.getConnection”方法获取JDBC连接前,添加“DriverManager.setLoginTimeout(n)”方法来设置超时时长,其中n表示等待服务返回的超时时长,单位为秒,类型为Int,默认为“0”(表示永不超时)。建议根据业务场景,设置为业务所能容忍的最大等待时长。
- Beeline