
# 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>。
*sh CLIENT_HOME/spark/bin/beeline -u "jdbc:hive2://<zkNode_IP>:<zkNode_Port>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkthriftserver2x;"*
![](https://support.huaweicloud.com/devg3-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/devg3-mrs/mrs_07_410027.html)。
#### 增强特性
对比开源社区，华为还提供了两个增强特性，JDBCServerHA方案和设置JDBCServer连接的超时时间。
- JDBCServerHA方案，多个JDBCServer主节点同时提供服务，当其中一个节点发生故障时，新的客户端连接会分配到其他主节点上，从而保障无间断为集群提供服务。Beeline和JDBC客户端代码两种连接方式的操作相同。
- 设置客户端与JDBCServer连接的超时时间。
  - Beeline 在网络拥塞的情况下，这个特性可以避免Beeline由于无限等待服务端的返回而挂起。使用方式如下：
    启动Beeline时，在后面追加"--socketTimeOut=n"，其中"n"表示等待服务返回的超时时长，单位为秒，默认为"0"（表示永不超时）。建议根据业务场景，设置为业务所能容忍的最大等待时长。
    
  
  - JDBC客户端代码 在网络拥塞的情况下，这个特性可以避免客户端由于无限等待服务端的返回而挂起。使用方式如下：
    在执行"DriverManager.getConnection"方法获取JDBC连接前，添加"DriverManager.setLoginTimeout(n)"方法来设置超时时长，其中n表示等待服务返回的超时时长，单位为秒，类型为Int，默认为"0"（表示永不超时）。建议根据业务场景，设置为业务所能容忍的最大等待时长。
    
   
 
