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

2021-04-16
6分钟阅读时长

«返回课程汇总页面

【版本】

当前版本号v20230414

版本修改说明
v20230414增加常见问题2
v20220513增加常见问题
v20210527修改hive-site.xml的配置
v20210416初始化版本

实验7.1 - 部署 Hive

【实验目的】

  • 掌握部署 Hive

【实验环境】

  • Windows 7 以上64位操作系统
  • JDK8
  • IDEA
  • Hadoop 3
  • MariaDB/MySQL

【实验资源】

  • Hadoop
链接:https://pan.baidu.com/s/1MoQ0iU0Qb1o8_o5JV6X6iw 
提取码:3rno

【实验内容】

  • 完成 Hive 的部署

【实验步骤】

  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
  • 查看是否有 hive 这个库。
use hive;
  • 退出
exit;
  1. 退出 MariaDB 命令行,切换到系统 root 用户。
su
  1. 增加 Hive 相关环境变量设置。
  • 需要root权限执行
echo "export HIVE_HOME=/opt/hive
export PATH=\$HIVE_HOME/bin:\$PATH" >>/etc/profile
  1. 新增 MariaDB 配置。
  • 需要root权限执行
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-3.1.2-bin.tar.gz到 /home/hadoop 并解压。
cd ~
tar -xvf apache-hive-3.1.2-bin.tar.gz
  1. 创建 hive 安装目录,并拷贝文件到安装目录。
sudo mkdir -p /opt/hive
sudo chown hadoop:wheel /opt/hive
mv ~/apache-hive-3.1.2-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>
  <property> 
    <name>hive.fetch.task.conversion</name> 
    <value>more</value>
  </property>
  <!-- 关闭列统计 -->
  <property> 
    <name>hive.stats.column.autogather</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 进行简单分析

【实验目的】

  • 掌握使用 HiveQL 进行数据分析

【实验环境】

  • Windows 7 以上64位操作系统
  • JDK8
  • IDEA
  • Hadoop 3
  • MariaDB/MySQL
  • Hive 3.x

【实验资源】

  • Hive
  • 部门数据 dept.csv
  • 员工数据 emp.csv
下载链接:https://pan.baidu.com/s/1ghde86wcK6pwg1fdSSWg0w
提取码:v3wv

【实验内容】

  • 使用 Hive 进行数据分析

【实验步骤】

  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. 创建员工表,注意替换为你的学号后3位。
hive> create table emp你的学号后3位(empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int) row format delimited fields terminated by ',';
  1. 创建部门表,注意替换为你的学号后3位。
hive> create table dept你的学号后3位(deptno int,dname string,loc string) row format delimited fields terminated by ',';
  1. 导入数据。
hive> load data inpath '/exp7/emp.csv' into table emp你的学号后3位;
hive> load data inpath '/exp7/dept.csv' into table dept你的学号后3位;
  1. 根据员工的部门号创建分区,表名为emp_part+学号后3位
hive> create table emp_part你的学号后3位(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你的学号后3位 partition(deptno=10) select empno,ename,job,mgr,hiredate,sal,comm from emp你的学号后3位 where deptno=10;
hive> insert into table emp_part你的学号后3位 partition(deptno=20) select empno,ename,job,mgr,hiredate,sal,comm from emp你的学号后3位 where deptno=20;
hive> insert into table emp_part你的学号后3位 partition(deptno=30) select empno,ename,job,mgr,hiredate,sal,comm from emp你的学号后3位 where deptno=30;
  1. 创建一个桶表,表名为emp_bucket+学号后3位,根据员工的职位(job)进行分桶。
hive> create table emp_bucket你的学号后3位(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你的学号后3位 select * from emp你的学号后3位;
  1. 独立完成以下 HiveQL 查询。记录下你的 HiveQL。
  • (1)查询所有的员工信息。 期望结果:
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
  • (2)查询员工信息:查询员工姓名为BLAKE的员工号、姓名和薪水。

期望结果:

empno	ename	sal
7698	BLAKE	2850
  • (3)多表关联查询:关联查询emp表和dept表中所有员工部门名称、员工姓名,并按部门名称排序。

期望结果:

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
  • (4)分区表关联查询:关联查询emp_part表和dept表,找到员工部门是10和20的部门名称和员工姓名,并按部门名称排序。

期望结果:

dname	ename
ACCOUNTING	MILLER
ACCOUNTING	KING
ACCOUNTING	CLARK
RESEARCH	FORD
RESEARCH	ADAMS
RESEARCH	SCOTT
RESEARCH	JONES
RESEARCH	SMITH
  • (5)桶表关联查询:关联查询emp_bucket表和dept表,找到员工部门是20和30的部门名称和部门下员工的数量。

期望结果:

dname	no
RESEARCH	5
SALES	6
  • (6)查询各个部门的总薪水。

期望结果:

dname	sumsal
ACCOUNTING	8750
RESEARCH	10875
SALES	9400
  • (7)根据职位给员工涨工资,并把涨前、涨后的薪水显示出来。
职位薪水变化
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

【常见问题】

  1. 在 Hive 执行 show tables出现 MetaException 异常。
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.hadoop.hive.metastore.api.MetaException Exception thrown when executing query : SELECT A0.TBL_NAME,A0.TBL_NAME AS NUCORDER0 FROM TBLS A0 LEFT OUTER JOIN DBS B0 ON A0.DB_ID = B0.DB_ID WHERE B0.`NAME` = ? AND B0.CTLG_NAME = ? AND LOWER(A0.TBL_NAME) LIKE '_%' ESCAPE '\' ORDER BY NUCORDER0)

答:这是因为ESCAPE '\'这个语句在 MariaDB执行的时候,\被当成转义字符导致 SQL 语句错误。需要在 MariaDB 使用 root 账号执行以下语句,把\设置为非转义字符。

SET sql_mode='NO_BACKSLASH_ESCAPES';
SET GLOBAL sql_mode = 'NO_BACKSLASH_ESCAPES';
commit;
  1. 运行 Hive SQL 报错“FAILED: Execution Error,return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask” 答:编辑配置文件
cd /opt/hive/conf/
vi hive-site.xml
  • <configuration></configuration>标签内加入以下属性。
  <property> 
    <name>hive.stats.column.autogather</name> 
    <value>false</value>
  </property>

扫码或长按识别访问