更新时间:2024-10-31 GMT+08:00

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官网:http://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.<系统域名>@<系统域名>;"

  • 其中“<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样例程序

增强特性

对比开源社区,华为还提供了两个增强特性,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”(表示永不超时)。建议根据业务场景,设置为业务所能容忍的最大等待时长。