大数据 ------ openEuler 24.03 环境下 Hadoop 全面实践指南
一、大数据概述
1.1 什么是大数据?
大数据(Big Data)指无法用传统数据库工具在合理时间内捕获、存储、管理和分析的数据集合,具有 4V 特征:
- Volume(体量大):TB/PB 级别
- Velocity(速度快):实时或近实时处理
- Variety(类型多):结构化、半结构化、非结构化
- Veracity(真实性):数据质量与可信度
1.2 Hadoop 生态系统简介
Hadoop 是 Apache 基金会的开源分布式计算框架,核心组件包括:
- HDFS(Hadoop Distributed File System):分布式文件系统
- MapReduce:分布式并行计算模型
- YARN:资源调度与管理
- 扩展组件:Hive、HBase、Spark、ZooKeeper 等
二、大数据基础环境准备(openEuler 24.03)
说明:以下所有操作均以 root 用户或具有 sudo 权限的用户执行。
2.1 安装、配置 Java 环境
Hadoop 依赖 Java(推荐 OpenJDK 8 或 11,Hadoop 3.x 支持 JDK 11)。
步骤 1:安装 OpenJDK 11
bash
sudo dnf install -y java-11-openjdk-devel
步骤 2:验证安装
bash
java -version
javac -version
预期输出包含 openjdk 11.x.x
步骤 3:配置 JAVA_HOME 环境变量
编辑 /etc/profile 或用户级 ~/.bashrc:
bash
sudo vim /etc/profile
在文件末尾添加:
bash
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
使配置生效:
bash
source /etc/profile
echo $JAVA_HOME # 应输出路径
2.2 安装、配置 SSH(用于伪分布/集群模式免密登录)
步骤 1:安装 OpenSSH 服务
bash
sudo dnf install -y openssh-server openssh-clients
sudo systemctl start sshd
sudo systemctl enable sshd
步骤 2:配置本机免密登录(单机/伪分布必需)
bash
# 生成 SSH 密钥(一路回车)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥加入授权列表
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 设置权限
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
# 测试免密登录本地
ssh localhost
若提示"Are you sure...",输入
yes。成功后输入exit返回。
三、下载 Hadoop 安装包
3.1 下载官方稳定版(以 Hadoop 3.3.6 为例)
bash
cd /opt
sudo mkdir hadoop
sudo chown $USER:$USER hadoop
cd hadoop
# 下载(使用清华镜像加速)
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
# 解压
tar -zxvf hadoop-3.3.6.tar.gz
mv hadoop-3.3.6 hadoop
3.2 配置 Hadoop 环境变量
编辑 ~/.bashrc:
bash
export HADOOP_HOME=/opt/hadoop/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
生效配置:
bash
source ~/.bashrc
hadoop version # 验证是否成功
四、Hadoop 核心组件详解
4.1 HDFS(Hadoop Distributed File System)
- NameNode:管理文件系统元数据(主节点)
- DataNode:存储实际数据块(从节点)
- Secondary NameNode:辅助合并 fsimage 和 edits(非备份)
4.2 MapReduce 编程模型
- Map 阶段 :将输入数据拆分为键值对
<K1, V1>→ 处理为<K2, V2> - Reduce 阶段 :对相同 key 的 value 聚合处理 → 输出
<K2, V3>
典型流程:
Input → Split → Map → Shuffle & Sort → Reduce → Output
五、Hadoop 的运行模式
| 模式 | 节点数 | 用途 |
|---|---|---|
| Local (Standalone) | 1 进程 | 调试、学习 |
| Pseudo-Distributed | 1 机器,多进程 | 功能测试 |
| Fully Distributed | 多机器集群 | 生产环境 |
六、综合案例 1:单机模式(Standalone Mode)
单机模式无需任何配置,直接运行 MapReduce 示例。
6.1 案例概述
使用 Hadoop 自带的 wordcount 程序统计单词频率。
6.2 案例详解
步骤 1:创建输入文件
bash
mkdir ~/input
echo "Hello World Hello Hadoop" > ~/input/file1.txt
echo "Hadoop is powerful" > ~/input/file2.txt
步骤 2:运行 WordCount
bash
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount ~/input ~/output
步骤 3:查看结果
bash
cat ~/output/part-r-00000
输出示例:
Hadoop 2
Hello 2
World 1
is 1
powerful 1
说明:单机模式不启动 HDFS,直接读写本地文件系统。
七、综合案例 2:伪分布模式(Pseudo-Distributed Mode)
7.1 案例概述
在单台机器上模拟完整 Hadoop 集群(NameNode + DataNode + ResourceManager 等独立进程)。
7.2 配置文件修改(关键步骤)
进入配置目录:
bash
cd $HADOOP_HOME/etc/hadoop
(1) core-site.xml
xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
(2) hdfs-site.xml
xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value> <!-- 单机只需1副本 -->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/hadoop_data/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/hadoop_data/hdfs/datanode</value>
</property>
</configuration>
(3) mapred-site.xml
xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(4) yarn-site.xml
xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
(5) 创建 HDFS 数据目录
bash
mkdir -p /opt/hadoop/hadoop_data/hdfs/{namenode,datanode}
(6) 格式化 NameNode
bash
hdfs namenode -format
成功标志:出现 "Storage directory ... has been successfully formatted."
(7) 启动 HDFS 和 YARN
bash
start-dfs.sh
start-yarn.sh
(8) 验证进程
bash
jps
应看到:
NameNode
DataNode
SecondaryNameNode
ResourceManager
NodeManager
(9) Web UI 访问(可选)
- HDFS: http://localhost:9870
- YARN: http://localhost:8088
7.3 运行 WordCount(使用 HDFS)
bash
# 创建 HDFS 目录
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/input
# 上传本地文件
hdfs dfs -put ~/input/* /user/input/
# 运行任务
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/input /user/output
# 查看结果
hdfs dfs -cat /user/output/part-r-00000
八、综合案例 3:集群模式(Fully Distributed Mode)
8.1 案例概述
部署 3 节点 Hadoop 集群(1 Master + 2 Slaves),实现高可用数据处理。
8.2 环境规划
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| master | 192.168.1.10 | NameNode, ResourceManager |
| slave1 | 192.168.1.11 | DataNode, NodeManager |
| slave2 | 192.168.1.12 | DataNode, NodeManager |
所有节点需完成 Java + SSH 免密 + hosts 配置
步骤 1:配置 /etc/hosts(所有节点)
bash
sudo vim /etc/hosts
添加:
192.168.1.10 master
192.168.1.11 slave1
192.168.1.12 slave2
步骤 2:Master 免密登录所有节点
bash
# 在 master 上执行
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
步骤 3:分发 Hadoop 到所有节点
bash
# 在 master 上
scp -r $HADOOP_HOME slave1:/opt/hadoop/
scp -r $HADOOP_HOME slave2:/opt/hadoop/
步骤 4:配置 workers 文件(原 slaves)
bash
vim $HADOOP_HOME/etc/hadoop/workers
内容:
slave1
slave2
步骤 5:其他配置同伪分布(core-site.xml, hdfs-site.xml 等)
注意:
fs.defaultFS仍为hdfs://master:9000
步骤 6:仅在 master 格式化 NameNode
bash
hdfs namenode -format
步骤 7:启动集群(仅在 master)
bash
start-dfs.sh # 自动启动所有 DataNode
start-yarn.sh # 自动启动所有 NodeManager
步骤 8:验证集群状态
bash
hdfs dfsadmin -report # 查看 DataNode 是否注册
8.3 集群版 WordCount 案例代码(自定义 MapReduce)
Java 源码:WordCount.java
java
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 自定义 WordCount 程序
* 功能:统计文本中每个单词出现的次数
*/
public class WordCount {
/**
* Mapper 类:将每行文本拆分为单词,输出 <word, 1>
*/
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
// 使用 StringTokenizer 按空格分割单词
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken()); // 设置单词为 key
context.write(word, one); // 输出 <word, 1>
}
}
}
/**
* Reducer 类:对相同 key 的 value 求和
*/
public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
// 遍历所有 value(都是 1),累加
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result); // 输出 <word, total_count>
}
}
/**
* 主函数:配置并提交 Job
*/
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: WordCount <input path> <output path>");
System.exit(-1);
}
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class); // 可选:本地聚合减少网络传输
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class); // 输出 key 类型
job.setOutputValueClass(IntWritable.class); // 输出 value 类型
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
编译与打包
bash
# 编译(需 hadoop classpath)
javac -classpath $(hadoop classpath) WordCount.java
# 打包成 JAR
jar cf wc.jar *.class
提交到集群
bash
hdfs dfs -put input_data /user/input
hadoop jar wc.jar WordCount /user/input /user/output_custom
hdfs dfs -cat /user/output_custom/part-r-00000
九、小结
| 内容 | 关键点 |
|---|---|
| 环境准备 | Java 11 + SSH 免密 + hosts 配置 |
| Hadoop 安装 | 解压 + 环境变量 + 配置文件 |
| 三种模式 | 单机(快速验证)、伪分布(功能完整)、集群(生产) |
| HDFS 操作 | hdfs dfs -put/-cat/-ls |
| MapReduce 编程 | 继承 Mapper/Reducer,重写 map/reduce 方法 |
| 集群部署 | workers 文件 + 分发配置 + 启动脚本 |
最佳实践建议:
- 开发阶段使用伪分布模式;
- 生产环境务必配置 ZooKeeper 实现 NameNode 高可用;
- 使用
hdfs dfsadmin -report和 Web UI 监控集群健康状态。
通过本章实践,读者可在 openEuler 24.03 上完整搭建并运行 Hadoop 大数据平台,为后续学习 Hive、Spark 等组件打下坚实基础。