http://www.cnblogs.com/netbloomy/p/6688670.html

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。

Java通过JDBC操作Hive的更多相关文章

  1. 1、Java通过JDBC操作Hive

    0.概述 使用的都是CLI或者hive –e的方式仅允许使用HiveQL执行查询.更新等操作.然而Hive也提供客户端的实现,通过HiveServer或者HiveServer2,客户端可以在不启动CL ...

  2. Java的JDBC操作

    Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...

  3. Java使用Jdbc操作MySql数据库(一)

    这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...

  4. java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据

    package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...

  5. Java使用JDBC连接Hive

    最近一段时间,处理过一个问题,那就是hive jdbc的连接问题,其实也不是大问题,就是url写的不对,导致无法连接.问题在于HiveServer2增加了别的安全验证,导致正常的情况下,传递的参数无法 ...

  6. java使用JDBC连接hive(使用beeline与hiveserver2)

    首先虚拟机上已经安装好hive. 下面是连接hive需要的操作. 一.配置. 1.查找虚拟机的ip 输入 ifconfig 2.配置文件 (1)配置hadoop目录下的core-site.xml和hd ...

  7. Java之JDBC操作

    下载jar包: mysql-connector-java-5.1.44.jar 导入包: import java.sql.*; 源码如下: /** * 使用JDBC底层实现查询 */ public s ...

  8. Java:JDBC操作

    内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:DriverManager类Connection接口Statement接口ResultSet接口 1.Class.fo ...

  9. Java之JDBC操作数据库

    DBC JDBC就是一套接口,真正执行的是jar包里得实现类,通过泛型对象来执行实现类里的方法. 步骤: ###1.导入驱动jar包到工程中 ###2.编写代码注册驱动,我们要让程序知道用的是哪个驱动 ...

随机推荐

  1. 【BZOJ4513】[Sdoi2016]储能表 数位DP

    [BZOJ4513][Sdoi2016]储能表 Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 ...

  2. 手动爬虫之流程笔记1(python3)

    一.引入拓展库 由于刚刚起步学习爬虫,故从urllib库开始 首先引入urllib,这里主要用到urllib中request类 import urllib.request as ur 二.设置全局参数 ...

  3. centos7.3下使用yum 安装pip

    centos下安装pip时失败: No package pip available.Error: Nothing to do 解决方法: 需要先安装扩展源EPEL. EPEL(http://fedor ...

  4. Too Many Open Files的错误

    百度Elasticsearch-产品描述-介绍-百度云 https://cloud.baidu.com/doc/BES/FAQ.html#Too.20Many.20Open.20Files.E7.9A ...

  5. openssl update--centos 6.5

    cd /usr/local/src #wget http://www.openssl.org/source/openssl-1.0.1h.tar.gz #tar -zxvf openssl-1.0.1 ...

  6. Tensorflow神经网络进行fiting function

    使用Tensorflow中的神经网络来拟合函数(y = x ^ 3 + 0.7) # -*- coding:utf-8 -*-import tensorflow as tf import numpy ...

  7. Codeforces Round#251(Div 2)D Devu and his Brother

    --你以为你以为的.就是你以为的? --有时候还真是 题目链接:http://codeforces.com/contest/439/problem/D 题意大概就是要求第一个数组的最小值要不小于第二个 ...

  8. Webbench进行网站压力测试

    今天突然发现一个新大陆,Webbench,是linux下,用这很方便,开源,不限制并发访问次数和时间....大爱啊! 下载Webbench 使用wget  或者windows下载好导入linux也行, ...

  9. oracle external密码验证

    什么是external密码验证 当OS user 中存在和DB user 同名的用户时   直接使用和DB user 同名的OS user 可以不输入密码直接登录数据库, [oracle@zxrac1 ...

  10. 吴超老师课程---Hadoop的分布式集群安装

    1.hadoop的分布式安装过程 1.1 分布结构 主节点(1个,是hadoop0):NameNode.JobTracker.SecondaryNameNode            从节点(2个,是 ...