大数据之—Hive数仓搭建
前言
Hive是hadoop的一种客户端工具
文档地址:https://cwiki.apache.org/confluence/display/Hive/GettingStarted
GitHub地址:https://github.com/apache/hive
软件仓库:http://archive.apache.org/dist/hive/
软件版本:http://archive.apache.org/dist/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
一、准备
JDBC(阿里云盘有):mysql-connector-java-5.1.37.jar
二、安装
mkdir -p /opt/hive && cd /opt/hive
tar -zxvf apache-hive-3.1.2-bin.tar.gz
- 配置环境变量
sudo vim /etc/profile.d/my_env.sh
# HIVE HOME
export HIVE_HOME=/opt/hive/apache-hive-3.1.2-bin
export PATH=$PATH:$HIVE_HOME/bin
- 刷新环境变量
source /etc/profile
- 解决日志jar包冲突
mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
- 解决hive初始化报错
# 初始化报错:Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
# 参考:https://blog.csdn.net/weixin_44625028/article/details/122313632
# 原因:hive与hadoop使用的guava依赖版本不一致导致,以hadoop的为准。
# 解决:
mv $HIVE_HOME/lib/guava-19.0.jar $HIVE_HOME/lib/guava-19.0.jar.back
cp -r $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib
三、配置Hive元数据存储到mysql
1、hive依赖库中添加mysql驱动
cp mysql-connector-java-5.1.37.jar $HIVE_HOME/lib/
2、安装mysql环境
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7.41
- 创建metastore数据库
3、修改hive配置
- 删除存储在
derby
数据库的元数据
rm -rf $HIVE_HOME/lib/metastore_db*
- 修改hive配置文件,配置Hive的元据存储到Mysql
vim $HIVE_HOME/conf/hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- jdbc 连接的 URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/metastore?useSSL=false</value>
</property>
<!-- jdbc 连接的 Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- jdbc 连接的 username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- jdbc 连接的 password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<!-- Hive 元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!--元数据存储授权-->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- Hive 默认在 HDFS 的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
-
初始化Hive元数据到mysql(启动hadoop是前提)
可能遇到的问题:Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
# 初始化
$HIVE_HOME/bin/schematool -initSchema -dbType mysql -verbose
- 解决hive数据插入报错
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
添加内容:vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
<description>default value is 1024</description>
</property>
四、Hive常见属性配置
1、Hive数据仓库位置配置
1)Default数据仓库的最原始位置是在hdfs上的:/user/hive/warehouse
路径下
2)在仓库目录下,没有对默认的数据库default创建文件夹。如果某张表属于default数据库,直接在数据仓库目录下创建一个文件夹。
3)修改default数据仓库原始位置(将 vim $HIVE_HOME/conf/hive-default.xml.template
如下配置信息拷贝到 vim $HIVE_HOME/conf/hive-site.xml
文件中)
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
配置同组用户有执行权限
hdfs dfs -chmod g+w /user/hive/warehouse
2、查询后信息显示配置
1)在 vim $HIVE_HOME/conf/hive-site.xml
文件中添加如下配置信息,就可以实现显示当前数据库,以及查询表的头信息配置。
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
2)重新启动hive,对比配置前后差异
(2)配置后
3、Hive运行日志信息配置
1)Hive的log默认存放在 /tmp/hdp/hive.log
目录下(当前用户名下)。
2)修改hive的log存放日志到$HIVE_HOME/logs
(1)修改$HIVE_HOME/conf/hive-log4j.properties.template文件名称为hive-log4j.properties
cp $HIVE_HOME/conf/hive-log4j2.properties.template $HIVE_HOME/conf/hive-log4j2.properties
(2)在hive-log4j2.properties文件中修改log存放位置
mkdir -p /opt/hive/apache-hive-3.1.2-bin/logs && chown -R hdp:hdp /opt/hive/apache-hive-3.1.2-bin/logs
vim $HIVE_HOME/conf/hive-log4j2.properties
# 添加内容
property.hive.log.dir = /opt/hive/apache-hive-3.1.2-bin/logs
4、参数配置方式
1)查看当前所有的配置信息
hive>set;
2)配置参数的三种方式
(1)配置文件方式
默认配置文件:hive-default.xml
用户自定义配置文件:hive-site.xml
注意:用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。
(2)命令行参数方式
启动Hive时,可以在命令行添加-hiveconf param=value
来设定参数。
例如:
hive -hiveconf mapred.reduce.tasks=10;
注意:仅对本次hive启动有效
查看参数设置:
hive (default)> set mapred.reduce.tasks;
(3)参数声明方式
可以在HQL
中使用SET
关键字设定参数
例如:
hive (default)> set mapred.reduce.tasks=100;
注意:仅对本次hive启动有效。
3)查看参数设置
hive (default)> set mapred.reduce.tasks;
上述三种设定方式的优先级依次递增。即配置文件 < 命令行参数 < 参数声明。注意某些系统级的参数,例如log4j相关的设定,必须用前两种方式设定,因为那些参数的读取在会话建立以前已经完成了。
五、测试
-- 进入hive-cli
hive
-- 查询所有数据库
show databases;
-- 查询所有表
show tables;
-- 如果存在test表就删除
DROP TABLE IF EXISTS test;
-- 创建test表,以“|”为分隔符
CREATE TABLE test ( age INT, name STRING, bir STRING, addr STRING, phone STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
-- 查看表结构
DESCRIBE test;
-- 插入测试数据
INSERT INTO TABLE test VALUES
(1, 'Tom', '1990-01-01', 'Beijing', '1234567890'),
(2, 'Lucy', '1995-05-05', 'Shanghai', '0987654321'),
(3, 'John', '1993-03-03', 'Guangzhou', '9876543210'),
(4, 'Linda', '1986-12-12', 'Chongqing', '0123456789'),
(5, 'David', '1994-04-04', 'Hangzhou', '6789012345'),
(6, 'Amy', '1992-02-02', 'Nanjing', '3456789012'),
(7, 'Sarah', '1989-09-09', 'Tianjin', '8901234567'),
(8, 'Peter', '1991-11-11', 'Shenzhen', '4567890123'),
(9, 'Jack', '1996-06-06', 'Chengdu', '2345678901'),
(10, 'Emily', '1988-08-08', 'Xian', '7890123456');
-- 成功后进入hadoop查看hdfs中的文件内容为
1|Tom|1990-01-01|Beijing|1234567890
2|Lucy|1995-05-05|Shanghai|0987654321
3|John|1993-03-03|Guangzhou|9876543210
4|Linda|1986-12-12|Chongqing|0123456789
5|David|1994-04-04|Hangzhou|6789012345
6|Amy|1992-02-02|Nanjing|3456789012
7|Sarah|1989-09-09|Tianjin|8901234567
8|Peter|1991-11-11|Shenzhen|4567890123
9|Jack|1996-06-06|Chengdu|2345678901
10|Emily|1988-08-08|Xian|7890123456
-- 加载本地文件中的数据到test表中去
LOAD DATA LOCAL INPATH '文件绝对路径' INTO TABLE test;
-- 慎用:会把原来的数据覆盖,加载本地文件中的数据到test表中去
LOAD DATA LOCAL INPATH '文件绝对路径' OVERWRITE INTO TABLE test;
-- 本地文件内容
21|Tom|1990-01-01|Beijing|1234567890
22|Lucy|1995-05-05|Shanghai|0987654321
23|John|1993-03-03|Guangzhou|9876543210
24|Linda|1986-12-12|Chongqing|0123456789
25|David|1994-04-04|Hangzhou|6789012345
26|Amy|1992-02-02|Nanjing|3456789012
27|Sarah|1989-09-09|Tianjin|8901234567
28|Peter|1991-11-11|Shenzhen|4567890123
29|Jack|1996-06-06|Chengdu|2345678901
210|Emily|1988-08-08|Xian|7890123456
-- 查询所有
select * from test;
hive (default)> select * from test;
OK
test.age test.name test.bir test.addr test.phone
1 Tom 1990-01-01 Beijing 1234567890
2 Lucy 1995-05-05 Shanghai 0987654321
3 John 1993-03-03 Guangzhou 9876543210
4 Linda 1986-12-12 Chongqing 0123456789
5 David 1994-04-04 Hangzhou 6789012345
6 Amy 1992-02-02 Nanjing 3456789012
7 Sarah 1989-09-09 Tianjin 8901234567
8 Peter 1991-11-11 Shenzhen 4567890123
9 Jack 1996-06-06 Chengdu 2345678901
10 Emily 1988-08-08 Xian 7890123456
21 Tom 1990-01-01 Beijing 1234567890
22 Lucy 1995-05-05 Shanghai 0987654321
23 John 1993-03-03 Guangzhou 9876543210
24 Linda 1986-12-12 Chongqing 0123456789
25 David 1994-04-04 Hangzhou 6789012345
26 Amy 1992-02-02 Nanjing 3456789012
27 Sarah 1989-09-09 Tianjin 8901234567
28 Peter 1991-11-11 Shenzhen 4567890123
29 Jack 1996-06-06 Chengdu 2345678901
210 Emily 1988-08-08 Xian 7890123456
Time taken: 0.186 seconds, Fetched: 20 row(s)
-- 删除这个表
drop table test;
六、hive常用命令
hive -help
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the console)
- “-e”不进入hive的交互窗口执行sql语句,例如:hive -e "select id from test1;"
- “-f”执行脚本中sql语句,例如:hive -f /opt/module/datas/hivef.sql
其它命令
- 退出hive窗口:
hive(default)>exit;
hive(default)>quit;
在新版的oracle中没区别了,在以前的版本是有的:
exit:先隐性提交数据,再退出;
quit:不提交数据,退出;
- 在hive cli命令窗口中如何查看hdfs文件系统
hive(default)>dfs -ls /;
- 在hive cli命令窗口中如何查看hdfs本地系统
hive(default)>! ls /opt/module/datas;
- 查看在hive中输入的所有历史命令
进入到当前用户的根目录/root或/home/hdp
查看. hivehistory文件
cat ~/.hivehistory
七、Hive 数据类型
基本数据类型
集合数据类型
可能遇到的问题
hadoop web端文件系统无法上传文件,报错
Permission denied: user=hdp, access=WRITE, inode=“/bigdata“:hdfs:supergroup:drwxr-xr-x
原因:配置的用户名与hadoop服务启动的用户不一致
检查hadoop核心配置文件中hadoop.http.staticuser.user的配置是否为hdp
vim $HADOOP_HOME/etc/hadoop/core-site.xml
其它
(不推荐)使用
derby
数据库存储hive元数据
- 初始化元数据库(默认是
derby
数据库,只能单次使用,每次都需要重新处理元数据文件)
$HIVE_HOME/bin/schematool -dbType derby -initSchema
-
启动hadoop
-
启动hive
-
【可配置】默认日志地址
tail -f /tmp/`whoami`/hive.log
启动hive客户端后执行show databases;
后报错:
Error: FUNCTION 'NUCLEUS_ASCII' already exists. (state=X0Y68,code=30000)
根本原因:
在于Hive默认使用的元数据库为derby,开启Hive之后就会占用元数据库,且不与其他客户端共享数据,所以后面需要将Hive的元数据地址改为MySQL。
解决(下方二选一):
rm -r $HIVE_HOME/lib/metastore_db*
mv $HIVE_HOME/lib/metastore_db $HIVE_HOME/lib/metastore_db.tmp
- 测试hive客户端
show databases;
show tables;
create table test(id string);
show tables;
insert into test values('1001');
# web端查看hdfs文件系统,可以发现/user/hive/warehouse/test/000000_1 被创建了
select id from test;
(不推荐)主机安装mysql
mysql环境(用来存储HIVE元数据):mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
- 检查是否安装过mysql
rpm -qa | grep 'mariadb*\|mysql\*'
- 卸载已经存在的
sudo rpm -e --nodeps mariadb-libs
- 解压
cd /opt/software; mkdir mysql ; mv mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar mysql/ ; tar -xvf mysql/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
- 安装
cd /opt/software/mysql; sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm mysql-community-client-5.7.28-1.el7.x86_64.rpm mysql-community-common-5.7.28-1.el7.x86_64.rpm mysql-community-libs-5.7.28-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
- 初始化myslq
cat /etc/my.cnf
[mysqld]
# 将此数据目录下的内容全部删除
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
rm -rf /var/lib/mysql/*
sudo mysqld --initialize --user=mysql
- 查看初始化生成的临时密码
cat /var/log/mysqld.log | grep root@localhost | awk -F"root@localhost: " '{print $2}'
- 启动mysqld
sudo systemctl start mysqld
mysql -uroot -p`cat /var/log/mysqld.log | grep root@localhost | awk -F"root@localhost: " '{print $2}'`
- 修改当前登录root用户的密码
set password = password('root')
- 更新root用户可以远程登录
mysql > update mysql.user set host='%' where user = 'root';
- 创建hive所需要的元数据存储库
mysql > create database metastore;
- 重启
sudo systemctl restart mysqld
- 测试连接
【或者】
vim /etc/my.cnf
[mysqld] # 添加内容 skip-grant-tables
- 启动mysql
systemctl start mysqld
- 登录
mysql -uroot -p空密码
- 修改密码及创建hive元数据存储库
# 0、创建hive需要的元数据存储库 create database metastore; # 1、修改登录密码 use mysql; update user set authentication_string=password('root') where user='root'; # 2、修改账号允许登录的主机 select User, Host from user; update user set Host='%' where Host='localhost'; flush privileges;
- 重启mysql服务
systemctl restart mysqld
参考
文章:大数据技术之Hive第2章 Hive安装、hive数据类型
视频:B站