
# 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"（表示永不超时）。建议根据业务场景，设置为业务所能容忍的最大等待时长。
    
   
 
