Hive之 hive的三种使用方式(CLI、HWI、Thrift)
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; } }
Hive之 hive的三种使用方式(CLI、HWI、Thrift)相关推荐
- 详解:Hive的MetaStore和三种配置方式
一:Metadata概念: 元数据包含用Hive创建的database.table等的元信息.元数据存储在关系型数据库中.如Derby.MySQL等. 二:Metastore作用: 客户端连接meta ...
- Hive metastore三种配置方式
Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适合生产环境.Hive官方wiki详细介绍了这三种方式,链接为:Hive Metastore. 一.本地d ...
- hive安装测试及Hive 元数据的三种存储方式
一 hive安装测试 1.下载解压 tar -xf hive-x.y.z.tar.gz(本次安装为hive-0.8.1.tar.gz) 将解压后的hive-0.8.1文件放在系统的/home/had ...
- java servlet接口开发_servlet三种实现方式之一实现servlet接口
servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第一种示例代码如下(已去掉包名): import ...
- mysql几种安装方法_mysql的三种安装方式(详细)
安装MySQL的方式常见的有三种: rpm包形式 通用二进制形式 源码编译 1,rpm包形式 (1) 操作系统发行商提供的 (2) MySQL官方提供的(版本更新,修复了更多常见BUG)www.mys ...
- MyEclipse网站服务器,MyEclipse中web服务器的三种配置方式
初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通 ...
- python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)
树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...
- FPGA之道(41)HDL的三种描述方式
文章目录 前言 三种描述方式 结构化描述方式 数据流描述方式 行为级描述方式 前言 常编写Verilog代码的就会知道,我们对于某一功能的描述,可以通过门电路来描述,也可以直接描述其功能等,这就牵扯到 ...
- 【 Verilog HDL 】HDL的三种描述方式
当我们使用HDL代码描述硬件功能的时候,主要有三种基本描述方式,即结构化描述方式.数据流描述方式和行为级描述方式.通过本次总结,我们将明白到底我们描述的电路是什么方式描述的. 结构化描述方式 结构化描 ...
- oracle if=,oracle中if/else的三种实现方式详解
1.标准sql规范 1.单个IF IF v=... THEN END IF; 2.IF ... ELSE IF v=... THEN ELSE t....; END IF; 3.多个IF IF v=. ...
最新文章
- 双极性信号、正交信号和PAM信号通信系统仿真
- 阿里云域名注册和虚拟云主机
- 关于如如何运行tensorrt
- c语言源程序由将其转换为目标程序,将C语言编写的源程序转换为目标程序的软件属于______。...
- 如何下载EP的各个版本?
- 为什么年龄大了近视还增加_年龄明明一样大,为什么有人长得年轻,有人显老呢?...
- 边缘检测robert原理_机器视觉尺寸检测基础
- C++ STL list删除和修改
- Mysql 排序null值 排序问题分析
- 17.异常(三)之 e.printStackTrace()介绍
- Xfce4里添加登录后程序自动运行
- ssh框架原理及工作流程
- 六维空间向量表示法公式笔记
- 推荐系统 | (4) 可解释推荐系统---知其然,知其所以然
- Buck电路工作原理
- 解决redisson超时org.redisson.client.RedisResponseTimeoutException: Redis server response timeout
- Windows 32位下cocos2d-x2.2.0Android环境搭建
- 2021年全球高级相变材料(PCM)收入大约1513.7百万美元,预计2028年达到3220.4百万美元
- 【python脚本】linux中编写运行python脚本
- 数据库异常:无效的授权说明 [ 0x80040e4d ]
热门文章
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决(转)...
- Cognos访问权限之让拒绝更友善
- 利用appscan进行自动化定期安全测试
- EOS project 中 的一个 jsp 文件中 调用 javascript函数的问题
- 【Scala】使用Scala语言定义函数和函数使用(比较两个数的大小代码)
- 设计模式之单例模式8种实现方式,其四:懒汉式(线程安全,同步方法)
- 安装mysql需要配置什么软件_软件配置篇-MySQL下载及安装
- CSS 奇技淫巧:动态高度过渡动画
- 前端常用插件、工具类库汇总,新手必收藏!!!
- 这10个实用的Javascript调试技巧,你知道吗?