CentOS Stream 9 中大数据 ---语法详解与实战案例
系统环境:CentOS Stream 9 x86_64
Hadoop 版本:3.3.6(推荐稳定版)
Java 版本:OpenJDK 11 或 Oracle JDK 8/11
一、大数据概述
大数据(Big Data) 指无法用传统工具在合理时间内捕获、管理、处理的数据集合。
4V 特征:
| 特征 | 说明 |
|---|---|
| Volume(体量) | 数据量巨大(TB/PB/EB) |
| Velocity(速度) | 数据产生和处理速度快 |
| Variety(多样性) | 结构化、半结构化、非结构化数据 |
| Value(价值) | 价值密度低,需挖掘 |
Hadoop 生态系统核心组件:
| 组件 | 作用 |
|---|---|
| HDFS | 分布式文件系统(存储) |
| MapReduce | 分布式计算框架(计算) |
| YARN | 资源调度与管理 |
| Hive | 数据仓库(SQL 查询) |
| HBase | 分布式 NoSQL 数据库 |
| Spark | 内存计算框架(替代 MapReduce) |
本章重点:HDFS + MapReduce + Hadoop 单机/伪分布部署
二、Hadoop 核心组件详解
2.1 HDFS(Hadoop Distributed File System)
分布式文件系统,将大文件切块存储在多台机器上,提供高容错、高吞吐访问。
核心架构:
- NameNode(NN):管理文件系统命名空间、元数据(文件名、块位置等)
- DataNode(DN):存储实际数据块(默认块大小 128MB)
- Secondary NameNode(SNN):定期合并 fsimage 和 edits,非热备
HDFS Shell 常用命令:
bash
# 查看文件列表
hdfs dfs -ls /
# 创建目录
hdfs dfs -mkdir /input
# 上传本地文件到 HDFS
hdfs dfs -put localfile.txt /input/
# 下载 HDFS 文件到本地
hdfs dfs -get /input/localfile.txt ./
# 查看文件内容
hdfs dfs -cat /input/localfile.txt
# 删除文件
hdfs dfs -rm /input/localfile.txt
# 删除目录(递归)
hdfs dfs -rm -r /input
# 查看磁盘使用情况
hdfs dfs -df -h
✅ 示例:上传并查看文件
bash
echo "Hello Hadoop World" > test.txt
hdfs dfs -mkdir -p /user/$(whoami)/input
hdfs dfs -put test.txt /user/$(whoami)/input/
hdfs dfs -cat /user/$(whoami)/input/test.txt
2.2 MapReduce
分布式计算模型,分两个阶段:
- Map 阶段:对输入数据进行"分而治之",输出 <key, value> 对
- Reduce 阶段:对相同 key 的 value 进行聚合
经典案例:WordCount(词频统计)
Map 输入:<行偏移量, 行内容>Map 输出:
<单词, 1>Reduce 输入:
<单词, [1,1,1,...]>Reduce 输出:
<单词, 总次数>
✅ WordCount Java 代码结构(简化版):
java
import java.io.IOException;
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;
public class WordCount {
// Mapper 类:继承 Mapper<输入key, 输入value, 输出key, 输出value>
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
// 按空格分割单词
String[] words = value.toString().split("\\s+");
for (String w : words) {
if (!w.isEmpty()) {
word.set(w);
context.write(word, one); // 输出 <word, 1>
}
}
}
}
// Reducer 类
public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get(); // 累加所有 1
}
result.set(sum);
context.write(key, result); // 输出 <word, sum>
}
}
// 主函数:配置并提交作业
public static void main(String[] args) throws Exception {
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);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
⚠️ 注意:需打包为 JAR 文件后在 Hadoop 集群运行。
三、大数据基础环境准备
3.1 安装、配置 Java 环境
Hadoop 依赖 Java(推荐 OpenJDK 11)
✅ CentOS Stream 9 安装 OpenJDK 11:
bash
# 安装 OpenJDK 11
sudo dnf install java-11-openjdk-devel -y
# 验证安装
java -version
javac -version
# 设置 JAVA_HOME(永久生效)
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# 验证 JAVA_HOME
echo $JAVA_HOME
✅ 输出示例:
openjdk version "11.0.23" 2024-04-16 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.23.0.1-1.el9) (build 11.0.23+1-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.23.0.1-1.el9) (build 11.0.23+1-LTS, mixed mode, sharing)
3.2 安装、配置 SSH
Hadoop 伪分布/完全分布模式需 SSH 无密码登录本机/节点
✅ 安装 SSH 服务:
bash
sudo dnf install openssh-server openssh-clients -y
sudo systemctl enable sshd
sudo systemctl start sshd
✅ 配置无密码 SSH 登录本机:
bash
# 生成密钥对(一路回车)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥追加到 authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 设置权限
chmod 0600 ~/.ssh/authorized_keys
chmod 0700 ~/.ssh
# 测试无密码登录本机
ssh localhost
# 输入 yes 后应直接登录,无需密码
exit
✅ 验证:
bash
ssh localhost 'echo "SSH 无密码登录成功!"'
四、安装、配置 Hadoop 环境
4.1 下载 Hadoop 安装包
✅ 从 Apache 官网下载(推荐 3.3.6)
bash
cd /opt
sudo wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
# 解压
sudo tar -xzf hadoop-3.3.6.tar.gz
sudo mv hadoop-3.3.6 hadoop
sudo chown -R $USER:$USER hadoop # 修改属主
4.2 配置 Hadoop 环境变量
✅ 编辑
~/.bashrc:
bash
echo 'export HADOOP_HOME=/opt/hadoop' >> ~/.bashrc
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc
echo 'export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc
echo 'export HADOOP_MAPRED_HOME=$HADOOP_HOME' >> ~/.bashrc
echo 'export HADOOP_COMMON_HOME=$HADOOP_HOME' >> ~/.bashrc
echo 'export HADOOP_HDFS_HOME=$HADOOP_HOME' >> ~/.bashrc
echo 'export YARN_HOME=$HADOOP_HOME' >> ~/.bashrc
source ~/.bashrc
✅ 验证:
bash
hadoop version
4.3 配置 Hadoop 核心文件(伪分布模式)
所有配置文件位于:
$HADOOP_HOME/etc/hadoop/
① core-site.xml
xml
<!-- etc/hadoop/core-site.xml -->
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
<description>默认文件系统 URI</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
<description>Hadoop 临时目录</description>
</property>
</configuration>
② hdfs-site.xml
xml
<!-- etc/hadoop/hdfs-site.xml -->
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>副本数(伪分布设为1)</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/hadoop/data/namenode</value>
<description>NameNode 数据目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/hadoop/data/datanode</value>
<description>DataNode 数据目录</description>
</property>
</configuration>
③ mapred-site.xml
xml
<!-- etc/hadoop/mapred-site.xml -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>使用 YARN 作为资源管理器</description>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
④ yarn-site.xml
xml
<!-- etc/hadoop/yarn-site.xml -->
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>NodeManager 上运行的附属服务</description>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
<description>ResourceManager 主机名</description>
</property>
</configuration>
✅ 创建数据目录:
bash
mkdir -p /opt/hadoop/tmp
mkdir -p /opt/hadoop/data/namenode
mkdir -p /opt/hadoop/data/datanode
4.4 Hadoop 的运行模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Local (Standalone) Mode | 默认模式,无守护进程,使用本地文件系统 | 调试 MapReduce 程序 |
| Pseudo-Distributed Mode | 单机模拟集群,每个组件独立进程(NameNode, DataNode, ResourceManager 等) | 学习、开发测试 |
| Fully Distributed Mode | 多台机器组成集群,生产环境使用 | 生产部署 |
五、综合案例1:单机模式的大数据项目实践
5.1 案例概述
在**单机模式(Standalone)**下运行 Hadoop 自带的 WordCount 示例,无需启动 HDFS/YARN,直接读写本地文件。
优点:快速验证 MapReduce 逻辑缺点:无分布式特性
5.2 案例详解
✅ 步骤1:准备输入文件
bash
mkdir -p ~/hadoop_input
echo "Hello World Hello Hadoop" > ~/hadoop_input/file1.txt
echo "Hello Big Data World" > ~/hadoop_input/file2.txt
✅ 步骤2:运行 Hadoop 自带 WordCount 示例
bash
# 使用 hadoop jar 命令运行示例程序
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar \
wordcount \
~/hadoop_input \
~/hadoop_output
# 查看结果
cat ~/hadoop_output/part-r-00000
✅ 输出示例:
Big 1
Data 1
Hadoop 1
Hello 3
World 2
✅ 关键语法说明:
hadoop jar <jar路径> <主类或程序名> <参数1> <参数2>wordcount是 hadoop-mapreduce-examples 中的程序名- 输入路径:本地文件系统路径
- 输出路径:必须不存在,否则报错
✅ 清理输出目录(重新运行前):
bash
rm -rf ~/hadoop_output
六、综合案例2:伪分布模式的大数据项目实践
6.1 案例概述
在**伪分布模式(Pseudo-Distributed)**下运行 WordCount,启动 HDFS 和 YARN,数据存储在 HDFS,计算由 YARN 调度。
真实模拟分布式环境,适合学习和调试。
6.2 案例详解
✅ 步骤1:格式化 NameNode(首次运行必须)
bash
hdfs namenode -format
✅ 步骤2:启动 HDFS
bash
start-dfs.sh
✅ 步骤3:启动 YARN
bash
start-yarn.sh
✅ 步骤4:验证进程
bash
jps
✅ 应看到以下进程(顺序可能不同):
NameNode
DataNode
SecondaryNameNode
ResourceManager
NodeManager
Jps
✅ 步骤5:在 HDFS 上创建目录并上传文件
bash
# 创建 HDFS 目录
hdfs dfs -mkdir -p /user/$(whoami)/input
# 上传本地文件
hdfs dfs -put ~/hadoop_input/* /user/$(whoami)/input/
# 查看 HDFS 文件
hdfs dfs -ls /user/$(whoami)/input
✅ 步骤6:运行 WordCount(读写 HDFS)
bash
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar \
wordcount \
/user/$(whoami)/input \
/user/$(whoami)/output
# 查看结果
hdfs dfs -cat /user/$(whoami)/output/part-r-00000
✅ 步骤7:访问 Web UI(浏览器访问)
- NameNode: http://localhost:9870
- ResourceManager: http://localhost:8088
✅ 步骤8:停止服务
bash
stop-yarn.sh
stop-dfs.sh
✅ 完整脚本
run_pseudo_wordcount.sh(带注释):
bash
#!/bin/bash
# run_pseudo_wordcount.sh - 伪分布模式 WordCount 全流程脚本
echo "🔄 正在格式化 NameNode..."
hdfs namenode -format
echo "🚀 启动 HDFS..."
start-dfs.sh
echo "🚀 启动 YARN..."
start-yarn.sh
echo "✅ 验证 Hadoop 进程..."
jps
echo "📂 在 HDFS 上创建输入目录..."
hdfs dfs -mkdir -p /user/$(whoami)/input
echo "📤 上传本地文件到 HDFS..."
hdfs dfs -put ~/hadoop_input/* /user/$(whoami)/input/
echo "📋 查看 HDFS 文件列表..."
hdfs dfs -ls /user/$(whoami)/input
echo "🧮 运行 WordCount MapReduce 作业..."
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar \
wordcount \
/user/$(whoami)/input \
/user/$(whoami)/output
echo "📥 下载结果到本地(可选)..."
hdfs dfs -get /user/$(whoami)/output ~/hadoop_output_hdfs
echo "📊 查看最终结果..."
cat ~/hadoop_output_hdfs/part-r-00000
echo "🌐 访问 Web UI:"
echo " - NameNode: http://localhost:9870"
echo " - ResourceManager: http://localhost:8088"
echo "🛑 停止 Hadoop 服务..."
stop-yarn.sh
stop-dfs.sh
echo "🎉 伪分布模式 WordCount 执行完毕!"
✅ 赋予执行权限并运行:
bash
chmod +x run_pseudo_wordcount.sh
./run_pseudo_wordcount.sh
✅ Hadoop 开发与运维最佳实践
- 环境隔离 :使用独立用户(如
hadoop)运行服务 - 目录权限:确保 Hadoop 目录可读写
- 日志查看 :
$HADOOP_HOME/logs/下查看错误日志 - 端口冲突:确保 9870、8088、9000 等端口未被占用
- 防火墙 :开发环境可临时关闭
sudo systemctl stop firewalld - 内存配置 :伪分布模式可修改
yarn-site.xml限制内存避免 OOM - 定期清理:删除 HDFS 临时文件和本地 tmp 目录
📚 附录:常用命令与配置速查
| 功能 | 命令/配置 |
|---|---|
| 格式化 NameNode | hdfs namenode -format |
| 启动 HDFS | start-dfs.sh |
| 启动 YARN | start-yarn.sh |
| 停止 HDFS | stop-dfs.sh |
| 停止 YARN | stop-yarn.sh |
| 查看进程 | jps |
| HDFS 上传文件 | hdfs dfs -put local_path hdfs_path |
| HDFS 查看文件 | hdfs dfs -cat hdfs_path |
| 运行 WordCount | hadoop jar ... wordcount input output |
| Web UI | NameNode:9870, ResourceManager:8088 |
| 核心配置文件 | core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml |
🧩 综合项目扩展建议
- 自定义 MapReduce 程序:统计访问日志中 IP 访问次数
- Hive 集成:在 Hadoop 上安装 Hive,用 SQL 分析数据
- Spark 替代:用 PySpark 实现相同 WordCount,对比性能
- 完全分布式部署:在 3 台 CentOS 虚拟机上搭建集群
- 数据可视化:将结果导入 MySQL + 用 Python matplotlib 展示
这份文档覆盖了 CentOS Stream 9 上 大数据开发的全部核心知识点 + 语法细节 + 配置说明 + 实用案例 + 综合项目,所有命令和代码均含详细注释,可直接用于教学、自学或生产环境参考。