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

相关推荐
艾莉丝努力练剑43 分钟前
时光织网:基于Rokid AI眼镜的家庭智能协同中枢设计与实现
大数据·人工智能·kotlin·rokid
jiayong232 小时前
Elasticsearch 完全指南:原理、优势与应用场景
大数据·elasticsearch·搜索引擎
雪兽软件2 小时前
2025 年 15 大大数据技术:从 Hadoop 到 BigQuery 及其他
大数据·大数据技术
TDengine (老段)3 小时前
TDengine 时间函数 WEEK 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
xieyan08114 小时前
选股中的财务指标运用_ROE_PE_PB...
大数据·人工智能
颜子鱼5 小时前
git基础
大数据·git·elasticsearch
乌恩大侠7 小时前
AI-RAN 在 Spark上部署 Sionna-RK
大数据·分布式·spark
G皮T9 小时前
【ELasticsearch】索引字段设置 “index”: false 的作用
大数据·elasticsearch·搜索引擎·全文检索·索引·index·检索
程序员皮皮林12 小时前
Redis:大数据中如何抗住2000W的QPS
大数据·数据库·redis