一、安装模式介绍:
Hive官网上介绍了Hive的3种安装方式,分别对应不同的应用场景。
1、内嵌模式(元数据保村在内嵌的derby种,允许一个会话链接,尝试多个会话链接时会报错)
2、本地模式(本地安装mysql 替代derby存储元数据)
3、远程模式(远程安装mysql /替代derby存储元数据)
二、安装环境以及前提说明:
首先,Hive是依赖于hadoop系统的,因此在运行Hive之前需要保证已经搭建好hadoop集群环境。
本文中使用的hadoop版本为2.6 Hive版本为1.2.1版。(centos 7 64位,JDK 1.8)
下载Hive的安装包,且安装到了/usr/local/hive-1.2.1
在/etc/profile中设定HIVE_HOME环境变量:
export HIVE_HOME=/usr/local/hive-1.2.1
export HIVE_CONF_DIR=$HIVE_HOME/conf
export PATH= $HIVE_HOME/bin
三、内嵌模式安装:
这种安装模式的元数据是内嵌在Derby数据库中的,只能允许一个会话连接,数据会存放到HDFS上。
1、切换到HIVE_HOME/conf目录下,执行下面的命令:
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
在hive-env.sh中添加以下内容:
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/usr/local/hadoop
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/usr/local/hive-1.2.1/conf
# Foder containing extra ibraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=/usr/local/hive-1.2.1/lib
2、启动hive,由于已经将HIVE_HOME加入到了环境变量中,所以这里直接在命令行敲hive即可:
注明:如果启动不了,请提前手动启动元数据服务 hive --service metastore -hiveconf hive.root.logger=DEBUG,console
然后在启动hive
有时不启动元数据库,会遇到以下错误
Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:295)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:679)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:623)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
参考http://www.aboutyun.com/thread-7881-1-1.html
2、首先说一些遇到的各种问题
遇到的问题
问题1:元数据库未启动
这里首先概括一下,会遇到的问题。首先需要启动元数据库,通过下面命令:
(1)hive --service metastore
(2)hive --service metastore -hiveconf hive.root.logger=DEBUG,console
注释:
-hiveconf hive.root.logger=DEBUG,console命令的含义是进入debug模式,便于寻找错误
注意,只要上面2步即可完成内嵌模式的安装和启动,
四、本地模式安装:
这种安装方式和嵌入式的区别在于,不再使用内嵌的Derby作为元数据的存储介质,而是使用其他数据库比如MySQL来存储元数据。
这种方式是一个多用户的模式,运行多个用户client连接到一个数据库中。这种方式一般作为公司内部同时使用Hive。
这里有一个前提,每一个用户必须要有对MySQL的访问权利,即每一个客户端使用者需要知道MySQL的用户名和密码才行。
下面开始正式搭建,这里要求hadoop系统已经正常启动,且MySQL数据库已经正确安装。
1、首先必须卸载系统自带数据mariadb再安装mysql
[root@worker2 mysql]# rpm -qa | grep mariadb
[root@worker2 mysql]# rpm -e mariadb-libs-5.5.44-2.el7.centos.x86_64 --nodep
1.1首先介绍mysql安装方式
(1)建议下载离线安装包直接安装配置 (mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz)
(2)创建mysql的用户组/用户, data目录及其用户目录
# groupadd mysql
# useradd -g mysql -d /home/mysql mysql
# mkdir /home/mysql/data
拷贝到mysql的安装目录/usr/local/mysql
tar -xzvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
cd mysql-5.7.18-linux-glibc2.5-x86_64/
mv * /usr/local/mysql
cd /usr/local/mysql/
执行这个命令
./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql/data –initialize
牢记上面的随机密码, 如上dUjoGB&Bk8_J 下面我们修改密码时需要用到。
./support-files/mysql.server start
注:此处之所以出错的原因我们上面的默认安装目录为 /usr/local/mysql/mysql-5.7.18-linux-glibc2.5-x86_64/
而我们稍后用了mv * /usr/local/mysql/ 把所有的文件移动到上一层目录里面了
此时我们需要修改/support-files/mysql.server文件的basedir和datadir目录路径为我们环境所在的mysql的basedir和datadir路径, 如下:
basedir=/usr/local/mysql
datadir=/home/mysql/data
修改完之后重新启动 ./support-files/mysql.server start
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
去系统里面查看是否创建成功
注:安装离线包方式在mysql目录 support-files里面 没有my-default.cnf或者my.cnf,如果改系统自带的/etc/my.cnf 文件 反而会出错,所以此处可以忽略my.cnf,下面可以正常启动
拷贝启动文件到/etc/init.d/下并重命令为mysqld
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
上面手误在最后面写的mysql不是mysqld,下面重新命名
增加执行权限
chmod 755 /etc/init.d/mysqld
检查自启动项列表中没有mysqld这个,如果没有就添加mysqld:
chkconfig --list mysqld
chkconfig -- add mysqld
设置MySQL在345等级自动启动
chkconfig --level 345 mysqld on
或用这个命令设置开机启动:
chkconfig mysqld on
启动mysql服务
./support-files/mysql.server start 或者 service mysqld start
重启mysql服务
./support-files/mysql.server restart 或者 service mysqld restart
停止mysql服务
./support-files/mysql.server restart 或者 service mysqld stop
查看mysql启动状态
./support-files/mysql.server start 或者 service mysqld status
(9)改root用户mysql登录密码为abcd1234
mysql -u root -p
SET PASSWORD = PASSWORD('abcd1234');
休息完密码 执行命令
flush privileges;
mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问,还有一种方法,就是重新启动mysql服务器,来使新设置生效。
grant all on *.* to 'root'@'%' identified by 'abcd1234';
到此,完成了离线安装mysql
1.2在线安装mysql(不建议,时间太长)
在worker3节点中安装
下载mysql源安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
安装mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm
检查mysql源是否安装成功
yum repolist enabled | grep "mysql.*-community.*"
看到上图所示表示安装成功
安装MySQL
yum install mysql-community-server
注:此处网络下载特别耗时
启动MySql服务
开机启动mysql
systemctl enable mysqld
systemctl daemon-reload
修改root默认密码
mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码,然后登录mysql进行修改:
grep 'temporary password' /var/log/mysqld.log
mysql -u root –p 登录修改root密码,需满足密码复杂度(worker3,mysql root用户密码伟Abcd1234!)
set password for 'root'@'localhost'=password('Abcd1234!');
注意:mysql5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements错误,如上图所示:
通过msyql环境变量可以查看密码策略的相关信息:
validate_password_policy:密码策略,默认为MEDIUM策略 validate_password_dictionary_file:密码策略文件,策略为STRONG才需要 validate_password_length:密码最少长度 validate_password_mixed_case_count:大小写字符长度,至少1个 validate_password_number_count :数字至少1个 validate_password_special_char_count:特殊字符至少1个 上述参数是默认策略MEDIUM的密码检查规则。
共有以下几种密码策略:
策略 | 检查规则 |
0 or LOW | Length |
1 or MEDIUM | Length; numeric, lowercase/uppercase, and special characters |
2 or STRONG | Length; numeric, lowercase/uppercase, and special characters; dictionary file |
1.3修改密码策略
在/etc/my.cnf文件添加validate_password_policy配置,指定密码策略
# 选择0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件
validate_password_policy=0
如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:
validate_password = off
重新启动mysql服务使配置生效:
systemctl restart mysqld
注:我在配置文件里面/etc/my.cnf 里面把密码策略禁用,我要保持所有环境mysql root用户密码一样方便记 (worker3,在线安装mysql)
set password for 'root'@'localhost'=password('abcd1234');
1.4添加远程登录用户
默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接,或者添加一个允许远程连接的帐户
grant all on *.* to 'root'@'%' identified by 'abcd1234' with grant option;
1.5配置默认编码为utf8
修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置,如下所示:
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
重新启动mysql服务,查看数据库默认编码如下所示:
systemctl restart mysqld
systemctl status mysqld
默认配置文件路径: 配置文件:/etc/my.cnf 日志文件:/var/log//var/log/mysqld.log 服务启动脚本:/usr/lib/systemd/system/mysqld.service socket文件:/var/run/mysqld/mysqld.pid
在线安装mysql 配置完毕
------
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
hadoop fs -chmod -R 777 /tmp
------
2、Hive本地模式安装创建mysql数据库信息
(1) 首先登录MySQL,创建一个数据库,这里命名为hive,数据库名是可以随意定义的。
create database hive;
创建hive用户,并赋予所有的权限:
CREATE USER 'hive'@'localhost' IDENTIFIED BY 'abcd1234';
GRANT ALL PRIVILEGES ON *.* TO hive IDENTIFIED BY 'abcd1234' WITH GRANT OPTION;
(2) 将MySQL的JDBC驱动包拷贝到hive的安装目录中,驱动包自行查找下载。(下载之后解压)
驱动下载地址https://dev.mysql.com/downloads/connector/j/
mysql-connector-java-5.1.32-bin.jar
(3) 将HIVE_HOME/conf下的hive-default.xml.template拷贝一份:
cp hive-default.xml.template hive-site.xml
3、修改hive-site.xml文件:
该配置文件有3300多行,选择其中的几个选项进行修改即可。
在hive目录下创建iotmp文件夹
(1)修改javax.jdo.option.ConnectionURL属性(把derby配置改为mysql配置)。
注:不要直接复制,我的hostname是worker4,mysql端口3306,直接复制粘贴到你那边会报错
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://worker4:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
(2)修改javax.jdo.option.ConnectionDriverName属性(修改驱动属性)。
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
(3)修改javax.jdo.option.ConnectionUserName属性。即数据库用户名(我们创建的是hive用户名)。
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>Username to use against metastore database</description>
</property>
(4)修改javax.jdo.option.ConnectionPassword属性。即数据库密码。(我们创建的密码为abcd1234)
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>abcd1234</value>
<description>password to use against metastore database</description>
</property>
(5)修改hive.server2.logging.operation.log.location属性,因为默认的配置里没有指定具体的路径。
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive-1.2.1/iotmp/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
(6)修改hive.exec.local.scratchdir属性。
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Local scratch space for Hive jobs</description>
</property>
(7)修改hive.downloaded.resources.dir属性。3
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
(8)修改属性hive.querylog.location属性。
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Location of Hive run time structured log file</description>
</property>
.
4、配置hive/conf的log4j配置文件
cp hive-log4j.properties.template hive-log4j.properties
5.将hive下的jline-2.12.jar替换掉hadoop自带的包,不然会报错。
先把hadoop里面jline备份以下
mv /usr/local/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar /usr/local/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar.backup
然后把hive里面替换掉hadoop自带的包
cp /usr/local/hive-1.2.1/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib/
7、启动hive,界面如下:
在worker4中 可以看到hive databases
在hive数据库中 有一些hive插入的元数据(登陆远程数据mysql查看保存的元数据)
五. 远程模式安装
这种存储方式需要在远端服务器运行一个MySQL服务器,并且需要在Hive服务器启动meta服务。这里用mysql的测试服务器, ip(worker3 192.168.64.131)
1、 服务端和客户端都放在同一台服务器上
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://worker3:3306/hive?createDatabaseIfNotExist=true</value>
<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>abcd1234</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive-1.2.1/iotmp/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Location of Hive run time structured log file</description>
</property>
注:这里把hive的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,将hive-site.xml配置文件拆为如下两部分
Hive 服务端和客户端放在不同服务器上
2、 服务端配置文件
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://worker3:3306/hive?createDatabaseIfNotExist=true</value>
<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>abcd1234</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive-1.2.1/iotmp/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive-1.2.1/iotmp</value>
<description>Location of Hive run time structured log file</description>
</property>
3、 客户端配置文件
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://worker4:9083</value>
</property>
hive --service metastore
总结
内嵌模式 本地模式和远程模式的区别
1. 内嵌模式,特点是:hive服务和metastore服务运行在同一个进程中,derby服务也运行在该进程中。该模式无需特殊配置,
2. 本地模式,特点是:hive服务和metastore服务运行在同一个进程中,mysql是单独的进程,可以在同一台机器上,也可以在远程机器上。该模式只需将hive-site.xml中的ConnectionURL指向mysql,并配置好驱动名、数据库连接账号即可:
3. 远程模式,特点是:hive服务和metastore在不同的进程内,可能是不同的机器。该模式需要将hive.metastore.local设置为false,并将hive.metastore.uris设置为metastore服务器URI,如有多个metastore服务器,URI之间用逗号分隔。metastore服务器URI的格式为thrift://hostort
<property>
<name>hive.metastore.uris</name>
<value>thrift://worker4:9083</value>
</property>
把这些理解后,大家就会明白,其实仅连接远程的mysql并不能称之为“远程模式”,是否远程指的是metastore和hive服务是否在同一进程内,换句话说,“远”指的是metastore和hive服务离得“远”
Hive 1.2.1 UI(HWI)配置
Hive Web Interface(HWI)简介:Hive自带了一个Web-GUI配置
编辑文件conf/hive-site.xml,添加hive.hwi.war.file的配置:(需要把配置文件原有的下列熟悉去掉,再添加,不然内容重复了,启动会报错)
<property>
<name>hive.hwi.listen.host</name>
<value>0.0.0.0</value>
<description>This is the host address the Hive Web Interface will listen on</description>
</property>
<property>
<name>hive.hwi.listen.port</name>
<value>9999</value>
<description>This is the port the Hive Web Interface will listen on</description>
</property>
<property>
<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-1.2.1.war</value>
<description>This sets the path to the HWI war file, relative to ${HIVE_HOME}. </description>
</property>
没有UI war包的,需要自己下载对应版本的源码进行打包,后拷到lib下。
下载源码
apache-hive-1.2.1-src.tar.gz
将源码解压:
tar -vxzf apache-hive-1.2.1-src.tar.gz
进入解压后的目录,再进入hwi目录下:
cd apache-hive-1.2.1-src
cd hwi/web
zip hive-hwi-1.2.1.zip ./*
再更改后缀名为war,复制到HIVE_HOME/lib/
mv hive-hwi-1.2.1.zip hive-hwi-1.2.1.war
mv hive-hwi-1.2.1.war $HIVE_HOME/lib
拷贝tools包
cp */java/jdk1.7.0_51/lib/tools.jar /usr/local/hive-1.2.1/lib
如果不进行此步骤,将无法启动界面。报错解决
同事服务端报错信息
若有如下报错,需将(JDK目录下tools.jar)jre下的tools.jar包拷到Hive的lib目录下,重启hwi服务:
启动
$ sh bin/hive --service hwi
配置成功
http://192.168.64.130:9999/hwi/
参考:http://blog.csdn.net/ckfflyingdream/article/details/50515837
hiveserver2
HiveServer2提供了JDBC链接操作Hive的功能,非常实用,但如果在使用HiveServer2时候,不注意安全控制,将非常危险,因为任何人都可以作为超级用户来操作Hive及HDFS数据。比如:在配置HiveServer2的时候,hive.server2.authentication=NONE,表示没有用户认证。
在之前的学习和实践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提供了更好的支持。
既然HiveServer2提供了更强大的功能,将会对其进行着重学习,但也会简单了解一下HiveServer的使用方法。在命令中输入hive --service help,结果如下。从结果可以了解到,可以使用hive <parameters> --service serviceName <serviceparameters>启动特定的服务,如cli、hiverserver、hiveserver2等。
Hive服务端启动hiveserver2
[root@worker4 ~]# hive --service hiveserver2
别的节点机器可以通过beeline连接
[root@worker2 ~]# beeline
Beeline version 1.6.0 by Apache Hive
beeline> !connect jdbc:hive2://worker4:10000 hive abcd1234
Connecting to jdbc:hive2://worker4:10000
17/06/27 15:02:27 INFO jdbc.Utils: Supplied authorities: worker4:10000
17/06/27 15:02:27 INFO jdbc.Utils: Resolved authority: worker4:10000
17/06/27 15:02:28 INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://worker4:10000
Connected to: Apache Hive (version 1.2.1)
Driver: Spark Project Core (version 1.6.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://worker4:10000> show tables;
JDBC
一般连接Hive的方式有CLI(登录到服务器或者本地切换到hive环境),Client(SQUIREEL SQL客户端),Web UI(hive --service hwi )等 , Java 操作JDBC同普通JDBC数据库一样,首先需要启动Hive 服务打开hive --service hiveserver2
依赖的jar:
hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar
$HIVE_HOME/lib/hive-exec-0.11.0.jar
$HIVE_HOME/lib/hive-jdbc-0.11.0.jar
$HIVE_HOME/lib/hive-metastore-0.11.0.jar
$HIVE_HOME/lib/hive-service-0.11.0.jar
$HIVE_HOME/lib/libfb303-0.9.0.jar
$HIVE_HOME/lib/commons-logging-1.0.4.jar
$HIVE_HOME/lib/slf4j-api-1.6.1.jar
但是建议全部导入
点击项目project 右键properties
然后把hive 二进制包中的jar全部加进来
代码如下
可以参考官网 JDBC 源码
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC
package com.hive;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveJdbcClient {
// private static String driverName = "org.apache.hive.jdbc.HiveDriver";
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
boolean f = true;
Connection con = DriverManager.getConnection("jdbc:hive2://192.168.64.130:10000/default", "hive", "abcd1234");
Statement stmt = con.createStatement();
// select * query
String tablename = "car1";
String sql = "select * from " + tablename + " limit 15";
ResultSet resultSet = stmt.executeQuery(sql);
System.out.println("Running " + sql);
while (resultSet.next()) {
System.out.println(String.valueOf(resultSet.getString(1))+"\t"+resultSet.getString(2)+"\t"+resultSet.getString(3)+"\t"+resultSet.getString(4));
}
//show tables;
sql = "show tables '" + tablename +"'";
System.out.println("Running: " + sql);
resultSet=stmt.executeQuery(sql);
if (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
//desc tables;
sql = "describe " + tablename;
System.out.println("Running: " + sql);
resultSet=stmt.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + "\t" + "\t" + resultSet.getString(2)+ "\t" + "\t" + resultSet.getString(3));
}
// regular hive query
sql = "select count(1) from " + tablename;
System.out.println("Running: " + sql);
resultSet=stmt.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//replace "hive" here with the name of the user the queries should run as
}
}
运行的结果