完整目录、平台简介、安装环境及版本:参考《Hive从入门到精通-概览》
十、Thrift服务
用JDBC或者ODBC程序登录到hive中操作数据时,必须选用远程服务启动方式,比如Spark操作Hvie时,命令为:./hive –service hiveserver2。
集群在启动时,已经启动了远程服务,无需重新启动。
需要启动Hive的远程服务:hive –service hiveserver2,这个在集群启动过程中,已经启动了。
启动成功后,就可以通过客户端的方式进行访问了,常用的有两种,一种是JDBC程序,一种是通过Thrift方式。
hive对外提供thrift和jdbc两种接口方式。其中jdbc是基于thrift接口封装,jdbc支持每个方法都是同步操作,但是hiveserver2 thrift接口支持异步操作,jdbc同步只是因为在现实上加了同步锁。
hiveserver1和hiveserver2的主要区别如下:
hiveserver1 | hiveserver2 | |
jdbc driver class | org.apache.hive.jdbc.HiveDriver | org.apache.hadoop.hive.jdbc.HiveDriver |
jdbc connection url | jdbc:hive://: | jdbc:hive2://: |
支持跨语言 | 是 | 是 |
支持并发写 | 否 | 是 |
支持表锁 | 否 | 是(基于zookeeper的表锁) |
默认thrift端口 | 10000 | 10000 |
10.1 JDBC客户端操作
步骤,类似常用的关系型数据库连接操作方式:
- 获取连接,连接到Hive服务端;
- 基于连接创建基于HQL的运行环境;
- 在运行环境上执行HQL语句;
- 处理HSQL返回结果;
- 释放资源,如连接资源。
此处环境演示如何用脚本的方式运行
在app-12节点/home/hadoop目录下创建jdbc;
命令:mkdir /home/hadoop/jdbc
在jdbc目录下创建三个文件夹:src/、classes/、lib/。其中src保存云代码,classes保存编译后的.class文件,lib存放依赖jar包
命令:mkdir src
命令:mkdir classes
命令:mkdir lib
将以下依赖包放到目录lib中:
注:这些依赖的jar包集群环境中都有,可以通过命令find / -name 进行查看,然后用cp命令拷贝到/home/Hadoop/jdbc/lib目录中即可
在src目录下新建源文件代码JDBCDemo.java,通过thrift接口查询数据库data_query下的表stu_course信息。
package com.demo.hadoop;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo{
public static void main(String args[])throws Exception{
Class.forName("org.apache.hive.jdbc.HiveDriver");
String querySQL = "select * from stu_course";
Connection con = DriverManager.getConnection("jdbc:hive2://192.168.56.103:10000/data_query");
Statement stmt = con.createStatement();
ResultSet res = stmt.executeQuery(querySQL);
while(res.next()){
System.out.println("Result: " + res.getString(1) + " " +res.getString(2) + " " +res.getString(3) + " " +res.getString(4));
}
}
}
驱动程序如果使hive而不是hive2的话,则用”org.apache.hadoop.hive.jdbc.HiveDriver”)
Class.forName("org.apache.hive.jdbc.HiveDriver");
为JDBC的URL地址,地址为192.168.56.103,默认端口为10000,数据库为data_query,由于此处用JDBC连接HIVE2,所以用jdbc:hive2
"jdbc:hive2://192.168.56.103:10000/data_query";
获取连接
DriverManager.getConnection("jdbc:hive2://192.168.56.103:10000/data_query ");
创建运行环境
Statement stmt = con.createStatement();
运行HQL语句,并返回结果集。
ResultSet res = stmt.executeQuery(querySQL);
保存代码文件:
编译JDBCDemo.java文件到/classes目录
命令:javac -d ./classes/ ./src/*.java
可以看出JDBCDemo.class文件保存到了./classes/com/demo/hadoop/目录中
打包成jar文件,放在/home/Hadoop/jdbc目录下
命令:jar cvf JDBCDemo.jar -C ./classes/ .
可以看出,新生成的jar包Demo.jar位于/home/Hadoop/jdbc目录下。
在/home/hadoop/jdbc目录下创建脚本:vi run.sh
#!/bin/bash
HADOOP_HOME=/hadoop/Hadoop/hadoop-3.1.2
HIVE_HOME=/hadoop/Hive/apache-hive-3.1.1-bin
CLASSPATH=$CLASSPATH:
for i in /home/hadoop/jdbc/lib/*.jar;do
CLASSPATH=$CLASSPATH:$i
done
echo $CLASSPATH
java -cp $CLASSPATH:/home/hadoop/jdbc/JDBCDemo.jar com.demo.hadoop.JDBCDemo
赋予run.sh可执行权限:chmod 755 run.sh
执行:source run.sh
故障1:HDFS的/tmp目录没有操作权限
查看HDFS的/tmp目录权限
修改HDFS的/tmp目录权限:hdfs dfs -chmod 777 /tmp
再次执行:source run.sh
成功的输出了data_query数据库下的表stu_course信息。