大数据环境搭建-Hive环境搭建及与Mysql集成(Hive JDBC操作)

前言

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计。

Hive:提供一个大数据的SQL的接口,不做计算。用来做数据分析。

使用Mysql保存元数据信息:字段、字段类型、分割方式、存储方式。

数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理中的决策制定。

注意

安装Hive前提是要先安装Hadoop集群,并且Hive只需要在Hadoop的Namenode节点集群里安装即可。

虽然修改配置文件并不需要你已经把Hadoop跑起来,但是启动Hive的前提也是需要Hadoop在正常运行,所以建议先将其他基础环境安装好。

版本

名称 版本
Hadoop 2.7.7
MySql 5.7
Hive 2.1.0

Hive的使用场景

从上面的理解介绍可以简单掌握Hive的特点:

优点:

1、使用SQL语法查询,不用再去写复杂的MapReduce程序,减少开发成版本,上手快。

2、基于MapReduce算法,所以在处理大数据时,优势非常明显

3、可以支持自定义函数,计算能力强

缺点:

1、Hive的执行延迟比较高,这是因为启动并运行一个MapReduce程序本身需要消耗非常多的资源

2、Hive的HQL语句表达能力有限,并且他是基于模板实现的,所以通常不够智能化,很多复杂的大数据计算无法支持,比如迭代式计算

3、Hive处理大数据量非常擅长,但是处理小数据量就没有优势了。

针对与优点和缺点总结:

所以,Hive通常适用于大数据的OLAP场景,做一些面向分析,允许有延迟的数据挖掘工作,并且结合其他组件也可以做一些数据清洗之类的简单数据处理工作。

Hive是针对数据仓库来进行设计的,这种场景下,通常是读多写少。并且数据都是来自外部的HDFS,所以Hive中不建议做数据的修改操作,所有的数据最好是在加载的时候就已经确定好了。

安装Mysql

https://www.psvmc.cn/article/2018-06-25-mysql-tips.html

安装

1
2
3
4
5
6
7
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum install wget

wget -i https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum localinstall -y mysql57-community-release-el7-10.noarch.rpm
yum repolist enabled | grep mysql

安装mysql 服务器 命令:

1
yum install -y mysql-community-server --nogpgcheck

启动mysql 命令:

1
service mysqld start

查看mysql是否自启动,并且设置开启自启动 命令:

1
2
chkconfig --list | grep mysqld
chkconfig mysqld on

配置修改

表名/编码/连接数/数据包大小

设置表名不区分大小写/字符编码/连接数

修改 /etc/my.cnf

1
vi /etc/my.cnf

添加以下的5行

1
2
3
4
5
6
[mysqld]
lower_case_table_names=1
character_set_server = utf8
max_connections = 1000
max_allowed_packet = 100M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

重启

1
service mysqld restart

修改密码

默认密码

打开日志文件

1
vi /var/log/mysqld.log

找到密码

1
[Note] A temporary password is generated for root@localhost: tr&:DeYtt8+k

修改密码:

MySQL 5.7推荐使用ALTER USER修改密码

MySQL修改用户的密码主要有:ALTER USER 和UPDATE用户表

ALTER USER

推荐用此方式

1
mysql -uroot -p

连接上以后

1
2
3
4
5
set global validate_password_policy=0;
set global validate_password_length=1;
alter user user() identified by "123456";
flush privileges;
quit

允许远程登录

1
2
3
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit

设置密码永不过期

1
2
ALTER USER 'root'@'%' PASSWORD EXPIRE NEVER;
flush privileges;

Hive安装及配置

下载与安装

https://dlcdn.apache.org/hive/hive-2.1.0/

解压

1
tar -zxvf apache-hive-2.1.0-bin.tar.gz -C /data/tools/bigdata/

环境变量

添加环境变量

1
cd /etc/profile.d/

创建配置文件

1
vi /etc/profile.d/hive.sh

加入:

1
2
export HIVE_HOME=/data/tools/bigdata/apache-hive-2.1.0-bin
export PATH=$HIVE_HOME/bin:$PATH

配置立即生效

1
source /etc/profile

查看ZK_HOME

1
echo $HIVE_HOME

复制Jar

复制Mysql连接的JAR

1
cp mysql-connector-java-8.0.28.jar $HIVE_HOME/lib/

复制jdbc的jar

1
cp $HIVE_HOME/jdbc/hive-jdbc-2.1.0-standalone.jar $HIVE_HOME/lib/

修改配置

进入目录

1
cd $HIVE_HOME/conf

配置重命名

1
2
3
cp hive-default.xml.template hive-site.xml
cp hive-env.sh.template hive-env.sh
cp hive-log4j2.properties.template hive-log4j.properties

创建文件夹

1
2
mkdir -p /data/tools/bigdata/zdata/hive/tmp
mkdir -p /data/tools/bigdata/zdata/hive/logs

hive-site.xml

hive-site.xml中修改下面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.7.102:3306/metastore?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</value>
<description></description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<description></description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description></description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description></description>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description></description>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description></description>
</property>
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
<description></description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description></description>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop01:9083</value>
</property>

<property>
<name>hive.server2.long.polling.timeout</name>
<value>5000ms</value>
<description></description>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop01</value>
<description></description>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
<description></description>
</property>
</configuration>

注意

value中不能换行。

一个大坑,我在部署的时候一直不行,后来发现时javax.jdo.option.ConnectionURL对应的value的值太长,VSCode自动给换行了。

删除换行就可以了,真是奇葩。

hive-log4j.properties

修改hive-log4j.properties配置

1
property.hive.log.dir = /data/tools/bigdata/zdata/hive/logs/

配置分发

1
2
3
4
5
6
7
ssh hadoop02 "rm -rf $HIVE_HOME"
ssh hadoop03 "rm -rf $HIVE_HOME"
ha-fenfa.sh $HIVE_HOME

ha-fenfa.sh /etc/profile.d/hive.sh
ssh hadoop02 "source /etc/profile && echo $HIVE_HOME"
ssh hadoop03 "source /etc/profile && echo $HIVE_HOME"

初始化库

Hive的数据库MySQL在安装的时候没有初始化

在MySQL中

1
2
3
4
# 删除mysql中的元数据库
drop database metastore;
# 新建一个元数据库
create database metastore;

命令行中执行

1
2
# 在命令行中,重新初始化
$HIVE_HOME/bin/schematool -dbType mysql -initSchema

否则会报错

java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.Session

在Hive中无法执行任何命令

开启元数据服务

1
nohup hive --service metastore >/dev/null 2>&1 &

查看Schema信息

1
schematool -dbType mysql -info

可以看到

image-20230104181824079

目录权限

修改HDFS系统中关于Hive的一些目录权限

1
2
3
4
hadoop fs -mkdir -p /user/hive/warehouse

hadoop fs -chmod 777 /tmp/
hadoop fs -chmod 777 /user/hive/warehouse

启动Hive

1
$HIVE_HOME/bin/hive

查询表

1
show tables;

Java中JDBC操作

添加依赖

1
2
3
4
5
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.1.0</version>
</dependency>

Java中创建数据库和表

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package cn.psvmc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class HiveTest {
private static final String driverName = "org.apache.hive.jdbc.HiveDriver";
private static final String url = "jdbc:hive2://192.168.7.101:10000/default";

private static final String user = "root";
private static final String password = "";

private static Statement stmt = null;
private static final ResultSet rs = null;


public static void init() throws Exception {
Class.forName(driverName);
Connection conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
}
// 创建数据库
public static void createDatabase() throws Exception {
String sql = "create database hive_jdbc_test";
System.out.println("Running: " + sql);
stmt.execute(sql);
}

// 创建表
public static void createTable() throws Exception {
String sql = "create table if not exists hive_jdbc_test.tuser(id int,name string)";
System.out.println("Running: " + sql);
stmt.execute(sql);
}

public static void main(String[] args) throws Exception {
init();
//createDatabase();
createTable();
}
}

JDBC读取数据

读取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class HiveTest {
public static void main(String[] args) throws Exception {
Statement stmt;
ResultSet rs;
Class.forName("org.apache.hive.jdbc.HiveDriver");
String url = "jdbc:hive2://192.168.7.101:10000/default";
String uname = "hive";
String pwd = "";
Connection conn = DriverManager.getConnection(url, uname, pwd);
System.out.println(conn.getClass().getName());
//发送sql语句
stmt = conn.createStatement();
//建立ResultSet结果集对象,执行sql语句
String sql = "select * from t_user";
rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("ID");
String name = rs.getString("NAME");
System.out.printf("id:%s name:%s%n", id + "", name);
}
}
}