配置环境:
Hadoop 2.8.5
jdk 1.8
Hive 2.3.3
CentOS 7.2
VMware Workstation Pro 12.0
MySQL Ver 14.14 Distrib 5.6.50, for Linux (x86_64)
一、内嵌、本地、远程模式搭建
1、内嵌模式
下载好hive的安装包后,解压
tar -zxvf apache-hive-2.3.3-bin.tar.gz /opt/modules/
并配置环境变量
sudo vi /etc/profile
export HIVE_HOME=/opt/modules/apache-hive-2.3.3-bin
export PATH=$PATH:${HIVE_HOME}/bin
令修改立即生效
source /etc/profile
将{HIVE_HOME}/conf/目录下的hive-env.sh.template 修改为hive-env.sh
并添加hadoop的环境变量
export HADOOP_HOME=/opt/modules/hadoop-2.8.5/
在hdfs中创建数据仓库
start-all.sh
hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
初始化derby数据库
(注意!该命令会在当前目录新建文件夹)
schematool -dbType derby -initSchema
输出日志信息后,会在当前目录新建一个文件夹metastore_db。
进入文件夹后:
$ hive
会进入derby数据库。
2、本地模式
cd /home/hadoop/
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
sudo yum install mysql-server
mysql -u root
sudo chown -R hadoop:hadoop /var/lib/mysql
service mysqld restart
mysql -u root
use mysql;
update user set password=password('123456')where user='root';
exit;
service mysqld restart
mysql -h localhost -uroot -p
配置 hive-site.xml
初始化数据库:
如果初始化数据库报错的话,可能是MySQL数据库有空用户。使用下面的命令解决:
下面就可以使用sql语句操作数据库了。并且支持多用户访问。
3、远程模式
先将本机hive配置文件传输到另一台虚拟机上:
centos02文件hive-site.xml配置修改:
首先在centos01启动环境:
centos02 连接数据库:
centos01创建表,添加数据:
centos02查询数据:
二、Java API
文件配置
1、{HADOOP_HOME}\etc\hadoop\目录下core-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://centos01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/modules/hadoop-2.8.5/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
</configuration>
需要注意的是一些参数每台虚拟机可能是不同的:
2、{HIVE_HOME}\conf\下的hive-site.xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://centos01:3306/hive_db?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>1000000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>localhost</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>
这里也是有几个可能需要修改的参数“:
二、环境启动
启动:
首先需要启动hdfs环境
start-all.sh
然后启动hiveserver2服务
hiveserver2
可以使用beeline测试一下:
出现绿色connected为成功。
三、Java代码实现hive数据库的JDBC
这时候就可以用JDBC操纵hive数据库了。
package hive;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.sql.*;
/**
* JDBC 操作 Hive(注:JDBC 访问 Hive 前需要先启动HiveServer2)
*/
public class HiveJDBC {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
private static String url = "jdbc:hive2://{主机IP}:10000/test";
private static String user = "hive";
private static String password = "hive";
private static Connection conn = null;
private static Statement stmt = null;
private static ResultSet rs = null;
// 加载驱动、创建连接
@Before
public void init() throws Exception {
Class.forName(driverName);
conn = DriverManager.getConnection(url,user,password);
stmt = conn.createStatement();
}
// 创建数据库
@Test
public void createDatabase() throws Exception {
String sql = "create database hive_jdbc_test";
System.out.println("Running: " + sql);
stmt.execute(sql);
}
// 查询所有数据库
@Test
public void showDatabases() throws Exception {
String sql = "show databases";
System.out.println("Running: " + sql);
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(1));
}
}
// 创建表
@Test
public void createTable() throws Exception {
String sql = "create table emp(\n" +
"grade int" +
")\n" +
"row format delimited fields terminated by '\\t'";
System.out.println("Running: " + sql);
stmt.execute(sql);
}
// 查询所有表
@Test
public void showTables() throws Exception {
String sql = "show tables";
System.out.println("Running: " + sql);
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(1));
}
}
// 查看表结构
@Test
public void descTable() throws Exception {
String sql = "desc emp";
System.out.println("Running: " + sql);
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(1) + "\t" + rs.getString(2));
}
}
// 加载数据
@Test
public void loadData() throws Exception {
String filePath = "{PATH}";
String sql = "load data local inpath '" + filePath + "' overwrite into table emp";
System.out.println("Running: " + sql);
stmt.execute(sql);
}
// 查询数据
@Test
public void selectData() throws Exception {
String sql = "select * from emp";
System.out.println("Running: " + sql);
rs = stmt.executeQuery(sql);
//System.out.println("员工编号" + "\t" + "员工姓名" + "\t" + "工作岗位");
while (rs.next()) {
System.out.println(rs.getString("grade"));
}
}
// 统计查询(会运行mapreduce作业)
@Test
public void countData() throws Exception {
String sql = "select count(*) from emp";
System.out.println("Running: " + sql);
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getInt(1) );
}
}
// 删除数据库
@Test
public void dropDatabase() throws Exception {
String sql = "drop database if exists hive_jdbc_test";
System.out.println("Running: " + sql);
stmt.execute(sql);
}
// 删除数据库表
@Test
public void dropTable() throws Exception {
String sql = "drop table if exists emp";
System.out.println("Running: " + sql);
stmt.execute(sql);
}
// 释放资源
@After
public void destory() throws Exception {
if ( rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
public static void main(String[] args) throws Exception {
// HiveJDBC hiveJDBC = new HiveJDBC();
// hiveJDBC.init();
// hiveJDBC.dropDatabase();
// hiveJDBC.createDatabase();
// hiveJDBC.dropTable();
// hiveJDBC.createTable();
// hiveJDBC.loadData();
// hiveJDBC.showDatabases();
// hiveJDBC.showTables();
// hiveJDBC.descTable();
// hiveJDBC.selectData();
// hiveJDBC.destory();
}
}