大数据之—Hive数仓搭建

前言

Hive是hadoop的一种客户端工具

官网:https://hive.apache.org/

文档地址: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_HOME/bin/schematool -initSchema -dbType mysql -verbose
  • 解决hive数据插入报错

FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

参考:https://blog.csdn.net/kikitious_du/article/details/84848621、https://blog.csdn.net/qq_40889383/article/details/115131773

添加内容: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,对比配置前后差异

img

(2)配置后

img

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

其它命令

  1. 退出hive窗口:

hive(default)>exit;

hive(default)>quit;

在新版的oracle中没区别了,在以前的版本是有的:

exit:先隐性提交数据,再退出;

quit:不提交数据,退出;

  1. 在hive cli命令窗口中如何查看hdfs文件系统

hive(default)>dfs -ls /;

  1. 在hive cli命令窗口中如何查看hdfs本地系统

hive(default)>! ls /opt/module/datas;

  1. 查看在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站

posted @ 2022-06-24 15:28  黄河大道东  阅读(209)  评论(0编辑  收藏  举报