Hadoop Part 7 - 部署 Hive 和 Hive 常用操作

文章导航

«返回课程汇总页面

【版本】

当前版本号v20210527

版本修改说明
v20210527修改hive-site.xml的配置
v20210416初始化版本

实验7.1 - 部署 Hive

【实验名称】

实验7.1 - 部署 Hive

【实验目的】

【实验环境】

【实验资源】

下载链接:https://pan.baidu.com/s/1ghde86wcK6pwg1fdSSWg0w
提取码:v3wv

【实验步骤】

  1. 使用 hadoop 登录NodeA节点。
su hadoop
  1. Hive 的安装需要依赖 MySQL 或 MariaDB,这里我们选择 MariaDB。这里需要提权安装,如果安装失败请检查源配置文件/etc/yum.repos.d/local.repo或者光盘是否挂载成功。
sudo yum install mariadb mariadb-server
  1. 启动 MariaDB 并设置为开机启动。
sudo systemctl start mariadb
sudo systemctl enable mariadb
  1. 使用 MariaDB 的安全安装选项。
mysql_secure_installation

以下为弹出选项的输入值

Enter current password for root (enter for none): 回车
Set root password? [Y/n] Y
New password: 123456
Re-enter new password:123456
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
  1. 测试使用 root 账户登录 MariaDB。密码为123456
mysql -u root -p
  1. 登录进入 MariaDB 以后。执行以下SQL
-- 创建 hive 数据库
create database hive CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 创建 hive 用户并授权
create user 'hive'@'localhost' identified by 'hive123456';
create user 'hive'@'%' identified by 'hive123456';
grant all on hive.* to 'hive'@'localhost';
grant all on hive.* to 'hive'@'%';
exit
  1. 退出 MariaDB 命令行,使用 hive 用户进行登录,登录以后查看是否有 hive 这个库。
mysql hive -uhive -p
  1. 退出 MariaDB 命令行,切换到系统 root 用户。
su
  1. 增加 Hive 相关环境变量设置。
echo "export HIVE_HOME=/opt/hive
export PATH=\$HIVE_HOME/bin:\$PATH" >>/etc/profile
  1. 新增 MariaDB 配置。
echo '[client]
default-character-set=utf8
[mysqld]
bind-address = 0.0.0.0
default-storage-engine = innodb
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
wait_timeout = 600
max_allowed_packet = 64M
sql_mode=NO_BACKSLASH_ESCAPES
[mysql]
default-character-set=utf8'  >/etc/my.cnf.d/hive.cnf
  1. 切换到系统 hadoop 用户。
su hadoop
  1. 查看环境变量的输出是否正确。
source /etc/profile
echo $HIVE_HOME

应该输出

/opt/hive
  1. 重启 MariaDB。
sudo systemctl restart mariadb
  1. 查看进程和端口是否正常。
sudo netstat -tulpn|grep mysql

正常会输出进程信息,类似以下内容:

tcp  0   0 0.0.0.0:3306  0.0.0.0:* LISTEN  2152/mysqld
  1. 使用 hadoop 用户上传 Hive 安装文件apache-hive-2.3.8-bin.tar.gz到 /home/hadoop 并解压。
cd ~
tar -xvf apache-hive-2.3.8-bin.tar.gz
  1. 创建 hive 安装目录,并拷贝文件到安装目录。
sudo mkdir -p /opt/hive
sudo chown hadoop:wheel /opt/hive
mv ~/apache-hive-2.3.8-bin/* /opt/hive
  1. 上传 MariaDB 驱动mariadb-java-client-2.7.2.jar到 /opt/hive/lib/ 目录下。

  2. 编辑 Hive 的配置文件。

cd /opt/hive/conf/
vi hive-site.xml
  1. 加入以下内容。
<?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://localhost:3306/hive?useSSL=false</value>
  </property>
  <!-- 数据库驱动名 -->
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>org.mariadb.jdbc.Driver</value>
  </property>
  <!-- 数据库用户名 -->
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <!-- 数据库用户密码 -->
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive123456</value>
  </property>
  <!-- 不校验 Schema -->
  <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
  </property>
  <!-- 显示表名 -->
  <property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
  </property>
  <!-- 显示表头 -->
  <property>
    <name>hive.cli.print.header</name>
    <value>true</value>
  </property>
  <!-- 表头不显示表名 -->
  <property>
    <name>hive.resultset.use.unique.column.names</name>
    <value>false</value>
  </property>
</configuration>
  1. 初始化 Hive 的 Schema。
schematool -dbType mysql -initSchema
  1. 检查 MariaDB 的 hive 库里是否有表。
mysql hive -uhive -phive123456
show tables
exit
  1. 启动 Hadoop。
start-hdp.sh
  1. 启动 Hive
hive
  1. 查看所有数据库
hive> show databases;

实验7.2 - 使用 Hive 进行简单分析

【实验名称】

实验7.2 - 部署 Hive

【实验目的】

【实验环境】

【实验资源】

下载链接:https://pan.baidu.com/s/1ghde86wcK6pwg1fdSSWg0w
提取码:v3wv

【实验步骤】

  1. 启动 Hadoop。

  2. 上传dept.csvemp.csv到 Linux 系统。将实验环境提到的源数据的两张表复制到 HDFS 的/exp7 目录下。

hdfs dfs -mkdir -p /exp7
hdfs dfs -put dept.csv /exp7
hdfs dfs -put emp.csv /exp7
  1. 启动 Hive
hive
  1. 创建员工表,注意替换为你的学号后4位。
hive> create table emp你的学号后4位(empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int) row format delimited fields terminated by ',';
  1. 创建部门表,注意替换为你的学号后4位。
hive> create table dept你的学号后4位(deptno int,dname string,loc string) row format delimited fields terminated by ',';
  1. 导入数据。
hive> load data inpath '/exp7/emp.csv' into table emp你的学号后4位;
hive> load data inpath '/exp7/dept.csv' into table dept你的学号后4位;
  1. 根据员工的部门号创建分区,表名为emp_part+学号后4位
hive> create table emp_part你的学号后4位(empno int,ename string,job string,mgr int,hiredate string,sal int,comm int)partitioned by (deptno int)row format delimited fields terminated by ',';
  1. 向分区表插入数据:指明导入的数据的分区(通过子查询导入数据)。
hive> insert into table emp_part你的学号后4位 partition(deptno=10) select empno,ename,job,mgr,hiredate,sal,comm from emp你的学号后4位 where deptno=10;
hive> insert into table emp_part你的学号后4位 partition(deptno=20) select empno,ename,job,mgr,hiredate,sal,comm from emp你的学号后4位 where deptno=20;
hive> insert into table emp_part你的学号后4位 partition(deptno=30) select empno,ename,job,mgr,hiredate,sal,comm from emp你的学号后4位 where deptno=30;
  1. 创建一个桶表,表名为emp_bucket+学号后4位,根据员工的职位(job)进行分桶。
hive> create table emp_bucket你的学号后4位(empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int)clustered by (job) into 4 buckets row format delimited fields terminated by ',';
  1. 通过子查询插入数据:
hive> insert into emp_bucket你的学号后4位 select * from emp你的学号后4位;
  1. 独立完成以下 HiveQL 查询。记录下你的 HiveQL。
empno	ename	job	    mgr	 hiredate	sal	comm	deptno
7369	SMITH	CLERK	7902	1980/12/17	800	NULL	20
7499	ALLEN	SALESMAN	7698	1981/2/20	1600	300	30
7521	WARD	SALESMAN	7698	1981/2/22	1250	500	30
7566	JONES	MANAGER	7839	1981/4/2	2975	NULL	20
7654	MARTIN	SALESMAN	7698	1981/9/28	1250	1400	30
7698	BLAKE	MANAGER	7839	1981/5/1	2850	NULL	30
7782	CLARK	MANAGER	7839	1981/6/9	2450	NULL	10
7788	SCOTT	ANALYST	7566	1987/4/19	3000	NULL	20
7839	KING	PRESIDENT	NULL	1981/11/17	5000	NULL	10
7844	TURNER	SALESMAN	7698	1981/9/8	1500	0	30
7876	ADAMS	CLERK	7788	1987/5/23	1100	NULL	20
7900	JAMES	CLERK	7698	1981/12/3	950	NULL	30
7902	FORD	ANALYST	7566	1981/12/3	3000	NULL	20
7934	MILLER	CLERK	7782	1982/1/23	1300	NULL	10

期望结果:

empno	ename	sal
7698	BLAKE	2850

期望结果:

dname	ename
ACCOUNTING	MILLER
ACCOUNTING	KING
ACCOUNTING	CLARK
RESEARCH	ADAMS
RESEARCH	SCOTT
RESEARCH	SMITH
RESEARCH	JONES
RESEARCH	FORD
SALES	TURNER
SALES	ALLEN
SALES	BLAKE
SALES	MARTIN
SALES	WARD
SALES	JAMES

期望结果:

dname	ename
ACCOUNTING	MILLER
ACCOUNTING	KING
ACCOUNTING	CLARK
RESEARCH	FORD
RESEARCH	ADAMS
RESEARCH	SCOTT
RESEARCH	JONES
RESEARCH	SMITH

期望结果:

dname	no
RESEARCH	5
SALES	6

期望结果:

dname	sumsal
ACCOUNTING	8750
RESEARCH	10875
SALES	9400
职位薪水变化
PRESIDENT+1000
MANAGER+800
其他+400

期望结果:

empno	ename	job	sal_before	sal_after
7369	SMITH	CLERK	800	1200
7499	ALLEN	SALESMAN	1600	2000
7521	WARD	SALESMAN	1250	1650
7566	JONES	MANAGER	2975	3775
7654	MARTIN	SALESMAN	1250	1650
7698	BLAKE	MANAGER	2850	3650
7782	CLARK	MANAGER	2450	3250
7788	SCOTT	ANALYST	3000	3400
7839	KING	PRESIDENT	5000	6000
7844	TURNER	SALESMAN	1500	1900
7876	ADAMS	CLERK	1100	1500
7900	JAMES	CLERK	950	1350
7902	FORD	ANALYST	3000	3400
7934	MILLER	CLERK	1300	1700

【常见问题】