李翔-大数据技术

Big data technology!

第03章 Hadoop完全分布式集群

Hadoop完全分布式集群


一、Hadoop基础知识

1.1 hadoop是什么?

情境导入: “全球每天产生的数据量:一天就有 402 百万 TB的新数据诞生,等于数百亿个 GB!而在常用的短视频、购物、弹幕平台上,就可能每天产生 TB 到 PB 级别的数据。像 B站一个小时就要处理 700 GB 的数据,淘宝的用户因收藏商品“写入数据库”一天就有 数千万次写入

Hadoop 是由 Apache 软件基金会 所主导的一个 开源软件框架,用来存储和处理海量数据的分布式大数据平台

简单来说,Hadoop 让我们可以像用一台电脑一样使用上百台服务器来存储和处理大数据。

大数据的特点:数据量大(TB、PB级)、类型多(文本、图片、视频)、增长快。

Hadoop 作用:

  • 分布式存储:像仓库一样,把大文件分成小块,分开放在很多机器上存储。

  • 分布式计算:让多台机器一起算数据,速度快,效率高。


hadoop核心组件

  • HDFS(分布式文件存储系统):解决海量数据存储

  • YARN(集群资源管理和任务调度框架):解决资源、任务调度

  • MapReduce(分布式计算框架):解决海量数据计算

hadoop架构

img

image-20250809103636875


1.2 hadoop工作流程

简化的工作流程

  1. 用户把大文件上传到 HDFS(文件被切块并存储到多个 DataNode)。

  2. 提交计算任务给 YARN。

  3. YARN 找合适的机器运行 MapReduce 程序。

  4. MapReduce 处理数据块 → 输出结果到 HDFS。


Hadoop 的典型工作流程分为以下六步:


① 数据写入:HDFS 负责存储数据

  • 用户将数据上传到 HDFS,系统会自动将文件切分为多个块,并复制到不同节点,确保数据安全与高效访问。


② 客户端提交作业

  • 用户通过客户端提交作业(如 MapReduce 或 Spark),指定输入数据、执行逻辑和输出位置。


③ YARN 分配资源与调度任务

  • YARN 接收作业请求,负责:

    • 资源调度(ResourceManager)

    • 任务执行管理(NodeManager)

  • 系统会根据任务所需的 CPU、内存等资源情况,将任务合理调度到最合适的节点执行。


④ 作业执行

  • 执行引擎(如 MapReduce 或 Spark)对数据进行并行处理。


⑤ 输出结果写回 HDFS

  • 作业的输出结果通常会写入 HDFS,便于后续分析和长期保存。


⑥ 客户端获取结果

  • 用户可通过客户端或其他工具,从 HDFS 中读取并查看最终分析结果。

Hadoop 工作流程总结:

数据上传 → 客户端提交任务 → YARN调度 → MapReduce/Spark执行 → 写入HDFS → 客户端读取结果

示例:某电商公司分析用户访问日志,找出最热门商品

✅ 背景:

某电商平台每天会生成上百 GB 的访问日志文件,记录了用户浏览商品、点击、下单等行为。公司希望找出每天访问最多的前 10 个商品,用于推荐优化。


✅ 对应 Hadoop 工作流程举例:

流程阶段实例操作说明
1. 数据上传(HDFS)采集到的访问日志文件 access_log_20250729.txt 通过命令 hdfs dfs -put 上传到 HDFS 的 /logs/ 目录。
2. 客户端提交任务数据分析员在客户端通过 Spark 脚本(或 MapReduce 程序)提交一个作业,用于统计每个商品的浏览次数: spark-submit hot_products.py
3. YARN 资源调度YARN 接收到 Spark 提交的任务后,ResourceManager 分配集群中空闲节点资源,并在多个节点上启动 Executor 去执行任务。
4. Spark 执行任务Spark 程序读取 /logs/access_log_20250729.txt 文件,对每条记录解析,提取 product_id 字段,统计浏览次数,排序取前 10 名。
5. 写入 HDFSSpark 程序将最终的热门商品分析结果写入到 /output/top10_products_20250729/ 目录。
6. 客户端读取结果数据分析员通过命令 hdfs dfs -cat /output/top10_products_20250729/part-00000 查看分析结果,导出为 CSV 给运营部门。


1.3 hadoop核心组件介绍

1.3.1 HDFS:Hadoop 分布式文件系统

一、HDFS 是什么?

  • 文件切分:大文件被切成一个个数据块(默认 128MB)。

  • 副本机制:每个数据块存三份(默认副本数=3),放在不同机器上,保证坏一台机器也不丢数据。

  • 角色分工

    • NameNode(主节点):存文件目录结构(相当于货物清单,标注货在哪)

    • DataNode(数据节点):实际存数据块(相当于仓库里的货架)

项目内容
全称Hadoop Distributed File System(Hadoop 分布式文件系统)
作用为大数据处理提供可靠、高吞吐量的分布式存储系统
特点将大文件切块存储到多个节点上,支持副本机制、容错恢复、并行访问


二、HDFS 架构及角色

HDFS 采用 Master / Slave 主从架构,主要包含以下组件:

组件名称角色说明
🔹 HDFS Client提交数据读写请求的客户端工具或程序接口
🔹 NameNode(主节点)管理元数据(文件路径、块位置等),不存储实际数据
🔹 DataNode(从节点)存储实际数据块,执行读/写操作
🔹 Secondary NameNode(辅助节点)定期合并元数据快照与日志,减轻 NameNode 负担,不是备份节点

典型结构:1 个 NameNode + 多个 DataNode

img


三、数据存储机制

1. 文件切块(Block)

  • 大文件上传时会被切分成多个数据块(默认大小 128MB);

  • 每个块分布在不同的 DataNode 上,支持并行处理

2. 多副本机制

  • 每个数据块默认生成 3 个副本,分别分布在不同节点;

  • 提高了数据的可靠性容错性

  • 可通过配置修改副本数量。

3. 副本放置策略(默认):

副本编号放置策略
第一个副本客户端上传节点或随机 DataNode
第二个副本不同机架的其他节点
第三个副本与第二个副本同机架但不同节点


四、核心组件职责

NameNode(主节点)

  • 是 HDFS 的“调度大脑”,管理所有元数据信息;

  • 指引客户端访问数据块所在的 DataNode;

  • 不直接参与数据传输;

  • 元数据存储在内存 + 磁盘(FsImage + EditLog)。

DataNode(从节点)

  • 存储数据块(Block);

  • 接收客户端的读写请求;

  • 每 3 秒发送一次“心跳”给 NameNode 报告健康状态;

  • 如果心跳中断超过 10 分钟,视为该节点丢失,系统会触发副本重建。

Secondary NameNode(辅助节点)

  • 定期从 NameNode 拉取 FsImageEditLog

  • 合并为新的 FsImage,并传回 NameNode;

  • 用于减小日志文件体积,加快 NameNode 重启恢复速度

  • ⚠️ 并不能在 NameNode 宕机时接管工作。


五、元数据与 FsImage / EditLog 解释

名称简明解释比喻
FsImage文件系统的完整快照,记录文件结构、权限、块分布等全家福照片
EditLog每次文件增删改等操作的变更日志日常流水账
内存元数据FsImage + EditLog 组合恢复后,存于 NameNode 内存中大脑中的实时信息

📌 NameNode 重启时:

先加载 FsImage,再“重放” EditLog,最终恢复到最新状态。


六、为什么需要 Secondary NameNode?

  • EditLog 不断增长会导致 NameNode 启动变慢;

  • Secondary NameNode 定期将 EditLog 应用到 FsImage,合并后生成新快照;

  • 减小 EditLog 大小,提升系统性能和恢复速度;

  • 是“日志合并器”而非“备用节点”。


七、HDFS 优势小结

特性说明
切块存储支持大文件分布式存储
多副本容错自动副本机制保障数据可靠性
自动恢复节点故障可自动补充数据副本
可扩展性强支持水平扩展,新增节点即可扩容
高吞吐量并发读写能力强,适合大数据批处理


一句话总结

HDFS 把文件切成多个块,分散存储在 DataNode 上,由 NameNode 统一管理元数据,并通过 Secondary NameNode 协助维护快照与日志,确保数据安全、高效、可恢复。



HDFS的写数据流程

image-20220927083127624

  1. 客户端请求上传文件:客户端通过DistributedFileSystem模块向NameNode发送请求,问是否可以上传文件,并检查文件和目录是否存在。

  2. NameNode确认NameNode检查完后,告诉客户端是否可以上传文件。

  3. 客户端请求存储第一个块(Block):客户端将文件拆成块,第一个块大小为0-128MB。它向NameNode询问存储这个块的DataNode节点。

  4. NameNode返回节点信息NameNode选择3个可用的DataNode(例如,dn1dn2dn3)来存储这个块,并把它们的地址告诉客户端。

  5. 建立通信管道:客户端通过FSDataOutputStream模块将数据发送到第一个节点(dn1),然后dn1继续和dn2通信,dn2再联系dn3,完成数据传输通道的建立。

  6. 确认通信成功dn1dn2dn3逐级向客户端确认它们已准备好接收数据。

  7. 数据传输:客户端开始向dn1发送数据块,数据被分成多个小包(Packet),每个Packet大小为64KB。dn1接收到Packet后,立即传给dn2dn2再传给dn3。每发送一个Packet,dn1会放到队列中,等待收到响应确认。

  8. 传输完成:当一个块的传输完成后,客户端会向NameNode请求存储下一个块,并重复上述过程,直到所有数据块传输完成。

Packet的定义

  • Packet:HDFS并不会一次性传输整个数据块,而是将一个数据块拆分成更小的单位来传输,这个单位就是Packet。这样做可以减少网络负载并提高传输的稳定性。

  • Packet大小:在HDFS中,默认每个Packet的大小为64KB


HDFS的读数据流程

image-20220927083450102

  1. 客户端请求下载文件:客户端通过DistributedFileSystemNameNode发送请求,NameNode查询文件的元数据,找到文件的数据块存储在哪些DataNode节点上。

  2. 选择合适的DataNode:客户端根据就近原则选择一个最近的DataNode节点,并向它请求读取数据。

  3. DataNode传输数据DataNode从磁盘读取文件块,将数据分成多个小包(Packet),并逐个传输给客户端。同时,每个Packet都会进行校验,确保数据在传输过程中没有损坏。

  4. 客户端接收数据:客户端以Packet为单位接收数据,首先存储在本地缓存中,随后写入到目标文件,直到整个文件下载完成。


HDFS 的读写数据流程总结

数据写入流程

  1. 客户端请求:用户通过客户端向 HDFS 发送写入数据的请求。

  2. 数据分块:HDFS 将文件分成多个块(默认 128MB)。

  3. 副本分配:每个数据块被复制到多个 DataNode(通常是 3 个)上,以确保数据安全。

  4. 数据写入:客户端将数据块发送到第一个 DataNode,DataNode 依次将副本传递给其他 DataNode。

  5. 确认写入:所有副本写入成功后,客户端收到写入完成的确认。

数据读取流程

  1. 客户端请求:用户通过客户端向 HDFS 发送读取数据的请求。

  2. 定位数据块:NameNode 告诉客户端数据块所在的 DataNode。

  3. 数据读取:客户端直接从 DataNode 读取数据块。

  4. 合并数据:客户端将读取的数据块合并,返回给用户。


1.3.2 MapReduce

MapReduce定义

  • MapReduce作为大数据生态圈第一代分布式计算引擎

  • MapReduce是采用一种分而治之的思想设计出来的分布式计算框架

    • 如一项复杂的计算任务,单台服务器无法胜任时,可将此大任务切分成一个个小的任务,分别交给不同的服务器上并行执行,最终再汇总每个小任务的结果

  • MapReduce的分布式计算框架分为两个阶段:

    第一个Map【映射】阶段     (Map负责“分”:把一个任务切分成多个任务,分发给不同机器处理。

    第二个Reduce【规约】阶段reduce负责“合”:汇总分解后多任务的结果


image-20220918123042914

MapReduce并行计算

  • HDFS存储数据时对大于128M的数据会进行数据切分,每128M一个数据块,数据块会分散、分布存储到HDFS。

  • MapReduce在进行计算前会复制计算程序,每个数据块会分配一个独立的计算程序副本(MapTack)。计算时多个数据块几乎同时被读取并计算,但是计算程序完全相同。最终将各个计算程序计算的结果进行汇总(Reduce来汇总)

image-20220920085956446


MapReduce流程

WordCount案例运行和详解

img



理解 MapReduce:大数据并行处理的核心机制


🎓 类比:你是班长,要统计全班成绩

假设你是一个班长,需要统计全班同学的总成绩。你有两种方式可以完成:

方法类比 MapReduce 模型
一个人自己统计相当于:1个 Mapper + 1个 Reducer,所有工作都集中在一个人身上
分组统计再汇总相当于:多个 Mapper + 多个 Reducer,大家分工合作,效率更高


MapReduce 是什么?

MapReduce 是 Hadoop 提供的一种分布式并行计算模型,适合处理海量数据。它将任务拆成两个阶段:

阶段作用类比
Map将原始数据拆分并提取有用信息每位学生报上成绩
Reduce对具有相同 key 的数据进行汇总小组组长统计小组总成绩
(中间的 Shuffle)系统将同一个 key 的数据发送到同一个 reducer将相同任务交给对应的人处理


实际应用案例:统计文章中每个单词出现次数

假设你要统计一篇文章中每个单词出现的次数,MapReduce 的执行流程如下:


第1阶段:Map(映射)

  • 输入:文本行,如 "Hello Hadoop Hello BigData"

  • 操作:切词 → 生成键值对

  • 输出:

    ("Hello", 1)
    ("Hadoop", 1)
    ("Hello", 1)
    ("BigData", 1)

第2阶段:Shuffle(洗牌)

  • 系统会自动将相同 key 的数据发送到同一个 reducer,并进行排序归组

  • 结果变为:

    "BigData" → [1]
    "Hadoop"  → [1]
    "Hello"   → [1, 1]

第3阶段:Reduce(归约)

  • 每个 reducer 接收一个 key 和对应的值列表

  • 执行汇总操作,比如求和

  • 输出:

    ("BigData", 1)
    ("Hadoop", 1)
    ("Hello", 2)

一句话总结

MapReduce 是一种“先拆分、再归并”的大数据计算模型,先用 Mapper 提取信息,再由 Reducer 汇总数据,适合大规模离线批处理任务。



1.3.3 Yarn

YARN(Yet Another Resource Negotiator)是 Hadoop 的资源管理与作业调度框架

核心职责是:统一管理集群资源 + 安排任务在合适的节点上运行

YARN 的核心组成

组件名称作用说明
🟩 ResourceManager(资源管理器)管理集群全局资源,决定哪台机器做什么任务
🟦 NodeManager(节点管理器)管理当前节点的资源状态,执行 ResourceManager 分配的任务
🟨 Container(容器)用于运行具体任务的资源打包单元(包括 CPU、内存等)

容器 Container 是什么?

  • 是 YARN 中分配任务资源的最小执行单位

  • 每个 container 包含:

    • 一定量的 CPU 核心数

    • 内存(MB)

    • 任务运行环境(如 JVM)

每个任务都会被封装进一个 container 中在 NodeManager 上运行。


通俗解释

  • ResourceManager(总管)

    • 分配资源(如 CPU、内存);

    • 接收应用任务请求(如 Spark、MapReduce);

    • 按公平/容量策略将任务分配给合适节点;

    • 负责整个集群的“总调度”:

      类比:就像一个管控整个班级作业分配的大班长

  • NodeManager(小组组长)

    • 向 ResourceManager 汇报资源状态;

    • 启动任务容器并监控运行状态;

    • 一旦任务异常,汇报给 ResourceManager 处理;

    • 每台服务器上都运行一个 NodeManager,职责包括:

      类比:每个小组的组长,负责管理本组资源与工作执行情况


通俗理解 YARN:一次作业是怎么执行的?

  1. 用户提交应用程序(如 MapReduce 或 Spark);

  2. ResourceManager 接收请求,根据资源情况选择某个 NodeManager 来启动“ApplicationMaster”;

  3. ApplicationMaster 再向 ResourceManager 申请执行任务所需的资源;

  4. ResourceManager 将多个 container 分发到合适的 NodeManager;

  5. NodeManager 启动 container,任务运行;

  6. 任务完成后资源被释放。


总结一句话:

YARN 就像一个“智慧调度中心”,由 ResourceManager 统筹分配资源,NodeManager 管理每台机器的任务执行,让集群像一支高效协作的团队。


1.4 hadoop优点

  1. 高可靠

    • 多副本机制(默认3份),节点宕机数据不丢。

    • 任务失败自动重试,保障作业完成。

  2. 高扩展

    • 可随时加机器扩容,支持几台到上千台集群。

  3. 高效率

    • 并行处理,任务就近计算,减少网络传输。

  4. 高容错

    • 节点故障自动切换副本,数据处理不中断。

  5. 低成本

    • 开源免费,可用普通服务器,跨平台运行。


1.5 Hadoop 生态圈

Hadoop 生态圈是指围绕 Hadoop 软件框架为核心而出现的越来越多的相关软件框架,这些软件框架和 Hadoop 框架一起构成了一个生机勃勃的 Hadoop 生态圈。

image-20220918123108516


Hadoop 生态圈的架构

  1. Hadoop Common: 是 Hadoop 生态系统中的基础设施,提供了各个模块通用的工具和库。

  2. HDFS(Hadoop 分布式文件系统): Hadoop 的基石,用于存储和管理大规模数据的分布式文件系统。

  3. YARN: 统一资源管理和调度平台,负责集群中的资源分配和任务调度。

  4. MapReduce: 分布式计算的编程模型,适用于大规模数据的批处理操作。

  5. Spark 开源的大数据内存计算框架,支持基于Hadoop上存储的大数据进行计算。

  6. Flink 开源的大数据内存计算框架,主要用于实时计算场景。

  7. HBase 分布式、面向列族的数据库,建立在Hadoop HDFS之上,用于存储非结构化数据。

  8. Hive 基于Hadoop的数据仓库工具,提供类SQL语法查询功能,可以将结构化的数据文件映射为数据库表。

  9. Pig: 用于大型数据集分析和评估的工具,类似于Hive。

  10. Impala: 交互式SQL查询工具,类似于Hive,可对存储在HDFS、HBase中的数据执行查询。

  11. Mahout: 机器学习和数据挖掘库,实现经典的机器学习算法。

  12. Flume 高可用、高可靠的分布式日志采集框架。

  13. Sqoop: 开源工具,用于Hadoop、Hive与传统数据库之间的数据传递,支持数据导入导出。

  14. Kafka 高吞吐量的分布式发布/订阅消息系统。

  15. ZooKeeper 针对大型分布式系统的可靠协调系统,提供配置维护、名字服务、分布式同步、组服务功能。


离线大数据处理系统

image-20220918123128640


二、Hadoop 的运行模式

2.1 单机模式

概念: Hadoop 的最简单运行模式,适合用来开发和调试程序,不需要搭建集群。

特点:

  • 默认模式:安装完 Hadoop 后不修改配置,即为单机模式。

  • 使用本地文件系统:不使用 HDFS。

  • 不启动守护进程:如 NameNode、DataNode 等都不会运行。

  • Map 和 Reduce 在一个进程中执行:不会分发任务,全部本地完成。

  • 适用场景:用于检查 MapReduce 程序逻辑是否正确,是写代码初期的最佳选择。

类比理解: 就像你一个人完成一份工作报告,不分工、不联网,自己读数据、处理数据、输出结果,快速又简单。


2.2 伪分布模式

概念: 伪分布式模式是 Hadoop 的模拟集群模式所有服务运行在一台机器上,但彼此以独立进程的方式通信,模拟真实分布式环境。

特点:

  • 运行在单台机器上:使用本机模拟多个 Hadoop 节点。

  • 使用 HDFS 文件系统:数据不再存在本地,而是以块的形式存储在 HDFS 中。

  • 守护进程全部启动:包括 NameNode、DataNode、ResourceManager、NodeManager 等。

  • 任务以分布式方式调度和执行:Map 和 Reduce 任务会以不同进程在本机调度运行。

  • 适用场景:适合学习 Hadoop 架构、调试集群运行机制,是连接单机模式和真正分布式集群的重要过渡。

类比理解: 就像你一个人扮演多个角色(老师、学生、班长),虽然是同一个人操作,但每个角色独立完成自己的任务,模拟真实团队协作的感觉。


2.3 完全分布式模式

概念: 完全分布式模式是 Hadoop 的正式运行模式,将各个功能角色分布在多台机器上,组成真正的集群系统,适用于大数据的真实生产环境。

特点:

  • 多台机器组成集群:每台机器承担不同角色(如 Master、Slave)。

  • 各节点之间通过网络通信:任务调度、数据传输等都通过网络完成。

  • 使用 HDFS 分布式文件系统:数据以块形式存储在多个 DataNode 上,并保持副本。

  • 资源调度由 YARN 完成:ResourceManager 和 NodeManager 分布在不同节点上,支持多任务并发执行。

  • 具备完整的分布式特性:真正实现高并发、高容错、大规模数据存储与处理。

  • 适用场景:企业生产环境、大数据分析项目、真实业务场景部署。

类比理解: 就像一个完整的班级,每个同学(节点)分工明确、互相协作,班长(NameNode)负责组织管理,组长(NodeManager)分配小组任务,大家通过网络配合完成整体工作。


与其他模式对比总结:

模式所需机器数是否使用 HDFS是否具备分布式能力应用场景
单机模式1 台程序开发调试
伪分布式模式1 台部分(模拟)学习与测试
完全分布式模式多台是(真正分布式)企业生产环境


总结: 完全分布式模式是 Hadoop 的最终部署方式,通过多台机器协同工作,实现对海量数据的高效处理、存储与分析,是真正的大数据平台基础架构


三、完全分布式的部署

3.1 前期准备

准备工作:

  • 前期在VM中安装好一台CentOS7虚拟机,主机名为master,并且已实现下面的配置;

    • 关闭防火墙

    • 配置了静态IP

    • 成功连接Finalshell

软件准备:


3.2 克隆两台主机

# 如果master主机处于开机状态,先关机
init 0      # 如果是重启则命令为:init 6

3.2.1 master主机克隆两台机器slave1,slave2

image-20250731164551728

image-20250731164657732

image-20250731164750048

image-20250731164910648

3.2.2 分别更改两台克隆机的静态IP

# 分别登录两台克隆机
# 切换用户:root
# 口   令:123456

vi /etc/sysconfig/network-scripts/ifcfg-ens33
------------------------------------------------
# 在slave1,slave2上操作,分别更改如下信息:
IPADDR=192.168.36.101       # 修改slave1
IPADDR=192.168.36.102       # 修改slave2

3.2.3 分别更改两台克隆机的主机名

vi /etc/hostname
# 在slave1,slave2上操作,分别更改如下信息:
slave1
slave2

3.2.4 重启两台克隆机

3.2.5 slave1与slave2分别连接Finalshell


3.3 在master主机上安装jdk和hadoop

说明:在 /opt下创建两目录:apps放置解压文件,software放置压缩文件。

3.3.1 创建两个文件夹

cd /opt/
mkdir apps
mkdir software

3.3.2 复制、解压安装文件

先把jdk-8u271-linux-x64.tar.gzhadoop-3.1.3.tar.gz复制到/opt/software目录中

# 安装Jdk 和 Hadoop
cd /opt/software
tar zxvf jdk-8u271-linux-x64.tar.gz -C /opt/apps/    # 大写C ,指定解压路径
tar zxvf hadoop-3.1.3.tar.gz -C /opt/apps/

3.3.3 更改文件名

cd /opt/apps/
mv jdk1.8.0_271/  jdk
mv hadoop-3.1.3/  hadoop


3.3.4 添加环境变量

配置目的:可以在任何的路径运行hadoop与jdk

# 在master上操作
vi /etc/profile  # 全局环境变量配置文件

将下面 环境变量配置 插入到 /etc/profile 文件中的 末尾处(在 unset i 之后)

# Java 安装路径
export JAVA_HOME=/opt/apps/jdk
# Hadoop 安装路径
export HADOOP_HOME=/opt/apps/hadoop
# 添加 Java 和 Hadoop 命令到系统路径
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

使配置生效:

# 在master上操作
source /etc/profile

# 查看本机的PATH路径
echo $PATH
# 查看结果
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/apps/jdk/bin:/opt/apps/hadoop/bin:/opt/apps/hadoop/sbin


3.3.5 查看版本

# 分别 查看java与hadoop的版本
java -version
hadoop version


3.3.6 配置域名映射

配置目的:

实现 Hadoop 集群中的各台机器能够通过主机名互相访问,而不依赖 IP 地址。

# 分别在三台机器进行配置
vi /etc/hosts
# 三台机器分别都添加如下信息
192.168.36.100 master
192.168.36.101 slave1
192.168.36.102 slave2

注:三台主机可以互PING测试


3.3.7 三台机器免密互访

1. 什么是 SSH? SSH(Secure Shell)是一种用于远程登录和数据传输的安全协议。通过 SSH,用户可以安全地登录到远程服务器、执行命令或传输文件,整个过程经过加密,避免密码泄露。

2. 什么是免密登录? 免密登录是指:使用 SSH 登录其他机器时不再需要每次输入密码,通过配置密钥认证实现自动身份验证。这在 Hadoop 集群中非常常见,用于节点之间互相访问和任务调度。


3. 公钥和私钥的基本概念

项目含义说明
私钥自己保存,不能泄露,类似你家门的钥匙
公钥可以公开给别人,类似你家的门锁

原理简述:

  • 把公钥放到目标机器,相当于给目标机器装上“你能开的锁”;

  • 当你登录目标机器时,目标机会用“锁”(公钥)验证你是否有“钥匙”(私钥);

  • 如果匹配成功,就允许登录,而无需输入密码。


4. 举例理解:

假设你是张三,想要访问李四的电脑而不输入密码:

  1. 张三生成一对密钥(公钥 + 私钥);

  2. 张三把公钥发送给李四;

  3. 李四把张三的公钥放到他的电脑授权列表里;

  4. 之后张三每次登录李四的电脑时,系统会自动识别公钥+私钥是否匹配;

  5. 匹配成功,自动登录,无需密码。


5. 总结一句话:

公钥用于加密,而 私钥用于解密。

6.三台机器实现 SSH 免密互访

原理:每台机器将自己的公钥发送到所有节点(包括自己),这样任意节点都可以无密码访问任意节点。


实现操作步骤:

1.在master上生成 SSH 密钥对(执行后连续三次回车,不设置密码):

# 以 master 为例:
ssh-keygen -t rsa

2.在每台机器上将公钥发送给所有节点(包括自己)

# 以 master 为例:
ssh-copy-id master   # 输入 yes 和密码(如 123456)
ssh-copy-id slave1
ssh-copy-id slave2

3.然后在 slave1 和 slave2 上也分别执行上面第1、2步相同的命令,将各自的公钥发送给所有节点。

解释说明:ssh-copy-id 命令会将本机的公钥(默认位于 ~/.ssh/id_rsa.pub)追加到目标主机的 ~/.ssh/authorized_keys 文件中,实现免密登录。 authorized 意为“授权”,发音为 /ˈɔːθəraɪzd/。


3.3.8 验证免密

# 可以在三台机器上免密互访测试,
ssh master
ssh slave1
ssh slave2
# 输入exit退出


3.4 Hadoop集群节点配置

分布式集群规划

节点角色
masterNameNode + DataNode + NodeManager
slave1DataNode + NodeManager + ResourceManager
slave2DataNode + NodeManager + SecondaryNameNode

1.NameNodeSecondary NameNode不要安装在同一台服务器。 2.ResourceManager也很消耗内存,不要和 NameNodeSecondaryNameNode配置在同一台机器上。 3.测试环境 master 也做 DataNode,方便观察集群效果。 4.生产环境建议 NameNode 与 DataNode 分离,提升稳定性。


主要角色说明

角色名称职责说明
NameNode管理 HDFS 文件系统的元数据(如目录结构、块位置等)
DataNode存储 HDFS 中的数据块,执行读写任务
Secondary NameNode协助 NameNode 定期合并元数据快照与操作日志,提升性能
ResourceManager管理 YARN 集群的资源分配与作业调度
NodeManager管理本节点资源,接受并执行 ResourceManager 分配的任务


关键配置文件说明

所有配置文件路径统一位于:  /opt/apps/hadoop/etc/hadoop

配置文件名功能描述
workers配置从节点列表,即运行 DataNode 和 NodeManager 的主机名
core-site.xmlHadoop 全局核心配置,定义如 HDFS 地址、IO 设置、默认文件系统等
hdfs-site.xmlHDFS 专属配置,设置副本数、NameNode/DataNode 目录路径等
mapred-site.xmlMapReduce 配置文件,定义作业执行参数,如任务数、历史服务器等
yarn-site.xmlYARN 配置文件,设置 ResourceManager、NodeManager 行为与端口等
hadoop-env.shHadoop 启动环境变量配置,如 JAVA_HOME、内存参数等
yarn-env.shYARN 守护进程的运行环境配置,如日志、内存、端口等设置


说明:

  • site.xml 系列表示用户自定义配置,会覆盖默认配置(default.xml)中的设置。

  • 所有组件配置文件均可引用 core-site.xml 中定义的通用变量,实现配置复用与集中管理。


3.4.1 配置workers

配置目的:

workers 文件用于告诉 Hadoop 哪些主机将运行 DataNode 和 NodeManager,即作为从节点参与数据存储与任务执行。

  • 保证 start-dfs.shstart-yarn.sh 启动从节点服务时,能正确识别并连接所有工作节点。

  • 使集群具备分布式计算与存储能力。


操作步骤:

# 在master上操作
vi /opt/apps/hadoop/etc/hadoop/workers

替换为下面的内容:

master
slave1
slave2

说明:

  • master 节点既作为 NameNode 又作为 DataNode、NodeManager

  • slave1slave2 节点作为典型的从节点,运行 DataNode 和 NodeManager



3.4.2 配置core-site.xml

配置目的

用于设置 Hadoop 的全局基础参数,包括:

  • 设置临时目录路径(避免系统重启丢数据)

  • 指定 NameNode 地址(统一访问 HDFS)

  • 允许 root 用户代理(便于开发测试环境操作权限)

# 在master上操作
vi /opt/apps/hadoop/etc/hadoop/core-site.xml

添加内容如下:

<configuration>
   <!-- 设置 Hadoop 临时文件的存储位置,避免使用系统默认 /tmp -->
   <property>
      <name>hadoop.tmp.dir</name>
      <value>/opt/apps/hadoop/tmp</value>
   </property>
   <!-- 指定 Hadoop 默认文件系统的 URI,这里使用 HDFS 协议。-->
   <!-- 用 HDFS 协议连接到主机名为 master、端口为 9000 的 NameNode 服务。 -->
   <property>
  <name>fs.defaultFS</name>
  <value>hdfs://master:9000</value>
   </property>
</configuration>

1. hadoop.tmp.dir

  • 设置 Hadoop 临时目录,推荐使用专属目录 /opt/apps/hadoop/tmp,避免数据在系统重启时被清空。在 Linux 系统中,Hadoop 使用默认的 /tmp 目录存放临时数据,/tmp 目录经常会在系统重启或服务重启时被清空。那么系统中的临时文件(例如 NameNode 的元数据文件等)可能会丢失,特别是在系统重启或意外断电后。

2. fs.defaultFS

  • 指定 HDFS 文件系统的主地址(NameNode)。设置为 hdfs://master:9000 后,访问 HDFS 根目录时可简写为 /,如:

$ hdfs dfs -ls /
$ hdfs dfs -ls hdfs://master:9000/

 这两个命令等价,都列出了 HDFS 的根目录。

3.4.3 配置hdfs-site.xml

配置目的

设置 HDFS 的核心规则,包括:

  • 辅助节点位置(Secondary NameNode)

  • 文件副本数量(提高容错能力)

  • 数据/元数据存储路径

  • 是否开启权限校验(开发建议关闭)

# 在master上操作
vi /opt/apps/hadoop/etc/hadoop/hdfs-site.xml

添加内容如下:

<configuration>
  <!-- 设置 Secondary NameNode 所在主机(如 slave2)【如果省略配置,SN默认出现在Master节点】-->
  <property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>slave2:9868</value>
  </property>

 <!-- 设置HDFS文件的副本数量,【默认就是3个,可以省略配置】建议设置为DataNode的数量或更小 -->
  <property>
      <name>dfs.replication</name>
      <value>3</value>
  </property>

 <!-- 定义NameNode保存元数据的目录路径(本地) -->
  <property>
      <name>dfs.namenode.name.dir</name>
      <value>file:///opt/apps/hadoop/tmp/dfs/name</value>
  </property>

  <!-- 定义DataNode存放数据的目录路径(本地) -->
  <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:///opt/apps/hadoop/tmp/dfs/data</value>
  </property>

  <!-- NameNode Web UI 【默认配置项,可以省略】-->
  <property>
      <name>dfs.namenode.http-address</name>
      <value>0.0.0.0:9870</value>
  </property>

  <!-- 关闭HDFS的权限检查,允许所有用户访问HDFS中的任何文件或目录 -->
  <!-- Hadoop不建议用root用户操作,特别是在生产环境中。如果不关闭权限检查,系统会报错 -->
  <property>
 <name>dfs.permissions</name>
 <value>false</value>
  </property>
</configuration>


3.4.4 配置mapred-site.xml

配置目的

MapReduce 程序该怎么运行、在哪里运行?

# 在master上操作
vi /opt/apps/hadoop/etc/hadoop/mapred-site.xml

修改如下:

<configuration>
   <!-- MapReduce 作业在 YARN 上运行,而不是本地(默认是local模式),这样MapReduce作业可以分布式执行 -->
   <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
   </property>

   <!-- 配置MapReduce应用程序管理器(AM)的环境变量路径,确保能够找到Hadoop的类库和资源 -->
   <property>
       <name>yarn.app.mapreduce.am.env</name>
       <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
   </property>

   <!-- 配置Map任务的环境变量路径,确保Map任务能够找到Hadoop的类库和资源 -->
   <property>
       <name>mapreduce.map.env</name>
       <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
   </property>

   <!-- 配置Reduce任务的环境变量路径,确保Reduce任务能够找到Hadoop的类库和资源 -->
   <property>
       <name>mapreduce.reduce.env</name>
       <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
   </property>
</configuration>

解释:

  • mapreduce.framework.name=yarn:MapReduce 程序将交给 YARN 来统一调度和运行(用于分布式环境)。

  • yarn.app.mapreduce.am.envmapreduce.map.envmapreduce.reduce.env:确保运行 MapReduce 时能找到 Hadoop 的安装路径(HADOOP_HOME)

  • 这些配置确保 YARN 启动的 AM、Map、Reduce 容器中能正确找到 $HADOOP_MAPRED_HOME/lib 中的 jar 包。

这些配置保证了 MapReduce 作业能够顺利在 YARN 集群上运行,并且任务能够访问正确的 Hadoop 环境变量。


3.4.5 配置yarn-site.xml

配置目的

该文件用于设置 YARN(资源调度系统)的两个关键功能:

  1. 谁是“总调度员”(ResourceManager)?

  2. 是否启用 MapReduce 的中间数据传输服务(Shuffle)?

# 在master上操作
vi /opt/apps/hadoop/etc/hadoop/yarn-site.xml

修改如下:

<configuration>   
   <!-- 1. 启用 mapreduce_shuffle 服务,用于 map 输出 → reduce 输入的数据传输 -->
   <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
   </property>

   <!-- 2. 指定ResourceManager部署在slave1主机上,【如果省略配置,RM默认出现在Master节点】 -->
   <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>slave1</value>
   </property>
</configuration>

解释:

yarn.nodemanager.aux-services =  mapreduce_shuffle

  • 开启 MapReduce 的“快递服务”:让 map 阶段的结果能正确送到 reduce 阶段。

shuffle 过程

  • 作用:在 MapReduce 框架中,shufflemap 阶段和 reduce 阶段之间的核心桥梁。它负责将 map 任务的输出数据根据键进行分组和排序,再将这些排序后的数据传输到对应的 reduce 任务中进行处理。

  • 类比:你可以把 shuffle 过程类比为整理扑克牌的过程:首先将 map 任务生成的“扑克牌”按花色和数字排序(即根据键排序),然后把这些整理好的牌分配给特定的“玩家”(reduce 任务),由这些玩家来处理属于自己的数据。


3.4.6 配置hadoop-env.sh

配置目的

本文件用于设置 Hadoop 服务启动时的关键环境变量与运行用户,解决以下两个核心问题:

  1. 指定 JDK 路径,确保所有节点正确加载 Java 环境

  2. 设置服务运行用户(如 root),避免权限不足导致服务启动失败

# 在master上操作
vi /opt/apps/hadoop/etc/hadoop/hadoop-env.sh

修改如下:

# 指定 JDK 的安装路径
export JAVA_HOME=/opt/apps/jdk

# 注释默认行(防止重复)
# export JAVA_HOME=${JAVA_HOME}

# 设置 Hadoop 各个服务使用 root 用户启动
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

配置说明

1.为什么“指定 JDK 的安装路径”?

  • Hadoop 是用 Java 写的,启动前必须知道 JAVA_HOME 是哪个目录。

  • 虽然我们通常会在 /etc/profile.bashrc 中设置 JAVA_HOME,但通过 SSH 批量远程启动 Hadoop 服务时,这些配置可能不会自动生效。

  • JAVA_HOME 明确写进 hadoop-env.sh,Hadoop 启动脚本会优先加载它,能确保在主节点或从节点都能正常识别 JDK 路径,避免因为找不到 JDK 而启动失败。

2.为什么要“配置 Hadoop 各服务的运行用户为 root”?

  • Hadoop 默认使用当前用户(如 hadoopyarn 等)来启动各个服务。

  • 如果你是以 root 用户登录系统,但又没在 hadoop-env.sh 中指定服务启动用户为 root,那么 Hadoop 可能会尝试以其他默认用户身份运行,从而导致权限不足服务启动失败


3.4.7 配置yarn-env.sh

配置目的

yarn-env.sh 是 YARN 资源调度组件的环境变量配置文件。

  • 确保 YARN 能正常找到 Java 运行环境,否则会启动失败。

# 在master上操作
vi /opt/apps/hadoop/etc/hadoop/yarn-env.sh

修改如下:

# 指定jdk路径
export JAVA_HOME=/opt/apps/jdk


3.4.8 分发到slave1和slave2主机

(1)把master下的两个文件夹/opt/apps/jdk/ /opt/apps/hadoop/复制给slave1\slave2节点

# 将本地 /opt/apps 目录(包含其所有子目录和文件)递归复制到 slave1 的 /opt/ 目录下
# 复制后在 slave1 上形成的路径为:/opt/apps(即将整个 apps 目录拷贝过去)
# -r :递归复制
scp -r /opt/apps slave1:/opt/
scp -r /opt/apps slave2:/opt/

# 复制过程可能需要确认
# Are you sure you want to continue connecting (yes/no)?   yes

(2)把master下的文件/etc/profile复制给slave1\slave2节点

# 在master上操作
scp -r /etc/profile slave1:/etc/
scp -r /etc/profile slave2:/etc/

# 让环境变量生效,在master\slave1\slave2上分别运行
source /etc/profile


3.5 启动集群

3.5.1 格式化namenode

# 在 master 节点上执行
hdfs namenode -format

说明:

  • 格式化操作会初始化 NameNode,创建新的 HDFS 文件系统结构,清空原有元数据;

  • 仅在第一次启动 Hadoop 集群时执行格式化

  • 后续启动集群时禁止重复格式化,否则会清空 HDFS 中的所有数据。

重要:如果第1次格式化失败,一定要按下面的方法操作,否则再次格式化就会报错


格式化成功

image-20250731180324510

格式化成功的关键日志信息是:

2025-07-31 17:59:30,089 INFO common.Storage: Storage directory /opt/apps/hadoop/tmp/dfs/name has been successfully formatted.

表示的含义:

这句日志清晰表明 NameNode 的元数据存储目录已经成功初始化,也就是:

  • /opt/apps/hadoop/tmp/dfs/name 这个路径被成功格式化

  • 这是 hdfs namenode -format 命令执行成功的明确标志

SHUTDOWN_MSG: Shutting down NameNode at master/192.168.36.100

表示的含义:

Hadoop 在执行 hdfs namenode -format 命令时,会临时启动一次 NameNode 进程来进行格式化操作。格式化完成后,这个进程会自动退出,并打印出上述 “SHUTDOWN_MSG” 消息。


常见故障排查:NameNode 格式化失败 或 DataNode 启动异常

一、常见错误场景

  • 格式化过程失败,提示找不到 dfs/name 目录或权限错误;

  • DataNode 启动时报错:Incompatible clusterIDNamenode not reachable

    Incompatible clusterID:发生在 NameNode 和 DataNode 的集群 ID 不一致时(通常是 NameNode 重新格式化了,但 DataNode 还保留旧的元数据)。

    Namenode not reachable:DataNode 无法和 NameNode 建立连接,可能是网络、防火墙、core-site.xml/hdfs-site.xml 配置错误,或 NameNode 进程未启动。

  • jps 检查无 DataNode 进程。

    jps 无 DataNode:多半是 DataNode 启动报错退出,日志路径 $HADOOP_HOME/logs 可以查原因。

问题原因解决
JAVA_HOME is not set节点环境变量未生效在 hadoop-env.sh 写死 JAVA_HOME
Incompatible clusterIDNameNode 重新格式化后 DataNode 目录未清理删除所有节点的 hadoop.tmp.dir 并重建
slave 无进程SSH 免密失败 / workers 配错测试 ssh slaveX date 能否免密登录
端口冲突之前启动未完全停止stop-dfs.sh + jps 检查再启动


二、解决方案【重新格式化】

方法一:简版

步骤1. 停止所有 Hadoop 服务

# 在master节点上执行
stop-dfs.sh       # 停止 HDFS 服务(NameNode、DataNode 等)
stop-yarn.sh      # 停止 YARN 服务(ResourceManager、NodeManager)

使用 jps 确认已关闭:

# 检查所有节点,确保 Hadoop 相关进程均关闭
jps


步骤2. 清除旧数据和日志(所有节点)

# 在所有节点(master、slave1、slave2)上分别执行:

# 删除旧的 NameNode 元数据目录(为重新格式化做准备)
rm -rf /opt/apps/hadoop/tmp/dfs/name/*
# 删除旧的 DataNode 数据块目录(为重新格式化做准备)
rm -rf /opt/apps/hadoop/tmp/dfs/data/*
# 删除旧的 Hadoop 运行日志(清理环境,避免干扰重新格式化)
rm -rf /opt/apps/hadoop/logs/*

注意:

  • 删除的是临时/数据目录,不要删除 Hadoop 的配置文件(如 xml 文件);

  • 请检查hdfs-site.xml实际配置为准确认 dfs.name.dirdfs.data.dir 所在路径。

清空旧目录的原因:

  • NameNode 格式化后会生成新的集群 ID【ClusterID】

  • DataNode 旧目录里还保存着旧的 集群ID

  • 如果不删除 → 新旧 ID 对不上 → 报错,集群无法启动


步骤3:重新格式化 NameNode(仅在 master 节点)

hdfs namenode -format

总结:  “先停服务 → 清空旧目录 → 格式化 NameNode → 避免 ID 不匹配错误。”


方法二:完整

步骤1. 停止所有 Hadoop 服务

# 在master节点上执行
stop-dfs.sh       # 停止 HDFS 服务(NameNode、DataNode 等)
stop-yarn.sh      # 停止 YARN 服务(ResourceManager、NodeManager)

使用 jps 确认已关闭:

# 检查所有节点,确保 Hadoop 相关进程均关闭
jps


步骤2. 清除旧数据和日志(所有节点)

# 在所有节点(master、slave1、slave2)上分别执行:

# 删除临时目录(core-site.xml 中配置的 hadoop.tmp.dir,同时也是删除hdfs-site.xml配置的DataNode 数据块,元数据目录)
rm -rf /opt/apps/hadoop/tmp
# 删除 Hadoop 日志。【Hadoop的默认日志目录】
rm -rf /opt/apps/hadoop/logs/*

注意:

  • 删除的是临时/数据目录,不要删除 Hadoop 的配置文件(如 xml 文件);

  • 请以实际配置为准确认 hadoop.tmp.dirdfs.name.dirdfs.data.dir 所在路径。


步骤3. 重建目录 + 设置权限(所有节点)

# 重新创建目录结构
mkdir -p /opt/apps/hadoop/tmp/dfs/name
mkdir -p /opt/apps/hadoop/tmp/dfs/data

# 设置合适权限
chmod -R 755 /opt/apps/hadoop/tmp


步骤4:重新格式化 NameNode(仅在 master 节点)

hdfs namenode -format


步骤5:启动集群并验证

start-dfs.sh
start-yarn.sh

检查服务状态:

jps
# master 上应看到 NameNode、SecondaryNameNode、ResourceManager
# slave 节点应看到 DataNode、NodeManager

除了 jpshdfs dfsadmin -report 也可以看到 DataNode 注册情况。

如果 DataNode 依旧不显示,马上去 $HADOOP_HOME/logs/hadoop-用户名-datanode-*.log日志看报错。


3.5.2 启动HDFS(分布式文件系统)

master节点上执行如下命令:

# 启动 HDFS(包括 NameNode、DataNode、SecondaryNameNode)
start-dfs.sh  


3.5.3 启动 YARN(资源管理)

# 在slave1节点上执行
start-yarn.sh

说明:

  • 如果 ResourceManager 配置在 slave1不要在 master 启动 YARN

  • 否则会导致 slave1 上的 ResourceManager 无法启动,日志提示端口无法连接(如:slave1:8031 无法连接);

  • 这时应该在 slave1 节点本机 启动 YARN。


3.5.4 查看启动的集群进程

  1. master节点上可以看到NameNodeDataNodeNodeManager进程

image-20240920125455044


  1. Slave1节点可以看到DataNodeResourceManagerNodeManager进程

image-20240920125710858


  1. Slave2节点可以看到DataNodeNodeManagerSecondaryNameNode进程

image-20240920125837550


3.5.5 查看HDFS和Yarn的报告

# 1.在master上查看hdfs的报告
hdfs dfsadmin -report

# 2.在master上查看yarn的信息
yarn node -list


3.5.6 在 Windows 本机上进行的域名映射配置

配置目的:

在 Windows 下配置 hosts 文件,是为了 让你的 Windows 系统能访问这些虚拟机,比如你:

  • 在浏览器中访问 http://master:9870

注意:在 Linux 下配置 /etc/hosts 配置主机名映射,是 虚拟机之间通信用的域名映射

实现操作步骤

① 打开记事本(以管理员身份),编辑文件:

C:\Windows\System32\drivers\etc\hosts

② 在文件末尾添加 Hadoop 虚拟机的 IP 和主机名映射:

192.168.36.100 master
192.168.36.101 slave1
192.168.36.102 slave2

将主机名与相应的IP地址关联,确保通过主机名masterslave1slave2可以访问相应的服务。


3.5.7 Web访问

# Web访问hdfs
http://192.168.36.100:9870
http://master:9870

# Web访问yarn
http://192.168.36.101:8088
http://slave1:8088

如果不成功,查看下面的错误坑点。


3.6 关闭Hadoop集群

stop-dfs.sh                                   # 在master上执行
stop-yarn.sh                                  # 在slave1上执行


3.7 错误坑点

3.7.1 解决Windows浏览器无法访问Hadoop的9870、8088等端口

问题描述:

Hadoop 集群已经启动,但在 浏览器中输入 http://master:9870http://master:8088 无法打开网页。

解决方案:

1.检查网络连接

  • 打开 Windows 命令行(cmd),使用 ping 命令测试是否能访问虚拟机中的 Hadoop 主机。

ping master            # 尝试通过主机名ping
ping 192.168.36.100    # 尝试通过IP地址ping

如果通过 IP 能 ping 通,但主机名不能,说明 Windows 无法识别主机名(DNS 解析失败)。

2.临时解决:使用 IP 地址访问服务

  • 在浏览器中直接输入虚拟机的 IP 地址来访问 Hadoop 页面。

http://192.168.36.100:9870   # 访问Hadoop NameNode Web界面
http://192.168.36.100:8088   # 访问YARN ResourceManager Web界面

如果你只是偶尔访问,用 IP 地址即可;但为了方便,建议设置主机名访问(见下一步)。

3.永久解决:修改 Windows 的 hosts 文件

  • 永久解决:修改 Windows 的 hosts 文件。

    ① 打开记事本(以管理员身份),编辑文件:

    C:\Windows\System32\drivers\etc\hosts

    ② 在文件末尾添加 Hadoop 虚拟机的 IP 和主机名映射:

    192.168.36.100 master
    192.168.36.101 slave1
    192.168.36.102 slave2

    将主机名与相应的IP地址关联,确保通过主机名masterslave1slave2可以访问相应的服务。

4.保存并刷新 DNS 缓存或重启电脑

方法一(推荐):重启电脑 方法二:在命令行中输入命令刷新 DNS 缓存

ipconfig /flushdns

5. 验证主机名是否配置成功

ping master

如果显示响应时间说明配置成功。

6. 重新在浏览器中测试访问

现在可以在浏览器中输入主机名访问服务:

http://master:9870
http://master:8088

7. 如果仍无法访问

请检查以下几点:

  • Hadoop 服务是否已经成功启动(可以在虚拟机中用 jps 命令查看)

  • Windows 防火墙或虚拟机防火墙是否阻止了端口通信(可开放端口 9870 和 8088)

  • 虚拟机与宿主机是否在同一网络(桥接模式或 NAT 网络配置是否正确)


3.7.2 在HDFS的WEB UI上查看日志文件,无法显示文本内容

问题描述:

在浏览器访问 HDFS 的 Web 页面(通常是 http://master:9870),尝试点击一个日志文件查看内容时,出现如下错误信息:

  • 显示:“Couldn't preview the file

  • 无法下载文件

  • 页面显示 [object Object],而不是文件内容

image-20231201132834041

常见原因:

  1. 主机名无法解析 Windows 系统无法正确识别 masterslave1 等 Hadoop 集群节点的主机名。

  2. 主机名映射不一致 Windows 的 hosts 文件和 Linux 系统中的 /etc/hosts 映射内容不一致,导致跨平台通信失败。

解决方法:

1. 修改 Windows 的 hosts 文件

在 Windows 系统中添加主机名与 IP 的对应关系:

  • 用“管理员身份”运行记事本

  • 打开文件:

    C:\Windows\System32\drivers\etc\hosts
  • 添加以下内容:

    192.168.36.100 master
    192.168.36.101 slave1
    192.168.36.102 slave2

保存后关闭。


2. 检查 Linux 中的 /etc/hosts 文件

每台虚拟机中也要设置好主机名对应的 IP 地址。在 masterslave1slave2 三台机器中都执行:

vi /etc/hosts

确保有以下内容:

192.168.36.100 master
192.168.36.101 slave1
192.168.36.102 slave2

3. 刷新 Windows 的 DNS 缓存

修改 hosts 文件后,在 Windows 命令行中执行:

ipconfig /flushdns

确保改动立即生效。


4. 重新打开 HDFS Web 页面

在浏览器中重新访问:

http://master:9870

找到你想查看的文件,再次点击尝试查看内容或下载文件。如果配置正确,页面应该能正常显示文本。

总结:

通过确保Windows和Linux主机的hosts文件映射一致,能够解决日志文件在HDFS Web UI中无法正确显示的问题。


3.7.3 格式化失败或数据节点Datanode无法启动

# 步骤1:关闭所有 Hadoop 服务
# 在 master 节点执行
stop-dfs.sh        # 停止 HDFS
stop-yarn.sh       # 停止 YARN

# 步骤2:清空所有节点的临时数据和日志
# 分别在 master、slave1、slave2 节点执行:
rm -rf /opt/apps/hadoop/tmp         # 删除 HDFS 数据目录(core-site.xml 配置路径)
rm -rf /opt/apps/hadoop/logs/*      # 删除 Hadoop 日志

# 步骤3:重新创建目录结构 + 设置权限(必须执行)
# 仍然在所有节点执行,防止启动时报“目录不存在”错误
mkdir -p /opt/apps/hadoop/tmp/dfs/name     # Master 节点特有
mkdir -p /opt/apps/hadoop/tmp/dfs/data     # 所有节点需要
chmod -R 755 /opt/apps/hadoop/tmp

# 步骤4:重新格式化 NameNode(仅在 master 节点执行)
hdfs namenode -format

# 步骤5:重新启动集群服务
# 启动 HDFS(master 上执行)
start-dfs.sh

# 启动 YARN(在 ResourceManager 所在 slave1 上执行)
start-yarn.sh

# 步骤6:在各节点验证是否成功启动
# 在 master、slave1、slave2 节点分别执行:
jps


3.8 执行分布式实例

3.8.1 全分布运行官方wordcount案例

Wordcount 程序简介

定义与目的:

  • WordCount 是 Hadoop MapReduce 框架的入门级示例程序。

  • 类似于编程语言中的 "Hello World" 示例,用于演示 Hadoop 的基本编程结构和概念。

  • Wordcount 程序的 JAR 包已经预装在 Hadoop 的安装目录中,具体位置:/share/hadoop/mapreduce 文件夹。

功能描述:

  • Wordcount 程序用于统计一个文本文件中各个单词的出现频率。

  • 使用 Hadoop MapReduce 实现单词计数任务,从 HDFS 中的 input 目录读取文本数据,统计每个单词出现的次数,并将结果输出到 HDFS 的 output 目录。

Wordcount 程序的实现

程序组件:

  • Wordcount 程序包含一个 MapReduce 作业,该作业由两个主要部分组成:Map 阶段和 Reduce 阶段。

Map 阶段:

  • 在 Map 阶段,程序将输入的文本文件分解成单词,并为每个单词生成一个键值对(单词, 1),其中键是单词本身,值是 1。

Reduce 阶段:

  • 在 Reduce 阶段,程序将所有具有相同键(即相同单词)的值进行汇总,计算出每个单词在文件中出现的总次数。

MapReduce流程

WordCount案例运行和详解

img

总结:

  • Splitting:将输入数据分割为小块,分发给不同的 Mapper 任务。

  • Mapping:Mapper 处理每个文本块,生成 (单词, 1) 的键值对。

  • Shuffling:将相同的键(单词)聚合在一起,为 Reducer 汇总做准备。

  • Reducing:Reducer 对每个单词的计数进行累加,生成最终的计数结果。


实验步骤:

1.在 /usr/local 目录下创建 hadoop 目录,然后在 hadoop 目录下继续创建 wcinput 目录:

# 在master上操作
mkdir -p /usr/local/hadoop/wcinput

2.在wcinput文件下创建一个wc.input文件,并输入以下内容

touch /usr/local/hadoop/wcinput/wc.input

# 使用文本编辑工具(如vi)输入以下内容
vi /usr/local/hadoop/wcinput/wc.input

# 输入以下文本并保存
hello hadoop
hello mapreduce
hello yarn

3.在HDFS中创建用户目录:

配置目的: 在 HDFS 中为每个系统用户创建专属目录是 Hadoop 使用规范中的推荐做法,原因如下:

  • 权限隔离: 每个用户只能访问和操作自己的目录,避免误删、误改他人数据,提高系统安全性。

  • 结构清晰: 用户数据按目录归类,便于数据管理与审计,防止数据混乱。

  • 程序默认: 某些 Hadoop 工具或应用(如 MapReduce、Hive)默认访问 /user/用户名 目录,若该目录不存在,可能导致任务执行失败或需要手动配置路径。

# 在master上操作,在HDFS中创建用户目录
hdfs dfs -mkdir -p /user/root

# hdfs dfs :用于与 Hadoop 分布式文件系统 (HDFS) 进行文件和目录操作的命令

4.查看刚才创建的目录:

方法1:使用命令的方式

# 列出 HDFS 根目录下的文件和目录。
hdfs dfs -ls /

# 列出 HDFS 根目录下的所有子目录和文件,包括子目录中的内容。【-R 递归】
hdfs dfs -ls -R /

image-20240915111736050


方法2:使用HDFS Web UI(依次点击Utilities -> Browse the file system查看文件系统的目录结构。)

image-20220609152921448


image-20240925231316490


5.将本地文件复制到HDFS

将本地 /usr/local/hadoop/wcinput/wc.input 复制到HDFS分布式文件系统中的 /user/root/input 中。

注意:在 Hadoop 分布式文件系统 (HDFS) 中,每个用户都有一个默认的文件目录。这个目录的路径位于 HDFS 的根目录下的 /user 目录中,用户的个人目录以用户名命名。例如,如果你的用户名是 root,那么你的 HDFS 目录路径就是 /user/root

我们是以 root 用户身份在 Hadoop 中操作。并且已创建了一个目录 /user/root。因此,当在 HDFS 中进行文件操作时,如果要访问 root 用户的文件夹中的 input 的文件夹,可以有两种方式:

  1. 使用绝对路径/user/root/input

  2. 使用相对路径:HDFS 会将相对路径解析到当前用户的 HDFS 目录下,那么可以只写 input,因为系统会自动将其识别为 /user/root/input

这就意味着,当我们执行某些命令时,比如上传数据或读取文件,可以省去写完整的绝对路径,而直接用相对路径 input 来简化操作。系统会理解为 /user/root/input

  • (1)在HDFS下新建input目录(默认在用户目录user/root下创建):

hdfs dfs -mkdir input
  • (2)将本地的wc.input上传到HDFS的input目录下:

hdfs dfs -put /usr/local/hadoop/wcinput/wc.input input

6.查看文件是否上传成功:

# 递归列出根目录及其所有子目录的文件和目录信息
hdfs dfs -ls -R /

7.删除现有的输出目录

  • 注意:运行此案例时程序时,输出目录不能存在,否则会提示错误*“org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,

  • 因此,如果要多次运行同一个程序,在每次运行之前需要删除 HDFS 中的 output 目录(首次运行时不需要删除):

hdfs dfs -rm -r -f output 

# 强制递归删除 HDFS 中的 output 目录及其内容;
# -r: 递归删除
# -f: 强制删除,即使文件或目录不存在,也不会报错。

8.运行WordCount程序

hadoop jar /opt/apps/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar \
wordcount \
-D mapreduce.map.memory.mb=2048 \
-D mapreduce.reduce.memory.mb=2048 \
input \
output

解释:

  • hadoop jar: 运行 Hadoop 的 JAR 文件。

  • /opt/apps/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar: 这是 Hadoop 示例程序的 JAR 文件。

  • wordcount: 执行单词计数的 MapReduce 程序。

  • -D mapreduce.map.memory.mb=2048:设置每个Map任务的最大内存为2048 MB(2 GB),以确保Map任务在执行时有足够的内存。

  • -D mapreduce.reduce.memory.mb=2048:设置每个Reduce任务的最大内存为2048 MB(2 GB),确保Reduce任务在执行时有足够的内存。

  • input: 输入文件所在的 HDFS 目录。

  • output: 输出结果保存的 HDFS 目录(必须不存在,否则会报错)。

image-20220605125946388


在运行日志中,以下是几条重要信息,可以帮助理解和诊断Hadoop wordcount作业的执行情况:

1. 资源管理连接 Connecting to ResourceManager at slave1/192.168.36.101:8032 表示Hadoop客户端成功连接到了ResourceManager,准备提交作业。

2.作业提交状态 Submitted application application_1726732813798_0010 这是作业的Application ID,表示作业成功提交给YARN资源管理器,可以用来跟踪作业状态。

3.作业跟踪URL The url to track the job: http://slave1:8088/proxy/application_1726732813798_0010/ 提供了作业的Web界面URL,用于在线查看作业的执行进度和详情。

4.作业执行进度 map 0% reduce 0% 表示作业刚开始执行。 map 100% reduce 0% 表示Map阶段完成。 map 100% reduce 100% 表示Reduce阶段完成,作业执行结束。

5.作业完成状态 Job job_1726732813798_0010 completed successfully 关键信息,表明作业成功执行,没有出现错误或中断。

6.SASL加密信任问题 SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false 这个信息表明在加密数据传输过程中,本地和远程主机都没有被信任,可能需要进一步检查SASL配置。

7.Map-Reduce作业计数器 Launched map tasks=1 和 Launched reduce tasks=1 表示作业启动了1个Map任务和1个Reduce任务。 Map输入和输出记录: Map input records=3 表示Map任务处理了3条输入记录。 Map output records=6 表示Map任务产生了6条输出记录。 Reduce输入和输出记录: Reduce input records=4 表示Reduce任务接收了4条输入记录。 Reduce output records=4 表示Reduce任务输出了4条结果记录。

8.系统资源使用 Physical memory (bytes) snapshot=453672960 和 Virtual memory (bytes) snapshot=7343108096 显示了作业执行时使用的物理内存和虚拟内存,帮助评估作业的资源消耗。

9.文件系统统计 HDFS: Number of bytes read=148 和 HDFS: Number of bytes written=36 说明从HDFS读取了148字节的数据,写入了36字节的数据,反映了作业的I/O情况。


9.查看运行结果:

# 查看HDFS上的output目录中的内容
hdfs dfs -cat output/*

image-20220606115708172


10.也可以在web网页中下载文件查看

image-20220609152756527

注意:如果运行失败需要重新执行,需要删除HDFS中的  output 文件夹,然后再重新执行。

hdfs dfs -rm -r -f output


【错误坑点】

报错:Hadoop 执行 MapReduce 报错:找不到主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster 的解决方案

❗ 报错信息:

在通过 YARN 执行 MapReduce 程序时,报出如下错误:

Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

原因:YARN 启动 MapReduce 应用程序(ApplicationMaster、Map 任务、Reduce 任务)时,未能正确加载 Hadoop 的 classpath,导致无法找到核心类 MRAppMaster,从而任务失败。。

解决方法:

  • 确保环境变量设置正确:确保在执行MapReduce作业时,AM(Application Master,应用程序主)、Map任务和Reduce任务都能找到所需的Hadoop类和资源,以便成功运行作业。

  • 编辑MapReduce配置文件:mapred-site.xml

    在配置文件中添加以下配置项,以确保各个任务能够正确找到Hadoop的类路径:

<!-- 配置MapReduce应用程序管理器(AM)的环境变量,确保能够找到Hadoop的类库和资源 -->
<property>
   <name>yarn.app.mapreduce.am.env</name>
   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<!-- 配置Map任务的环境变量,确保Map任务能够找到Hadoop的类库和资源 -->
<property>
   <name>mapreduce.map.env</name>
   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<!-- 配置Reduce任务的环境变量,确保Reduce任务能够找到Hadoop的类库和资源 -->
<property>
   <name>mapreduce.reduce.env</name>
   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
  • 注意:如果不设置这些属性,在运行Hadoop自带的示例程序(如词频统计WordCount)时,可能会遇到“Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster”的错误。


3.8.2 全分布运行官方 grep 案例

grep 案例简介

定义与目的:

  • grep案例是Hadoop MapReduce框架中的一个经典示例程序。

  • 它的目的是演示如何在Hadoop集群上执行分布式的文本搜索和过滤操作。

功能描述:

  • 使用 Hadoop MapReduce 实现文本搜索任务,从 HDFS 中的 input2 目录读取文本数据,利用正则表达式 'dfs[a-z.]+' 查找以 "dfs" 开头、后跟小写字母或句点的文本片段,并将结果输出到 HDFS 的 output2 目录。

grep案例的实现

程序组件:

  • grep案例程序由MapReduce作业构成,包括Map任务和Reduce任务两个主要部分。

Map阶段:

  • 在Map阶段,程序读取输入的文本数据,并将每一行与正则表达式进行匹配。匹配成功的行会作为键值对输出,其中键是固定值,值是匹配的行。

Reduce阶段:

  • 在Reduce阶段,程序接收Map阶段输出的所有匹配行,并将它们写入到输出文件中。由于Grep案例的Reduce任务相对简单,通常可以省略或使用一个简单的Reducer实现。


【实验步骤:】

1.首先在 HDFS 中创建用户目录:

注意:如上个案例创建过此目录就不需要再创建了

hdfs dfs -mkdir -p /user/root

两种方法查看刚才创建的目录:

1)使用命令

hdfs dfs -ls -R /user


2)WEB方法 (点击Utilities-Browse the file system

image-20220609153541333


2.将本地 /opt/apps/hadoop/etc/hadoop/*.xml 复制到HDFS文件系统中的 /user/root/input2 中。

注意:我们使用的是 root 用户,并且已在HDFS中创建相应的用户目录 /user/root ,因此在命令中就可以使用相对路径如 input2,其对应的绝对路径就是 /user/root/input2:

# 递归删除HDFS上的目录input2,包括目录内的所有文件和子目录。其中 -r 表示递归删除,-f 表示强制删除
hdfs dfs -rm -r -f input2

# 在HDFS上创建 input2 目录并上传文件
hdfs dfs -mkdir input2    
hdfs dfs -put /opt/apps/hadoop/etc/hadoop/*.xml input2

# 删除 output2 文件夹(Hadoop 运行程序时,输出目录不能存在,否则会提示错误 )
hdfs dfs -rm -r -f output2

# 查看input2目录中的文件列表
hdfs dfs -ls input2


3.运行 MapReduce 作业

# 切换到 Hadoop 目录
cd /usr/local/hadoop

# 运行 MapReduce 作业
hadoop jar /opt/apps/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar \
grep \
-D mapreduce.map.memory.mb=2048 \
-D mapreduce.reduce.memory.mb=2048 \
input2 \
output2 \
'dfs[a-z.]+'

解释:

  • hadoop jar: 运行 Hadoop 的 JAR 文件。

  • /opt/apps/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar: 这是 Hadoop 示例程序的 JAR 文件。

  • grep:选择要运行的MapReduce示例为'grep',用于基于正则表达式在输入文件中搜索模式。

  • -D mapreduce.map.memory.mb=2048:设置每个Map任务的最大内存为2048 MB(2 GB),以确保Map任务在执行时有足够的内存。

  • -D mapreduce.reduce.memory.mb=2048:设置每个Reduce任务的最大内存为2048 MB(2 GB),确保Reduce任务在执行时有足够的内存。

    • 建议master主机的内存在VMware中设置为4G

  • input2: 输入文件所在的 HDFS 目录。

  • output2: 输出结果保存的 HDFS 目录(必须不存在,否则会报错)。

  • 'dfs[a-z.]+':并在输入文件中搜索匹配模式'dfs[a-z.]+'的文本。


    • 'dfs[a-z.]+'正则表达式:用于在文本中查找以 "dfs" 开头,后跟一个或多个小写字母或句点的文本片段。例如,它可以匹配 "dfsabc"、"dfs.efg"、"dfsxyz" 等。

4.查看运行结果(查看的是位于 HDFS 中的输出结果):

1)  在 HDFS 中查看输出结果

hdfs dfs -cat output2/*

image-20220606111906809


2)  将结果复制到本地并查看

# 强制递归删除本地文件系统中的 output2 文件夹(如果存在)
rm -rf /opt/data/output2  

# 将 HDFS 上的 output2 目录下载并复制到本地文件系统中的 /opt/data/output2
hdfs dfs -get output2 /opt/data/output2  

# 显示本地 output2 文件夹中所有文件的内容
cat /opt/data/output2/*                


常见问题:

Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:

hdfs dfs -rm -r -f output2    # 删除 output2文件夹


关闭Hadoop集群

最后,关闭Hadoop集群

stop-yarn.sh      # 在master上执行
stop-dfs.sh       # 在slave1上执行

至此,就顺利完成了Hadoop集群搭建。



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权:李翔
备案/许可证编号为:新ICP备2024006115号-1