CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 中大数据 —语法详解与实战案例(15)

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

分布式计算模型,分两个阶段:

  1. Map 阶段:对输入数据进行"分而治之",输出 <key, value> 对
  2. 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(浏览器访问)

✅ 步骤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 开发与运维最佳实践

  1. 环境隔离 :使用独立用户(如 hadoop)运行服务
  2. 目录权限:确保 Hadoop 目录可读写
  3. 日志查看$HADOOP_HOME/logs/ 下查看错误日志
  4. 端口冲突:确保 9870、8088、9000 等端口未被占用
  5. 防火墙 :开发环境可临时关闭 sudo systemctl stop firewalld
  6. 内存配置 :伪分布模式可修改 yarn-site.xml 限制内存避免 OOM
  7. 定期清理:删除 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

🧩 综合项目扩展建议

  1. 自定义 MapReduce 程序:统计访问日志中 IP 访问次数
  2. Hive 集成:在 Hadoop 上安装 Hive,用 SQL 分析数据
  3. Spark 替代:用 PySpark 实现相同 WordCount,对比性能
  4. 完全分布式部署:在 3 台 CentOS 虚拟机上搭建集群
  5. 数据可视化:将结果导入 MySQL + 用 Python matplotlib 展示

这份文档覆盖了 CentOS Stream 9 上 大数据开发的全部核心知识点 + 语法细节 + 配置说明 + 实用案例 + 综合项目,所有命令和代码均含详细注释,可直接用于教学、自学或生产环境参考。

相关推荐
第二层皮-合肥2 小时前
50天学习FPGA第21天-verilog的时序与延迟
学习·fpga开发
石像鬼₧魂石2 小时前
Hydra 弱口令爆破的详细命令模板
linux·windows·学习·ubuntu
Cat God 0072 小时前
CentOS 搭建 SFTP 服务器(三)
服务器·python·centos
txzz88882 小时前
CentOS-Stream-10 系统安装之SELINUX关闭
linux·运维·centos·selinux
..Move...2 小时前
云原生运维企业级实战项目:CentOS Stream 8 下 Nginx 高可用集群部署
运维·云原生·centos
Cat God 0072 小时前
CentOS 搭建 SFTP 服务器(二)
服务器·centos·numpy
lhyzws2 小时前
CENTOS上的网络安全工具(三十三) Portainer Kafka-Clickhouse部署(2)
linux·运维·centos
Jackyzhe2 小时前
Flink源码阅读:如何生成JobGraph
大数据·flink
暗然而日章2 小时前
C++基础:Stanford CS106L学习笔记 9 类模板(Class Templates)
c++·笔记·学习