博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive之 hive的三种使用方式(CLI、HWI、Thrift)
阅读量:5887 次
发布时间:2019-06-19

本文共 8809 字,大约阅读时间需要 29 分钟。

Hive有三种使用方式——CLI命令行,HWI(hie web interface)浏览器 以及 Thrift客户端连接方式。

1、hive  命令行模式

直接输入/hive/bin/hive的执行程序,或者输入 hive –service cli

       用于linux平台命令行查询,查询语句基本跟MySQL查询语句类似

2、hive  web界面的启动方式

hive –service hwi  用于通过浏览器来访问hive

如果lib目录下没有hive-hwi-{version}.war包,我们要自己打包

官网下载源码包(比如1.10版本)

解压

$ tar zxvf apache-hive-1.1.0.src.tar.gz

再进入 hwi 目录,打包 war 文件(注意命令末尾有一个点.)

#cd apache-hive-1.1.0-src/hwi#jar cvfM0 hive-hwi-1.1.0.war -C web/ .

 打包完成后,有了我们需要的 war 文件,再复制到 $HIVE_HOME/lib 目录下

#cp hive-hwi-1.1.0.war /usr/local/hive-1.1.0/lib

另外我们还需要拷贝一个 Java 的 tools.jar 到 $HIVE_HOME/lib 目录下

cp /usr/local/jdk1.7.0_67/lib/tools.jar /usr/local/hive-1.1.0/lib

否则会出现类似于下面的错误(因为 JAVA_HOME 指到$JAVA_HOME/jre 下了,而其 lib下的 tools.jar 跟$JAVA_HOME/lib/tools.jar 不一样,编译的时候需要用到后者) 

最后,我们将 hive-site.xml 文件修改为

hive.hwi.listen.host
0.0.0.0
监听的地址
hive.hwi.listen.port
9999
监听的端口号
hive.hwi.war.file
lib/hive-hwi-1.1.0.war
war包所在的地址,注意这里不支持绝对路径,坑!

启动 hwi

在 $HIVE_HOME/bin 目录下,启动 hwi(由于我们之前已经修改了 Derby 为 MySQL 数据库,所以在启动 hwi 之前,请确保 MySQL 和 Hadoop 已经成功启动):

nohup bin/hive --service hwi > /dev/null 2> /dev/null &

web访问

我们可以在浏览器中打开网络接口的地址:localhost:9999/hwi, 启动成功

3、jdbc远程连接hiveserver2

在之前的学习和实践Hive中,使用的都是CLI或者hive –e的方式,该方式仅允许使用HiveQL执行查询、更新等操作,并且该方式比较笨拙单一。幸好Hive提供了轻客户端的实现,通过HiveServer或者HiveServer2,客户端可以在不启动CLI的情况下对Hive中的数据进行操作,两者都允许远程客户端使用多种编程语言如Java、Python向Hive提交请求,取回结果。HiveServer或者HiveServer2都是基于Thrift的,但HiveSever有时被称为Thrift

server,而HiveServer2却不会。既然已经存在HiveServer为什么还需要HiveServer2呢?这是因为HiveServer不能处理多于一个客户端的并发请求,这是由于HiveServer使用的Thrift接口所导致的限制,不能通过修改HiveServer的代码修正。因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供了更好的支持。

配置

hive.metastore.warehouse.dir
/usr/hive/warehouse
//(hive中的数据库和表在HDFS中存放的文件夹的位置)
location of default database for the warehouse
hive.server2.thrift.port
10000
//(HiveServer2远程连接的端口,默认为10000)
Port number of HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT
hive.server2.thrift.bind.host
**.**.**.**
//(hive所在集群的IP地址)
Bind host on which to run the HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_BIND_HOST
hive.server2.long.polling.timeout
5000
// (默认为5000L,此处修改为5000,不然程序会报错)
Time in milliseconds that HiveServer2 will wait, before responding to asynchronous calls that use long polling
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
//(Hive的元数据库,我采用的是本地Mysql作为元数据库)
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
//(连接元数据的驱动名)
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
//(连接元数据库用户名)
hive
username to use against metastore database
javax.jdo.option.ConnectionPassword
// (连接元数据库密码)
hive
password to use against metastore database

先启动元数据库,在命令行中键入:hive --service metastore & 

接下来开启hiveserver2服务:

在命令行中键入:hive --service hiveserver2 &
注意查看日志是否报错。

javaapi操作hive实例

package com.berg.hive.test1.api;import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.ResultSet;  import java.sql.SQLException;  import java.sql.Statement;  import org.apache.log4j.Logger;  /**  * Hive的JavaApi  *   * 启动hive的远程服务接口命令行执行:hive --service hiveserver &  *   * @author 汤高  *   */  public class HiveJdbcCli {      //网上写 org.apache.hadoop.hive.jdbc.HiveDriver ,新版本不能这样写    private static String driverName = "org.apache.hive.jdbc.HiveDriver";    //这里是hive2,网上其他人都写hive,在高版本中会报错    private static String url = "jdbc:hive2://master:10000/default";     private static String user = "hive";      private static String password = "hive";      private static String sql = "";      private static ResultSet res;      private static final Logger log = Logger.getLogger(HiveJdbcCli.class);      public static void main(String[] args) {          Connection conn = null;          Statement stmt = null;          try {              conn = getConn();              stmt = conn.createStatement();              // 第一步:存在就先删除              String tableName = dropTable(stmt);              // 第二步:不存在就创建              createTable(stmt, tableName);              // 第三步:查看创建的表              showTables(stmt, tableName);              // 执行describe table操作              describeTables(stmt, tableName);              // 执行load data into table操作              loadData(stmt, tableName);              // 执行 select * query 操作              selectData(stmt, tableName);              // 执行 regular hive query 统计操作              countData(stmt, tableName);          } catch (ClassNotFoundException e) {              e.printStackTrace();              log.error(driverName + " not found!", e);              System.exit(1);          } catch (SQLException e) {              e.printStackTrace();              log.error("Connection error!", e);              System.exit(1);          } finally {              try {                  if (conn != null) {                      conn.close();                      conn = null;                  }                  if (stmt != null) {                      stmt.close();                      stmt = null;                  }              } catch (SQLException e) {                  e.printStackTrace();              }          }      }      private static void countData(Statement stmt, String tableName)              throws SQLException {          sql = "select count(1) from " + tableName;          System.out.println("Running:" + sql);          res = stmt.executeQuery(sql);          System.out.println("执行“regular hive query”运行结果:");          while (res.next()) {              System.out.println("count ------>" + res.getString(1));          }      }      private static void selectData(Statement stmt, String tableName)              throws SQLException {          sql = "select * from " + tableName;          System.out.println("Running:" + sql);          res = stmt.executeQuery(sql);          System.out.println("执行 select * query 运行结果:");          while (res.next()) {              System.out.println(res.getInt(1) + "\t" + res.getString(2));          }      }      private static void loadData(Statement stmt, String tableName)              throws SQLException {          //目录 ,我的是hive安装的机子的虚拟机的home目录下        String filepath = "user.txt";          sql = "load data local inpath '" + filepath + "' into table "                  + tableName;          System.out.println("Running:" + sql);           stmt.execute(sql);      }      private static void describeTables(Statement stmt, String tableName)              throws SQLException {          sql = "describe " + tableName;          System.out.println("Running:" + sql);          res = stmt.executeQuery(sql);          System.out.println("执行 describe table 运行结果:");          while (res.next()) {              System.out.println(res.getString(1) + "\t" + res.getString(2));          }      }      private static void showTables(Statement stmt, String tableName)              throws SQLException {          sql = "show tables '" + tableName + "'";          System.out.println("Running:" + sql);          res = stmt.executeQuery(sql);          System.out.println("执行 show tables 运行结果:");          if (res.next()) {              System.out.println(res.getString(1));          }      }      private static void createTable(Statement stmt, String tableName)              throws SQLException {          sql = "create table "                  + tableName                  + " (key int, value string)  row format delimited fields terminated by '\t'";          stmt.execute(sql);      }      private static String dropTable(Statement stmt) throws SQLException {          // 创建的表名          String tableName = "testHive";          sql = "drop table  " + tableName;          stmt.execute(sql);          return tableName;      }      private static Connection getConn() throws ClassNotFoundException,              SQLException {          Class.forName(driverName);          Connection conn = DriverManager.getConnection(url, user, password);          return conn;      }  }

转载地址:http://fzgix.baihongyu.com/

你可能感兴趣的文章
solr
查看>>
IOS7 viewDidLoad中调用 pushViewController 的问题
查看>>
oracle merge into 用法详解
查看>>
tf.concat&tf.gather&tf.gather_nd&tf.greater&tf.cast&tf.expand_dims&tf.squeeze
查看>>
VBA基础之Excel 工作表(Sheet)的操作(二)
查看>>
js 日期转换 strToDate
查看>>
空间索引格网大小无效
查看>>
C_数据结构_数组的修改和删除
查看>>
软件测试5gkd
查看>>
伪类与伪元素
查看>>
11.static关键字
查看>>
iOS @try
查看>>
数据结构之栈——二进制转十进制
查看>>
关于Objective-C和C++中的继承及其区别
查看>>
$().bind()的返回值
查看>>
16 个常用的yum 命令
查看>>
JDBC基础语句使用
查看>>
Mycat
查看>>
XML-->DTD&Schema Notes
查看>>
JDK中的Timer和TimerTask详解
查看>>