Spark案例:通过JDBC访问Spark SQL程序
1.1场景说明
适用版本
FusionInsight HD V100R002C70、FusionInsight HD V100R002C80。
场景说明
用户自定义JDBCServer的客户端,使用JDBC连接来进行表的创建、数据加载、查询和删除。
数据规划
步骤 1确保以多主实例模式启动了JDBCServer服务,并至少有一个实例对外服务。在每个可用的JDBCServer节点上分别创建“/home/data”文件,内容如下:
M***da,32
Karlie,23
Candice,27
步骤 2确保其对启动JDBCServer的用户有读写权限。
步骤 3确保客户端classpath下有“hive-site.xml”文件,且根据实际集群情况配置所需要的参数。JDBCServer相关参数详情,请参见JDBCServer接口介绍。
----结束
1.2开发思路
1.在default数据库下创建child表。
2.把“/home/data”的数据加载进child表中。
3.查询child表中的数据。
4.删除child表。
1.3样例代码说明
1.3.1JAVA代码样例
功能简介
使用自定义客户端的JDBC接口提交数据分析任务,并返回结果。
样例代码
步骤 1定义SQL语句。SQL语句必须为单条语句,注意其中不能包含“;”。示例:
ArrayList sqlList = new
ArrayList();
sqlList.add("CREATE TABLE CHILD (NAME STRING, AGE INT) ROW FORMAT
DELIMITED FIELDS TERMINATED BY ','");
sqlList.add("LOAD DATA LOCAL INPATH '/home/data' INTO TABLE CHILD");
sqlList.add("SELECT * FROM child");
sqlList.add("DROP TABLE child");
executeSql(url, sqlList);
样例工程中的data文件需要放到JDBCServer所在机器的home目录下。
步骤 2拼接JDBC URL。
String securityConfig =
";saslQop=auth-conf;auth=KERBEROS;principal=spark/hadoop.hadoop.com@HADOOP.COM"
+ ";";
Configuration config = new Configuration();
config.addResource(new Path(args[0]));
String zkUrl = config.get("spark.deploy.zookeeper.url");
String zkNamespace = null;
zkNamespace =
fileInfo.getProperty("spark.thriftserver.zookeeper.namespace");
if (zkNamespace != null) {
//从配置项中删除冗余字符
zkNamespace = zkNamespace.substring(1);
}
StringBuilder sb = new StringBuilder("jdbc:hive2://"
+ zkUrl
+
";serviceDiscoveryMode=zooKeeper;zooKeeperNamespace="
+ zkNamespace
+ securityConfig);
String url = sb.toString();
由于KERBEROS认证成功后,默认有效期为1天,超过有效期后,如果客户端需要和JDBCServer新建连接则需要重新认证,否则就会执行失败。因此,若长期执行应用过程中需要新建连接,用户需要在“url”中添加user.principal和user.keytab认证信息,以保证每次建立连接时认证成功,例如,“url”中需要加上“user.principal=sparkuser;user.keytab=/opt/client/user.keytab”。
步骤 3加载Hive JDBC驱动。
Class.forName("org.apache.hive.jdbc.HiveDriver").newInstance();
步骤 4获取JDBC连接,执行HQL,输出查询的列名和结果到控制台,关闭JDBC连接。
连接字符串中的“zk.quorum”也可以使用配置文件中的配置项“spark.deploy.zookeeper.url”来代替。
在网络拥塞的情况下,您还可以设置客户端与JDBCServer连接的超时时间,可以避免客户端由于无限等待服务端的返回而挂起。使用方式如下:
在执行“DriverManager.getConnection”方法获取JDBC连接前,添加“DriverManager.setLoginTimeout(n)”方法来设置超时时长,其中n表示等待服务返回的超时时长,单位为秒,类型为Int,默认为“0”(表示永不超时)。
static void executeSql(String url,
ArrayList sqls) throws ClassNotFoundException, SQLException {
try {
Class.forName("org.apache.hive.jdbc.HiveDriver").newInstance();
} catch (Exception e) {
e.printStackTrace();
}
Connection connection = null;
PreparedStatement statement = null;
try {
connection =
DriverManager.getConnection(url);
for (int i
=0 ; i < sqls.size(); i++) {
String sql = sqls.get(i);
System.out.println("---- Begin executing sql: " + sql + "
----");
statement
= connection.prepareStatement(sql);
ResultSet result &