
# Spark JDBCServer接口介绍
#### 简介
JDBCServer是Hive中的HiveServer2的另外一个实现，它底层使用了Spark SQL来处理SQL语句，从而比Hive拥有更高的性能。
JDBCServer是一个JDBC接口，用户可以通过JDBC连接JDBCServer来访问SparkSQL的数据。JDBCServer在启动的时候，会启动一个sparkSQL的应用程序，而通过JDBC连接进来的客户端共同分享这个sparkSQL应用程序的资源，也就是说不同的用户之间可以共享数据。JDBCServer启动时还会开启一个侦听器，等待JDBC客户端的连接和提交查询。所以，在配置JDBCServer的时候，至少要配置JDBCServer的主机名和端口，如果要使用hive数据的话，还要提供hive metastore的uris。
JDBCServer默认在安装节点上的22550端口起一个JDBC服务（通过参数hive.server2.thrift.port配置），可以通过Beeline或者JDBC客户端代码来连接它，从而执行SQL命令。
如果您需要了解JDBCServer的其他信息，请参见Spark官网：<https://archive.apache.org/dist/spark/docs/3.3.1/sql-programming-guide.html#distributed-sql-engine>。
#### Beeline
开源社区提供的Beeline连接方式，请参见：<https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients>。
为了解决Beeline两种场景下连接问题，增加了在Beeline连接中添加认证信息。在JDBC的URL中增添了user.keytab和user.principal这两个参数。当票据过期时，会自动读入客户端的登录信息，就可以重新获得连接。
用户不希望通过kinit命令进行票据认证，因为票据信息每隔24小时会过期。其中Keytab文件及principal信息请联系管理员获取，Beeline的连接样例如下所示：
**sh CLIENT_HOME/spark/bin/beeline -u "jdbc:hive2://\<zkNode1_IP\>:\<zkNode1_Port\>,\<zkNode2_IP\>:\<zkNode2_Port\>,\<zkNode3_IP\>:\<zkNode3_Port\>;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;user.principal=spark2x/hadoop.** *\<系统域名\>* **@** *\<系统域名\>* **;saslQop=auth-conf;auth=KERBEROS;principal=spark2x/hadoop.** *\<系统域名\>* **@** *\<系统域名\>* **;"**
![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
- 其中"\<zkNode1_IP\>:\<zkNode1_Port\>,\<zkNode2_IP\>:\<zkNode2_Port\>,\<zkNode3_IP\>:\<zkNode3_Port\>"是Zookeeper的URL，多个URL以逗号隔开。例如"192.168.81.37:2181,192.168.195.232:2181,192.168.169.84:2181"。
- 其中"sparkthriftserver2x"是Zookeeper上的目录，表示客户端从该目录下随机选择JDBCServer实例进行连接。
 
#### JDBC客户端代码
通过JDBC客户端代码连接JDBCServer，来访问SparkSQL的数据。详细指导请参见[通过JDBC访问Spark SQL样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_200029.html)。
#### 增强特性
对比开源社区，华为还提供了两个增强特性，JDBCServerHA方案和设置JDBCServer连接的超时时间。
- JDBCServer的HA方案，多个JDBCServer主节点同时提供服务，当其中一个节点发生故障时，新的客户端连接会分配到其他主节点上，从而保障无间断为集群提供服务。Beeline和JDBC客户端代码两种连接方式的操作相同。
- 设置客户端与JDBCServer连接的超时时间。
  - Beeline 在网络拥塞的情况下，这个特性可以避免beeline由于无限等待服务端的返回而挂起。使用方式如下：
    启动beeline时，在后面追加"--socketTimeOut=n"，其中"n"表示等待服务返回的超时时长，单位为秒，默认为"0"（表示永不超时）。建议根据业务场景，设置为业务所能容忍的最大等待时长。
    
  
  - JDBC客户端代码 在网络拥塞的情况下，这个特性可以避免客户端由于无限等待服务端的返回而挂起。使用方式如下：
    在执行"DriverManager.getConnection"方法获取JDBC连接前，添加"DriverManager.setLoginTimeout(n)"方法来设置超时时长，其中n表示等待服务返回的超时时长，单位为秒，类型为Int，默认为"0"（表示永不超时）。建议根据业务场景，设置为业务所能容忍的最大等待时长。
    
   
 
