«返回课程汇总页面
【版本】
当前版本号v20230414
版本 | 修改说明 |
---|
v20230414 | 增加常见问题2 |
v20220513 | 增加常见问题 |
v20210527 | 修改hive-site.xml的配置 |
v20210416 | 初始化版本 |
实验7.1 - 部署 Hive
【实验目的】
【实验环境】
- Windows 7 以上64位操作系统
- JDK8
- IDEA
- Hadoop 3
- MariaDB/MySQL
【实验资源】
复制
【实验内容】
【实验步骤】
- 使用 hadoop 登录 NodeA 节点。
复制
- 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
复制
注意此处设置的简单密码仅为方便实验实施,工作环境请勿设置简单密码!
- 登录进入 MariaDB 以后。执行以下SQL
| |
| create database hive CHARACTER SET utf8 COLLATE utf8_general_ci; |
| |
| 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 这个库。
复制
复制
复制
- 退出 MariaDB 命令行,切换到系统 root 用户。
复制
- 增加 Hive 相关环境变量设置。
| echo "export HIVE_HOME=/opt/hive |
| export PATH=\$HIVE_HOME/bin:\$PATH" >>/etc/profile |
复制
- 新增 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 |
复制
- 切换到系统 hadoop 用户。
复制
- 查看环境变量的输出是否正确。
| source /etc/profile |
| echo $HIVE_HOME |
复制
应该输出
复制
- 重启 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> |
| |
| <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。
复制
- 启动 Hive
复制
- 查看所有数据库
复制
实验7.2 - 使用 Hive 进行简单分析
【实验目的】
【实验环境】
- Windows 7 以上64位操作系统
- JDK8
- IDEA
- Hadoop 3
- MariaDB/MySQL
- Hive 3.x
【实验资源】
- Hive
- 部门数据 dept.csv
- 员工数据 emp.csv
复制
【实验内容】
【实验步骤】
启动 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
复制
- 创建员工表,注意替换为你的学号后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。
| 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 |
复制
期望结果:
| 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> |
复制