1、Java通过JDBC操作Hive
0、概述
使用的都是CLI或者hive –e的方式仅允许使用HiveQL执行查询、更新等操作。然而Hive也提供客户端的实现,通过HiveServer或者HiveServer2,客户端可以在不启动CLI的情况下对Hive中的数据进行操作,两者都允许远程客户端使用多种编程语言如Java、Python向Hive提交请求,取回结果。
HiveServer与HiveServer2的异同?
HiveServer和HiveServer2都是基于Thrift。既然已经存在HiveServer为什么还需要HiveServer2呢?因为HiveServer不能处理多于一个客户端的并发请求,这是由于HiveServer使用的Thrift接口所导致的限制,不能通过修改HiveServer的代码修正。因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供了更好的支持。
1、启动服务
1)、hive-site.xml的关键配置
<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>
2)、启动元数据库
先启动元数据库,在命令行中键入:hive --service metastore &
3)、启动服务
#hive --service hiveserver2 >/dev/null &
以上命令启动hiveserver2服务。
Hive提供了jdbc驱动,使得我们可以用java代码来连接Hive并进行一些类关系型数据库的sql语句查询等操作。首先,我们必须将Hive的服务,也就是HiveServe打开。如果启动hiveserver就把上面命令改为
#hive --service hiveserver >/dev/null &
2、将所需Jar包放到
$HADOOP_HOME/share/hadoop/common/hadoop-common-2.8.0.jar
$HIVE_HOME/lib/hive-exec-2.1.1.jar
$HIVE_HOME/lib/hive-jdbc-2.1.1.jar
$HIVE_HOME/lib/hive-metastore-2.1.1.jar
$HIVE_HOME/lib/hive-service-2.1.1.jar
$HIVE_HOME/lib/libfb303-0.9.3.jar
$HIVE_HOME/lib/commons-logging-1.2.jar
$HIVE_HOME/lib/slf4j-api-1.6.1.jar
3、java连接程序
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class HiveClientUtils {
private static String driverName ="org.apache.hive.jdbc.HiveDriver";
//填写hive的IP,之前在配置文件中配置的IP
private static String Url="jdbc:hive2://localhos:10000/default";
private static Connection conn;
private static PreparedStatement ps;
private static ResultSet rs;
//创建连接
public static Connection getConnnection(){
try {
Class.forName(driverName);
//此处的用户名一定是有权限操作HDFS的用户,否则程序会提示"permission deny"异常
conn = DriverManager.getConnection(Url,"vagrant","vagrant");
} catch(ClassNotFoundException e) {
e.printStackTrace();
System.exit(1);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static PreparedStatement prepare(Connection conn, String sql) {
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return ps;
}
public static void getAll(String tablename) {
conn=getConnnection();
String sql="select * from "+tablename;
System.out.println(sql);
try {
ps=prepare(conn, sql);
rs=ps.executeQuery();
int columns=rs.getMetaData().getColumnCount();
while(rs.next()) {
for(int i=1;i<=columns;i++) {
System.out.print(rs.getString(i));
System.out.print("\t\t");
}
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String tablename="test1";
getAll(tablename);
}
}
上面代码是针对hiveserver2的。如果是hiveserver。那有两处需要修改,具体修改如下:
org.apache.Hive.jdbc.HiveDriver 改为:org.apache.Hadoop.hive.jdbc.HiveDriver
jdbc:hive2://localhost:10000/default 改为:jdbc:hive://localhost:10000/default
其中'localhost'是主机地址,10000是端口后,default是默认的db。
1、Java通过JDBC操作Hive的更多相关文章
- Java通过JDBC操作Hive
http://www.cnblogs.com/netbloomy/p/6688670.html 0.概述 使用的都是CLI或者hive –e的方式仅允许使用HiveQL执行查询.更新等操作.然而Hiv ...
- Java的JDBC操作
Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...
- Java使用Jdbc操作MySql数据库(一)
这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...
- java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据
package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...
- Java使用JDBC连接Hive
最近一段时间,处理过一个问题,那就是hive jdbc的连接问题,其实也不是大问题,就是url写的不对,导致无法连接.问题在于HiveServer2增加了别的安全验证,导致正常的情况下,传递的参数无法 ...
- java使用JDBC连接hive(使用beeline与hiveserver2)
首先虚拟机上已经安装好hive. 下面是连接hive需要的操作. 一.配置. 1.查找虚拟机的ip 输入 ifconfig 2.配置文件 (1)配置hadoop目录下的core-site.xml和hd ...
- Java之JDBC操作
下载jar包: mysql-connector-java-5.1.44.jar 导入包: import java.sql.*; 源码如下: /** * 使用JDBC底层实现查询 */ public s ...
- Java:JDBC操作
内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:DriverManager类Connection接口Statement接口ResultSet接口 1.Class.fo ...
- Java之JDBC操作数据库
DBC JDBC就是一套接口,真正执行的是jar包里得实现类,通过泛型对象来执行实现类里的方法. 步骤: ###1.导入驱动jar包到工程中 ###2.编写代码注册驱动,我们要让程序知道用的是哪个驱动 ...
随机推荐
- 【Python】测算代码运行时间
整理自这里和这里 timeit模块 timeit模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句 ...
- Linux下安装Nginx教程
什么是Nginx? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,在高连接并发的情况下N ...
- Idea_03_常用快捷键
一.前言 这一节我们来看下Idea的一些常用快捷键 二.常用快捷键 Alt + Enter 有错误.警告时的提示 Ctrl+Shift+R 全局 打开资源 ctrl + F 在当前文件查找或替换 Ct ...
- 从userAgent判断浏览器是什么(chorme ie 火狐)浏览器类型检测、浏览器检测
一.正确的方法: 通过navigator对象的userAgent属性来判断, 主要是判断userAgent 的信息里是否含有以下字段信息: js代码(非完整版) /************ navig ...
- Maven入门-2.Maven一些核心概念介绍
1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...
- CSS: Grid Layout Module
Grid Layout The CSS Grid Layout Module offers a grid-based layout system, with rows and columns, mak ...
- New Concept English there (6)
30w/m The expensive shops in a famous arcade near Piccadilly were just opening. At this time of the ...
- 提高你的javascript代码逼格系列之函数与数组
不知道大家有没有一种感觉,那就是自己写的javascript代码虽然能完全解决工作上的需要,但是,一眼望去,too simple!!!简直就是一个傻子都能看懂的水平,于是,在工作之余,我开始去收集一些 ...
- EasyPusher/EasyDarwin支持H.265 RTSP/RTP直播推流与分发播放
前言描述 随着大屏时代和高清时代的到来,人们已经不再满足于VGA.CIF这种小分辨率了,取而代之的是720P.1080P.4K级的视频传输,虽然我们国家的基础带宽一直在上升,但普遍情况下,传输高清视频 ...
- Vim技能修炼教程(1) - 使用vundle管理插件
世界上有两个伟大的编辑器:一个是emacs,一个是vi.它们从诞生以来,一直在Unix/Linux世界得到最广泛的支持. 尽管过了几十年,在Windows平台上和跨平台上有层出不穷的后起之秀不断挑战它 ...