【版本】
当前版本号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 的部署
【实验步骤】
- 使用 hadoop 登录 NodeA 节点。
su hadoop
- Hive 的安装需要依赖 MySQL 或 MariaDB,这里我们选择 MariaDB。这里需要提权安装,如果安装失败请检查源配置文件
/etc/yum.repos.d/local.repo
或者光盘是否挂载成功。
sudo yum install mariadb mariadb-server
- 启动 MariaDB 并设置为开机启动。
sudo systemctl start mariadb
sudo systemctl enable mariadb
- 使用 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
- 测试使用 root 账户登录 MariaDB。密码为
123456
mysql -u root -p
注意此处设置的简单密码仅为方便实验实施,工作环境请勿设置简单密码!
- 登录进入 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
- 退出 MariaDB 命令行,使用 hive 用户进行登录,登录以后查看是否有 hive 这个库。
mysql hive -uhive -p
- 查看是否有 hive 这个库。
use hive;
- 退出
exit;
- 退出 MariaDB 命令行,切换到系统 root 用户。
su
- 增加 Hive 相关环境变量设置。
- 需要root权限执行
echo "export HIVE_HOME=/opt/hive
export PATH=\$HIVE_HOME/bin:\$PATH" >>/etc/profile
- 新增 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
- 切换到系统 hadoop 用户。
su hadoop
- 查看环境变量的输出是否正确。
source /etc/profile
echo $HIVE_HOME
应该输出
/opt/hive
- 重启 MariaDB。
sudo systemctl restart mariadb
- 查看进程和端口是否正常。
sudo netstat -tulpn|grep mysql
正常会输出进程信息,类似以下内容:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2152/mysqld
- 使用 hadoop 用户上传 Hive 安装文件
apache-hive-3.1.2-bin.tar.gz
到 /home/hadoop 并解压。
cd ~
tar -xvf apache-hive-3.1.2-bin.tar.gz
- 创建 hive 安装目录,并拷贝文件到安装目录。
sudo mkdir -p /opt/hive
sudo chown hadoop:wheel /opt/hive
mv ~/apache-hive-3.1.2-bin/* /opt/hive
上传 MariaDB 驱动
mariadb-java-client-2.7.2.jar
到 /opt/hive/lib/ 目录下。编辑 Hive 的配置文件。
cd /opt/hive/conf/
vi hive-site.xml
- 加入以下内容。
<?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>
- 初始化 Hive 的 Schema。
schematool -dbType mysql -initSchema
- 检查 MariaDB 的 hive 库里是否有表。
mysql hive -uhive -phive123456
show tables
exit
- 启动 Hadoop。
start-hdp.sh
- 启动 Hive
hive
- 查看所有数据库
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 进行数据分析
【实验步骤】
启动 Hadoop。
上传
dept.csv
和emp.csv
到 Linux 系统。将实验环境提到的源数据的两张表复制到 HDFS 的/exp7 目录下。
hdfs dfs -mkdir -p /exp7
hdfs dfs -put dept.csv /exp7
hdfs dfs -put emp.csv /exp7
- 启动 Hive
hive
- 创建员工表,注意替换为你的学号后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 ',';
- 创建部门表,注意替换为你的学号后3位。
hive> create table dept你的学号后3位(deptno int,dname string,loc string) row format delimited fields terminated by ',';
- 导入数据。
hive> load data inpath '/exp7/emp.csv' into table emp你的学号后3位;
hive> load data inpath '/exp7/dept.csv' into table dept你的学号后3位;
- 根据员工的部门号创建分区,表名为
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 ',';
- 向分区表插入数据:指明导入的数据的分区(通过子查询导入数据)。
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;
- 创建一个桶表,表名为
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 ',';
- 通过子查询插入数据:
hive> insert into emp_bucket你的学号后3位 select * from emp你的学号后3位;
- 独立完成以下 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
【常见问题】
- 在 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;
- 运行 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>