代码改变世界

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

2026-01-13 09:37  tlnshuju  阅读(3)  评论(0)    收藏  举报

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 常用命令:

# 查看文件列表
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

✅ 示例:上传并查看文件

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 代码结构(简化版):

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:

# 安装 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 服务:

sudo dnf install openssh-server openssh-clients -y
sudo systemctl enable sshd
sudo systemctl start sshd

✅ 配置无密码 SSH 登录本机:

# 生成密钥对(一路回车)
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

✅ 验证:

ssh localhost 'echo "SSH 无密码登录成功!"'

四、安装、配置 Hadoop 环境


4.1 下载 Hadoop 安装包

✅ 从 Apache 官网下载(推荐 3.3.6)

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

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

✅ 验证:

hadoop version

4.3 配置 Hadoop 核心文件(伪分布模式)

所有配置文件位于:$HADOOP_HOME/etc/hadoop/

① core-site.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
<!-- 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
<!-- 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
<!-- 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>

✅ 创建数据目录:

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:准备输入文件

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 示例

# 使用 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 中的程序名
  • 输入路径:本地文件系统路径
  • 输出路径:必须不存在,否则报错

✅ 清理输出目录(重新运行前):

rm -rf ~/hadoop_output

六、综合案例2:伪分布模式的大数据项目实践


6.1 案例概述

在**伪分布模式(Pseudo-Distributed)**下运行 WordCount,启动 HDFS 和 YARN,数据存储在 HDFS,计算由 YARN 调度。

真实模拟分布式环境,适合学习和调试。


6.2 案例详解

✅ 步骤1:格式化 NameNode(首次运行必须)

hdfs namenode -format

✅ 步骤2:启动 HDFS

start-dfs.sh

✅ 步骤3:启动 YARN

start-yarn.sh

✅ 步骤4:验证进程

jps

✅ 应看到以下进程(顺序可能不同):

NameNode
DataNode
SecondaryNameNode
ResourceManager
NodeManager
Jps

✅ 步骤5:在 HDFS 上创建目录并上传文件

# 创建 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)

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:停止服务

stop-yarn.sh
stop-dfs.sh

✅ 完整脚本 run_pseudo_wordcount.sh(带注释):

#!/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 执行完毕!"

✅ 赋予执行权限并运行:

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 目录

附录:常用命令与配置速查

功能命令/配置
格式化 NameNodehdfs namenode -format
启动 HDFSstart-dfs.sh
启动 YARNstart-yarn.sh
停止 HDFSstop-dfs.sh
停止 YARNstop-yarn.sh
查看进程jps
HDFS 上传文件hdfs dfs -put local_path hdfs_path
HDFS 查看文件hdfs dfs -cat hdfs_path
运行 WordCounthadoop jar ... wordcount input output
Web UINameNode: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 上 大数据开发的全部核心知识点 + 语法细节 + 配置说明 + 实用案例 + 综合项目,所有命令和代码均含详细注释,可直接用于教学、自学或生产环境参考。