openEuler入门学习教程,从入门到精通,openEuler 24.03 环境下 Hadoop 全面实践指南(19)

大数据 ------ 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 访问(可选)

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 等组件打下坚实基础。

相关推荐
大大大大晴天4 小时前
每天认识一个组件:数据治理Apache Atlas
大数据
数字新视界4 小时前
2026模块化机房选型指南:行业市场发展趋势、占有率与竞争梯队分析报告解析
大数据·人工智能·物联网·数据中心·微模块机房·模块化机房·冷通道
姜穆澜6 小时前
OneID 从 0 到 1 完整生产案例(四)
大数据
OsDepK7 小时前
项目快速Git至仓库(完整版)
大数据·git·elasticsearch·搜索引擎
合米AI SOP系统7 小时前
传统产线如何快速上马落地 AI 防错?合米科技 AI SOP 7天即可上线。
大数据·人工智能·科技
思录Echo7 小时前
什么决定具身智能的最终走向?多技术路线与落地现实辨析
大数据·人工智能
xiaohaiAIgeo8 小时前
【2026年】AI监控加行为分析守护实验室安全
大数据·人工智能·科普知识
林墨聊AIGC8 小时前
动漫AI视频创作工具在哪找到的?2026年最新动漫AI视频平台与软件指南
大数据·人工智能·ai作画·aigc·音视频
故七月9 小时前
告别 AI 时代品牌 “隐身”:万域智瞰 AI‑GEO,构建品牌大模型时代营销新基建
大数据·人工智能
数字孪生视频孪生11 小时前
三维实时重构异构底座 核工危化无感定位跨境轨迹一屏统揽
大数据·运维·人工智能·重构·架构