一、实验目的
-
理解分布式数据存储的基本概念和应用场景。
-
学习Hadoop生态系统的架构及其在构建数据湖中的关键作用。
-
掌握使用Hadoop和相关工具(如HDFS, Hive)构建简单的数据湖解决方案。
二、实验环境准备
-
JAVA环境准备:确保Java Development Kit (JDK) 已安装并配置好环境变量。
-
Hadoop环境准备:安装并配置Hadoop环境,确保Hadoop的各个组件可以在伪分布式模式下运行。
三、实验教材参考
《大数据存储》,谭旭,人民邮电出版社,2022,ISBN 978-7-115-59414-3。
四、实验内容与步骤
1、安装hive
- 在官网下载Hive的安装包Index of /dist/hive

- 将安装包上传到namenode中的software文件夹中。

- 同样上传到datanode的software文件夹中

- 查看software目录中的内容

- 解压安装包并将文件夹改名为Hive



- 修改/etc/profile,添加环境变量

重新加载配置环境文件

- 初始化元数据库

2、安装MySQL
- 将安装包上传到namenode中的software文件夹中。

- 解压MySQL安装包


- 卸载系统自带的mariadb

- 安装MySQL依赖


- 安装MySQL-Client

- 安装MySQL-Server

- 启动MySQL
启动MySQL服务器

查看服务器状态

设置MySQL开机自启动

- 查看MySQL密码

随机生成的密码为:hogN+fA!s16q
- 使用密码进入MySQL

- 设置新密码:Wzh@5678

- 更改密码为简单密码:000000

- 进入MySQL

查询user表:SELECT user,host from user;

修改user表,把Hostname表内容修改为%:update user set host="%" where user="root";

刷新:flush privileges;

3、 配置Hive元数据到MySQL
- 新建Hive元数据库
(1)登录MySQL

(2)创建Hive元数据库

- 将MySQL的JDBC驱动拷贝到Hive的lib目录下

- 在$HIVE_HOME/conf目录下新建hive-site.xml文件

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://namenode: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>000000</value>
</property>
<!-- Hive默认在HDFS的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
- 初始化Hive元数据库,修改为采用MySQL存储元数据库
schematool -dbType mysql -initSchema

根据报错信息,schematool 在初始化 Hive Metastore Schema 时由于 MySQL 的连接配置问题失败。连接失败的原因:java.sql.SQLNonTransientConnectionException : Public Key Retrieval is not allowed。这是因为 MySQL 的默认身份验证模式(caching_sha2_password)可能与 Public Key Retrieval 相关联,而 JDBC 驱动默认不允许公钥自动检索。
编辑hive-site.xml文件,找到 javax.jdo.option.ConnectionURL 配置,添加 allowPublicKeyRetrieval=true 参数。

- 启动

- 查看 hdfs dfsadmin -report

- 确认safe mode状态
检查namenode是否仍存在 Safe Mode。

强制退出Safe Mode。

确认Safe Mode状态。

- 启动Hive

- SLF4J错误信息

SLF4J(Simple Logging Facade for Java) 没有找到具体的日志实现库(例如 Logback 或 Log4j),导致它默认使用了"NOP"实现(即不输出日志)。虽然不会影响程序功能,但日志系统无法正常工作。
下载需要的jar文件。

无法解析主机地址。
首先检查是否可以连接网络。

可以连接到网络,检查/etc/resolv.conf文件配置。

文件里没有内容,配置有效的 DNS 服务器。

重新下载:
wgethttps://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30.jar

wget https://repo1.maven.org/maven2/log4j/log4j/1.2.17/log4j-1.2.17.jar
如果是Hive,则将上述JAR文件下载到Hive的lib目录:
cd /software/hive/lib
重启Hive验证。

4、构建简单的数据湖
使用HDFS命令行工具上传样本数据文件(如CSV格式的交易数据)至HDFS。
学习Hive的基本概念和操作,创建Hive表来映射到HDFS中的数据文件。
- 准备数据文件data.csv


- 在本地文件系统中,将文件上传到HDFS的/data目录中
hdfs dfs -mkdir -p /data
hdfs dfs -put /software/hadoop/data/data.csv /data

- 验证文件是否上传成功
hdfs dfs -ls /data

- 启动Hive,创建一个新数据库
CREATE DATABASE IF NOT EXISTS data_lake;
USE data_lake;

- 创建Hive表来映射到HDFS中的数据文件
CREATE EXTERNAL TABLE IF NOT EXISTS transactions (
transaction_id INT,
customer_id INT,
amount DOUBLE,
transaction_date STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/data'
TBLPROPERTIES ("skip.header.line.count"="1");

- 验证表结构
DESCRIBE transactions;

- 检查表内容
SELECT * FROM transactions LIMIT 10;

5、 数据探索与查询
使用Hive执行SQL查询,进行数据探索,如计算总交易量、查询特定条件的交
易记录等。
- 查询金额大于100 的交易记录

- 按客户统计交易金额
SELECT customer_id, SUM(amount) AS total_amount
FROM transactions
GROUP BY customer_id
ORDER BY total_amount DESC;
- 按日期统计交易量,统计每天的交易总金额和交易次数
SELECT transaction_date,
SUM(amount) AS daily_total_amount,
COUNT(transaction_id) AS daily_transaction_count
FROM transactions
GROUP BY transaction_date
ORDER BY transaction_date;