Hive从入门到精通(十)Thrift服务

完整目录、平台简介、安装环境及版本:参考《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的主要区别如下:

 hiveserver1hiveserver2
jdbc driver classorg.apache.hive.jdbc.HiveDriverorg.apache.hadoop.hive.jdbc.HiveDriver
jdbc connection urljdbc:hive://:jdbc:hive2://:
支持跨语言
支持并发写
支持表锁是(基于zookeeper的表锁)
默认thrift端口1000010000

10.1 JDBC客户端操作

步骤,类似常用的关系型数据库连接操作方式:

  1. 获取连接,连接到Hive服务端;
  2. 基于连接创建基于HQL的运行环境;
  3. 在运行环境上执行HQL语句;
  4. 处理HSQL返回结果;
  5. 释放资源,如连接资源。

此处环境演示如何用脚本的方式运行

在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信息。

发表回复