文档章节

hive的三种使用方式

 张欢19933
发布于 2017/03/28 21:14
字数 1567
阅读 115
收藏 0

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 文件修改为

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

启动 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提供了更好的支持。

配置

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

先启动元数据库,在命令行中键入: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;  
    }  

}  

 

© 著作权归作者所有

粉丝 47
博文 533
码字总数 244932
作品 0
海淀
私信 提问
设定数据仓库平台Hive的参数

开发Hive应用时,不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率,或帮助定位问题。然而实践 中经常遇到的一个问题是,为什么设定的参数没有起作用? 这通常是错误...

红薯
2010/06/09
1K
0
通过hiveserver远程服务构建hive web查询分析工具

(1)hive 三种启动方式及用途,本文主要关注通过hiveserver(可jdbc连接)的方式启动 1, hive 命令行模式,直接输入/hive/bin/hive的执行程序,或者输入 hive --service cli 用于linux平台...

大数据之路
2012/12/02
5.5K
0
Hive几种参数配置方法(转载)

转自:https://www.iteblog.com/archives/871.html Hive提供三种可以改变环境变量的方法,分别是:(1)、修改${HIVE_HOME}/conf/hive-site.xml配置文件;(2)、命令行参数;(3)、在已经进...

晴天哥
2017/09/04
0
0
深入学习Hive应用场景及架构原理

col1 ARRAY< INT>, col2 MAP< STRING,INT>, col3 STRUCT< a:STRING,b:INT,c:DOUBLE> ) (三)类型转化 Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换,例如某表达式使用......

py_123456
2018/05/12
0
0
hive(05)、使用JAVA对数据仓库HIVE进行操作

本文代码码云地址:https://gitee.com/MaxBill/HSDP 在前文中我们实践了基于hadoop的数据仓库hive的安装、配置、应用、扩展等,那么我们在实际中该如何通过程序调用(用户接口)开发呢,hiv...

MaxBill
2018/01/16
674
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
46分钟前
4
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
3
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
2
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
2
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部