一、Hadoop的简介
1.1、Hadoop是什么
Hadoop 是 Apache 基金会维护的开源分布式存储与分布式计算框架。支持在普通商用服务器集群上,依托简易编程模型对海量数据集进行分布式处理;集群可单机横向扩展至上千台节点;不在硬件层面追求高可用,而是在应用层自动检测、处理故障,实现廉价集群上的可靠分布式运算。
| Hadoop 核心四大模块 |
|---|
| 1. ✅Hadoop Common:公共基础工具类库,其余组件依赖底层工具; 2. ****✅HDFS(Hadoop Distributed File System)分布式文件系统:提供高吞吐的数据访问能力,负责海量数据存储; 3. ****✅YARN:集群资源管理、作业调度框架(Hadoop2.x 及以后引入); 4. ****✅MapReduce:基于 YARN 运行的大规模数据集并行批处理引擎。 |
| 狭义 Hadoop = 4 个核心组件(Hadoop Common、HDFS、Yarn、MapReduce); 广义 Hadoop = Hadoop 生态圈(Hive、HBase、Sqoop、Spark 等周边组件集合)。 |
1.2、Hadoop的生态圈介绍

| Hadoop生态圈构成 | 说明 |
|---|---|
| Oozie(工作流调度器) | Oozie是一个基于工作流调度的服务器,可以在上面运行Hadoop的Map Reduce和Pig任务。它其实就是一个运行在Java Servlet容器(比如Tomcat)中的Java Web应用。 对于Oozie来说,工作流就是一系列的操作(比如Hadoop的MR,以及Pig的任务)之间的依赖,如何控制这些依赖是oozie的核心,所谓依赖,就是一个操作的输入依赖于前一个任务的输出,只有前一个操作完全完成后,才能开始第二个。 |
| Hive(数据仓库) | Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行。通常用于离线分析。 Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。 |
| Pig(ad-hoc脚本) | Pig定义了一种数据流语言---Pig Latin,它是MapReduce编程的复杂性的抽象,其编译器将Pig Latin翻译成MapReduce程序序列,将脚本转换为MapReduce任务在Hadoop上执行。通常用于进行离线分析。 |
| Mapreduce(分布式计算框架) | MapReduce是一种分布式计算模型,用以进行大数据量的计算。它屏蔽了分布式计算框架细节,将计算抽象成map和reduce两部分,其中Map对数据集上的独立元素进行指定的操作,生成中间结果。Reduce则对中间结果中相同"键"的所有"值"进行规约,以得到最终结果。 |
| Spark(内存计算模型) | Spark拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是------Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。和Hadoop相比,Spark可以让程序在内存中运行时速度提升100倍,或者在磁盘上运行时速度提升10倍。 |
| Kafka(分布式消息队列) | Kafka是一种高吞吐量的分布式发布/订阅消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景(如:基于hadoop平台的数据分析、低时延的实时系统、storm/spark流式处理引擎等)。kafka现在它已被多家大型公司作为多种类型的数据管道和消息系统使用。 |
| Sqoop(数据ETL/同步工具) | Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之间传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。 Sqoop利用数据库技术描述数据架构,用于在关系数据库、数据仓库和Hadoop之间转移数据。 |
| Flume(日志收集工具) | Flume是Cloudera开源的日志收集系统,具有分布式、高可靠、高容错、易于定制和扩展的特点。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。 同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume还具有能够将日志写往各种数据目标(可定制)的能力。 总的来说,Flume是一个可扩展、适合复杂环境的海量日志收集系统。当然也可以用于收集其他类型数据 |
| Zookeeper(分布式协作服务) | Zookeeper可理解为一个和事佬的角色。解决分布式环境下的数据管理问题(如:统一命名,状态同步,集群管理,配置同步等) |
| HBASE(分布式列存数据库) | Hbase是一个非关系型数据库(NoSQL),是按列来存储。 HBase提供了对大规模数据的随机、实时读写访问,同时,Hbase使用HDFS来存储数据,因此它可以使用MapReduce机制来处理数据,它将数据存储和并行计算完美地结合在一起。 HBase的典型的应用场景就是数据量要足够多,如果有十亿及百亿行数据,那么Hbase是一个很好的选择,同时,HBase对于持续的大量的插入操作可以达到每秒百万的吞吐量。 |
| Yarn(分布式资源管理器) | Yarn是下一代 Hadoop 计算平台,yarn是一个通用的运行框架,用户可以编写自己的计算框架,在该运行环境中运行。 该框架提供了以下几个组件: 1. 资源管理:包括应用程序管理和机器资源管理 2. 资源双层调度 3. 容错性:各个组件均有考虑容错性 4. 扩展性:可扩展到上万个节点 |
| HDFS(Hadoop分布式文件系统) | HDFS是Hadoop体系中数据存储管理的基石。它是一个高度容错的分布式文件系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。 它提供了一次写入多次读取的机制,数据以块的形式,同时分布在集群不同物理机器上。 ![]() |
1.3、Hadoop有啥用
| Hadoop的核心能力 | 说明 |
|---|---|
| 分布式海量数据存储(HDFS 能力) | HDFS 面向超大文件、流式读取、一次写入多次读取场景设计: * 将大文件切分为 Block(3.x 默认 128MB)分散存储在集群不同节点; * 默认 3 副本机制(3.x 支持纠删码节省存储空间),硬件故障不丢失数据; * 可存储结构化、半结构化、非结构化数据(日志、文本、音视频、传感器数据等),是传统数据湖最主流底层存储。 |
| 分布式离线并行计算(MapReduce/YARN) | 贯彻移动计算,而非移动数据思想:将计算任务下发至数据所在节点,减少网络 IO; YARN 统一管理 CPU、内存资源,允许多种计算引擎(MapReduce、Spark、Flink)共享一套 Hadoop 集群资源。 |
| 支撑上层大数据生态平台 | 作为底层底座,支撑:数据仓库 (Hive)、列式存储、离线数据挖掘、用户行为分析、日志平台、机器学习数据集存储。 |
1.4、Hadoop的优缺点
| Hadoop的优点 | 说明 |
|---|---|
| ✅高可扩展性 | 集群支持横向扩容,数据、计算资源随节点增加线性增长;集群规模可从单台服务器平滑扩展至数千节点,无需重构业务。 |
| ✅高容错、高可靠 | 官网明确假设:硬件故障是常态,而非特例 * HDFS:数据多副本存放于不同 DataNode,节点宕机自动触发副本复制; * YARN/MapReduce:任务失败自动重试、资源重新调度,单个节点故障不会导致整体作业失败。 |
| ✅低成本,适配普通商用硬件 | 无需小型机、高端存储阵列;运行在通用 x86 服务器,开源无软件授权费用,大幅降低海量数据存储基础设施成本。 |
| ✅高吞吐量,适合大批量数据扫描 | HDFS 优化流式数据读取,优先保障大规模批量数据读写带宽;适合一次性读取 TB/PB 级日志、历史数据。 |
| ✅数据格式兼容性强 | 不限制数据结构,支持结构化、半结构化、非结构化原始数据,适合搭建企业数据湖。 |
| ✅生态极其成熟 | 二十余年工业验证,配套工具完善:数据接入 (Sqoop/Flume)、SQL 查询 (Hive)、KV 数据库 (HBase)、任务调度 (Oozie) 等。 |
| Hadoop的缺点 | 说明 |
|---|---|
| ❌不适合低延迟随机访问、实时交互式查询 | HDFS 设计目标是高吞吐,牺牲访问时延;面向批量流式读取,不适合毫秒 / 秒级单点随机查询。原生 MapReduce 作业启动、调度开销大,通常延迟分钟级别。 |
| ❌HDFS 不适合大量小文件场景 | NameNode 将文件元数据全部加载至内存;海量 KB 级小文件会耗尽 NameNode 内存,严重压垮集群。官网文档明确 HDFS 面向大文件优化。 |
| ❌HDFS 仅支持一次写入、多次读取(WORM) | 原生不支持文件随机修改、频繁覆盖写入;仅支持追加写入,不适合 OLTP 频繁更新业务数据。 |
| ❌运维复杂度高 | 集群节点数量多,NameNode、ResourceManager 主节点 HA 配置、故障排查、容量规划、参数调优门槛高,需要专职大数据运维。 |
| ❌MapReduce 原生计算性能偏弱 | MapReduce 中间结果频繁落地磁盘,迭代计算效率低下;目前工业界大量使用 Spark 替代 MapReduce 作为计算引擎,但依然复用 HDFS/YARN。 |
| ❌资源开销大,小规模数据不划算 | 几十 GB 以内小规模数据场景,Hadoop 集群部署、启动资源开销远高于单机程序,性价比极低。 |
1.5、Hadoop的适用与不适用场景
| ✅Hadoop的适用场景 |
|---|
| 1. 海量离线日志存储与分析(服务器日志、APP 埋点、用户行为日志,TB/PB 级历史日志归档) 2. 企业离线数据仓库、数据湖底层存储底座(Hive 数据仓库底层一般基于 HDFS) 3. 大规模数据挖掘、离线机器学习特征数据集存储 4. 历史数据长期归档、冷数据存储(一次采集,反复统计分析) 5. 物联网海量传感器原始数据存储、批量统计 6. 基因、气象、天文等科研超大文件批量处理 7. 非结构化数据集中存储:图片、原始录音、文档素材库 |
| ❌Hadoop的不适用场景 |
|---|
| 1. 低延迟在线业务、实时查询系统(电商订单查询、实时风控、毫秒级交互式报表) 2. 高频随机更新、在线事务 OLTP 业务(MySQL、PostgreSQL 业务系统) 3. 海量小文件存储(千万级、亿级细碎文件)(适合对象存储如 S3、Ozone) 4. 小规模数据集(GB 级别以内)简单运算 5. 强实时流式计算(实时大屏、实时数据流)(优先 Flink,Hadoop 无法单独完成实时处理) |
二、Hadoop的伪分布式部署
hadoop的伪分布式只适用于构建简单的开发环境或用于简单的功能测试。
2.1、Hadoop发行版介绍及其选型建议
目前Hadoop发行版非常多(如:Intel发行版、华为发行版、Cloudera发行版(CDH)、Hortonworks版本等);所有发行版均是基于Apache Hadoop衍生出来的,之所以有这么多的版本,是由于Apache Hadoop的开源协议决定的:任何人可以对其进行修改,并作为开源或商业产品发布/销售。
| 目前不收费的Hadoop版本 | 说明 |
|---|---|
| Apache Hadoop | 最原始的版本,所有发行版均基于这个版本进行改进;该版本采用Apache License2.0,不需要向 Apache 基金会支付任何费用,允许企业内部生产商用;只需要遵守协议:保留版权声明、修改代码做好标记。 |
| CDH | Cloudera's Distribution Including Apache Hadoop,简称CDH; Cloudera 收购 Hortonworks 之后,在2021-01-31 执行新政策:新版本不再开放公开免费仓库 1. CDH5、CDH6(历史旧版本) 2. CDP(Cloudera Data Platform,CDH 后继新版)❌ 不再提供免费社区版,全部需要订阅授权,不属于免费版本! 3. Cloudera Manager Express(免费版):无 License 即可安装,不限节点,基础监控、部署功能免费【限制:企业高级特性(数据审计、备份容灾、Navigator 数据治理、LDAP 单点登录等)需要购买 Enterprise 订阅】 致命现状 :Cloudera 官网已经封锁公开 yum/apt 源,无法直接从官方渠道下载 CDH5/CDH6 安装包 ;网络流传第三方镜像包仅适合学习测试;生产环境存在安全补丁无法获取、无官方维护风险。 目前Cloudera已经跟Hortonworks合并为一家公司,CDP是主推平台,属于收费项目。 |
| HDP | Hortonworks Data Platform简称HDP。 整套平台 100% 开源无限制,配套 Ambari 可视化部署工具 * HDP2.x、HDP3.x 全部基于 Apache 开源组件,无组件功能阉割; * 商业模式:软件永久免费,厂商只售卖技术支持服务,不收取软件 License; * 现状:Hortonworks 被 Cloudera 收购,HDP 全线停止新版本开发(EOL),不再更新安全补丁; * 资源:历史安装包仍然可以在存档站点找到,但新项目不推荐上生产。 |
| Hadoop的选型建议 |
|---|
| 初学者建议选择apache hadoop发行版。 生产环境推荐HDP或CDH发行版本。 |
2.2、Hadoop伪分布式的安装准备
| Hadoop伪分布式的安装规划 | 说明 |
|---|---|
| 《1》安装规划 | 伪分布式安装Hadoop只需要一台机器即可,硬件配置最低为4核CPU,8G内存; |
| 《2》Hadoop版本 | 3.5.0 |
| 《3》JDK版本 | ≥17;本文采用openjdk21 |
| 《4》服务器系统版本 | AlmaLinux9.3 |
2.2.1、安装部署openjdk21环境
bash
#安装java的Jdk、jre环境有两种方法
#方法一:直接在线安装java的JDK包(如:我这里安装java-21-openjdk-devel)
#注意:可以先检查当前Linux是否支持指定版本的jdk环境(如没有jdk17则无法使用yum安装,需手动安装)
yum list | grep jdk
yum install java-21-openjdk-devel -y
#方法二:直接手动安装配置指定版本java的jdk和jre
#手动安装openjdk21实操流程(其余版本的Jdk安装方法也一样)
#1-检查Linux支持的jdk环境(若没有jdk21则无法使用yum安装,需手动安装)
yum list | grep jdk
#2-下载openjdk21的压缩包【注意:这个openjdk的下载链接需要自己到红帽官网 https://developers.redhat.com/products/openjdk/download 获取,我这里提供的会失效】
wget https://access.cdn.redhat.com/content/origin/files/sha256/1a/1ae9385bde47c7928dc9b328eee8771e5f3ab94f425d19940fe7b105ac882bce/java-21-openjdk-21.0.9.0.10-1.portable.jdk.x86_64.tar.xz?_auth_=1761740868_99dc162417e4a3dd4e27ea8b7bc669e9 -c 0 -P /data
#3-解压openjdk21并修改名称
cd /data/
tar -xvf 'java-21-openjdk-21.0.9.0.10-1.portable.jdk.x86_64.tar.xz?_auth_=1761740868_99dc162417e4a3dd4e27ea8b7bc669e9'
mv java-21-openjdk-21.0.9.0.10-1.portable.jdk.x86_64 openjdk2109010
#4-编辑环境配置文件并添加openjdk21的环境变量
#这里创建一个/data/openjdk的软链接指向openjdk21就可以很灵活的升级openjdk而不用再修改环境配置了
ln -s /data/openjdk2109010 /data/openjdk
vi /etc/profile
#openjdk enviroment
export JAVA_HOME=/data/openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
#5-让修改的环境变量生效
source /etc/profile
#6-查看java版本信息
echo $JAVA_HOME
echo $PATH
java -version
#7-安装openjdk21对应的jre
#7.1-下载openjdk21对应的jre二进制压缩包
wget https://access.cdn.redhat.com/content/origin/files/sha256/7e/7e3a9fccc57747b82be044096d7a10ebfd6ef6333e3fe351bcfb4dd8a44abbcc/java-21-openjdk-21.0.9.0.10-1.portable.jre.x86_64.tar.xz?_auth_=1761741095_3bd83086c5c03e98940d93d72265bed6 -c o -P /data
#7.2-进入/data目录并解压下载好的jre21包
cd /data
tar -xvf 'java-21-openjdk-21.0.9.0.10-1.portable.jre.x86_64.tar.xz?_auth_=1761741095_3bd83086c5c03e98940d93d72265bed6'
#7.3-将解压好的jre17复制一份到openjdk21目录中并修改名字为jre
cp -r java-21-openjdk-21.0.9.0.10-1.portable.jre.x86_64 openjdk2109010/
cd openjdk2109010/
mv java-21-openjdk-21.0.9.0.10-1.portable.jre.x86_64 jre
#7.4-查看jre的路径信息
echo $JRE_HOME

2.2.2、下载Hadoop二进制安装包
bash
#下载hadoop 3.5.0
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.5.0/hadoop-3.5.0.tar.gz -c -P /data

2.2.3、配置Hadoop
bash
#配置Hadoop
#1-解压Hadoop二进制压缩包,并设置软链接指向解压好的hadoop,这样后续升级hadoop就会比较方便
cd /data
tar -zxvf hadoop-3.5.0.tar.gz -C /data
mkdir -p /data/hadoop && mv /data/hadoop-3.5.0 /data/hadoop
ln -s /data/hadoop/hadoop-3.5.0 /data/hadoop/current
#2-创建hadoop用户并给hadoop的二进制文件夹授权,且将当前hadoop的配置都复制一份到/etc目录下,配置统一,方便维护
useradd hadoop
id hadoop
chown -R hadoop:hadoop /data/hadoop
cp -rp /data/hadoop/current/etc/hadoop /etc
#3-配置hadoop环境
#3.1-编辑全局环境
vi /etc/profile
#Hadoop Env
export HADOOP_HOME=/data/hadoop/current
export HADOOP_CONF_DIR=/etc/hadoop/
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#3.2-让修改的环境变量生效
source /etc/profile
#3.3-查看hadoop环境信息
echo $HADOOP_HOME
echo $HADOOP_CONF_DIR

2.2.4、修改系统的主机名称
bash
#修改系统的主机名称
#1.1-将192.168.1.120主机的名称修改为hadoop01
hostnamectl set-hostname hadoop01
#1.2-修改hosts配置【只执行一次】
cp -p /etc/hosts /etc/hosts.bak.$(date +%Y%m%d)
echo "192.168.1.120 hadoop01">>/etc/hosts
#1.3-让修改的主机名称生效
systemctl restart systemd-hostnamed
exec bash
2.3、Hadoop的伪分布式部署
2.3.1、配置【core-site.xml】
bash
#1-编辑/etc/hadoop/core-site.xml文件,完整内容如下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--
官方核心参数 fs.defaultFS
作用:全局默认文件系统,所有组件(HDFS/YARN/HttpFS)默认使用该HDFS地址
URI格式规范:hdfs://主机名:RPC端口
Hadoop3 NameNode默认RPC端口:9000(保持官方默认不修改)
我的hosts里主机名是 hadoop01,因此填写 hadoop01:9000
-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!--
hadoop.tmp.dir:Hadoop所有临时数据基础目录
官方警告:不要使用默认/tmp!系统定时清理会销毁HDFS元数据
路径自行创建:mkdir -p /data/hadoop/data/tmp
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/data/tmp</value>
</property>
</configuration>
#2-创建hadoop所有临时数据基础目录
mkdir -p /data/hadoop/data/tmp
chown -R hadoop:hadoop /data/hadoop
chmod 755 /data/hadoop/data/tmp

2.3.2、配置【hdfs-site.xml】
bash
#1-编辑/etc/hadoop/hdfs-site.xml文件,完整内容如下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 伪分布式副本数固定1 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- NameNode Web管理页面 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop01:9870</value>
</property>
<!-- SecondaryNameNode Web地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop01:9868</value>
</property>
<!-- NN元数据存储路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/data/namenode</value>
</property>
<!-- DN数据块存储路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/data/datanode</value>
</property>
<!-- --HDFS回收站,单位分钟,1440=1天;0=关闭回收站【这里设置回收站保留7天】7天后自动清理 -->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>1440</value> <!-- 每天生成一次快照,≤10080 -->
</property>
<!-- 学习环境关闭权限检查,生产改为true -->
<property>
<name>dfs.permissions.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.superusergroup</name>
<value>supergroup</value>
</property>
</configuration>
#2-创建hadoop所有临时数据基础目录
mkdir -p /data/hadoop/data/namenode
mkdir -p /data/hadoop/data/datanode
chown -R hadoop:hadoop /data/hadoop
2.3.3、配置【mapred-site.xml】
bash
#1-编辑/etc/hadoop/mapred-site.xml文件,完整内容如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- MR运行框架交给YARN调度 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器RPC通信地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<!-- 历史服务器Web页面地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
<!-- 官方标准裸路径,自动复用core-site fs.defaultFS,无需硬编码hdfs URI -->
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/history/done_intermediate</value>
</property>
<!-- 历史日志自动清理配置(Apache Hadoop3原生有效参数) -->
<property>
<name>mapreduce.jobhistory.cleaner.enable</name>
<value>true</value>
</property>
<!-- 历史日志保留7天,单位毫秒 -->
<property>
<name>mapreduce.jobhistory.max-age-ms</name>
<value>604800000</value>
</property>
<!-- 每天扫描一次过期日志 -->
<property>
<name>mapreduce.jobhistory.cleaner.interval-ms</name>
<value>86400000</value>
</property>
<!-- 解决YARN容器MR依赖缺失,官方必配 -->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
#2-创建hadoop历史日志 HDFS 目录【格式化 HDFS 后执行】
#注意:如下路径必须是 HDFS 路径,不能是本地磁盘路径
hdfs dfs -mkdir -p /history/done /history/done_intermediate
hdfs dfs -chmod 777 /history
2.3.4、配置【yarn-site.xml】
bash
#1-编辑/etc/hadoop/yarn-site.xml文件,完整内容如下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 开启NM辅助Shuffle服务,MR必须依赖 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定Shuffle服务处理类 -->
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!-- ResourceManager所在主机 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<!-- 开启YARN日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 聚合日志7天后自动删除,单位秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 日志页面跳转HistoryServer地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop01:19888/jobhistory/logs</value>
</property>
<!-- NodeManager总可用内存 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- 容器最小分配内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<!-- 容器最大分配内存(官方强制配套) -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<!-- CPU虚拟核心资源配置 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
</property>
<!-- 使用容量调度器(Hadoop3默认) -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
<!-- 磁盘健康检查,避免磁盘爆满集群故障 -->
<property>
<name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name>
<value>1</value>
</property>
<property>
<name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name>
<value>90</value>
</property>
</configuration>
2.3.5、配置【hadoop-env.sh】
bash
#1-编辑/etc/hadoop/hadoop-env.sh文件,文件末尾新增内容如下
# 1. 强制指定JDK(根据你实际使用的JDK)
export JAVA_HOME=/data/openjdk
# JDK路径容错校验(官方模板标准逻辑)
if [ ! -d "${JAVA_HOME}" ]; then
echo "ERROR: JAVA_HOME path ${JAVA_HOME} not exists, Hadoop startup aborted!"
exit 1
fi
# 2. 守护进程运行用户配置【官方生产环境禁止使用root,仅测试临时使用】
# 生产环境请新建普通hadoop用户并修改所有值为 hadoop
export HDFS_NAMENODE_USER="hadoop"
export HDFS_DATANODE_USER="hadoop"
export HDFS_SECONDARYNAMENODE_USER="hadoop"
export YARN_RESOURCEMANAGER_USER="hadoop"
export YARN_NODEMANAGER_USER="hadoop"
export MAPRED_HISTORYSERVER_USER="hadoop"
# 生产强制拦截root启动Hadoop(官方安全规范补充)
if [ "$(id -u)" -eq 0 ]; then
echo "ERROR: Root user is forbidden to run Hadoop daemons, please switch to hadoop user!"
exit 1
fi
# 3. 自定义持久化日志、PID目录,避免/tmp清理丢失【在启动hadoop前必须先创建这两个目录】
export HADOOP_LOG_DIR=/data/hadoop/data/logs
export HADOOP_PID_DIR=/data/hadoop/data/pids
# 4. 强制使用IPv4,关闭IPv6优选,解决主机名连通异常(官方推荐写入公共OPTS,避免覆盖全局参数)
# 使用HADOOP_COMMON_OPTS追加参数,不会覆盖系统默认JVM配置(官方推荐写法)
export HADOOP_COMMON_OPTS="-Djava.net.preferIPv4Stack=true ${HADOOP_COMMON_OPTS}"
# 5. SSH无交互启动优化【BatchMode=yes 会关闭交互式密码输入,必须提前配置免密 SSH,否则 start-all.sh 批量启动失败,属于运维前置条件,非配置 bug。】
export HADOOP_SSH_OPTS="-o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=10s"
#注意:如果当前系统的ssh端口号不是默认的22端口,则需要添加对应的ssh端口号配置(如:我在Hadoop主机上配置了ssh的端口是22222)
#export HADOOP_SSH_OPTS="-p 22222 -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=10s"
# 6. 【可选,属于优化选项】各进程JVM堆内存配置,适配4G虚拟机
export HDFS_NAMENODE_OPTS="-Xmx1024m -Xms512m -Dhadoop.security.logger=INFO,RFAS"
export HDFS_SECONDARYNAMENODE_OPTS="-Xmx512m -Xms256m -Dhadoop.security.logger=INFO,RFAS"
export HDFS_DATANODE_OPTS="-Xmx512m -Xms256m -Dhadoop.security.logger=ERROR,RFAS"
export YARN_RESOURCEMANAGER_OPTS="-Xmx1024m -Xms512m"
export YARN_NODEMANAGER_OPTS="-Xmx512m -Xms256m"
export MAPRED_HISTORYSERVER_OPTS="-Xmx512m -Xms256m"
#2-创建日志与临时内容目录
mkdir -p /data/hadoop/data/logs
mkdir -p /data/hadoop/data/pids
chown -R hadoop:hadoop /data/hadoop
2.3.6、启动Hadoop
bash
#一、启动namenode服务
#1-切换到hadoop用户
su - hadoop
#2-格式化 HDFS(仅首次部署执行,重复格式化会丢失数据)
hdfs namenode -format
#3-格式化HDFS完成后,就可以启动namenode服务了
hdfs --daemon start namenode
#4-检查hadoop的namenode服务是否启动正常
#4.1-查看到所有的hadoop进程信息
jps
#4.2-查看指定的Namenode进程信息
ps -ef | grep NameNode
#4.3-查看namenode启动日志(是否有错误内容)
tail -f /data/hadoop/data/logs/hadoop-hadoop-namenode-hadoop01.log
#4.4-在浏览器输入当前hadoop所在服务器IP:9870【能够显示界面,且显示Overview 'hadoop01:9000' (active)则namenode管理服务启动成功了】
ip a
systemctl stop firewalld.service
systemctl disable firewalld
#二、启动datanode服务
hdfs --daemon start datanode
jps
ps -ef | grep DataNode
tail -f /data/hadoop/data/logs/hadoop-hadoop-datanode-hadoop01.log
#在浏览器输入当前hadoop所在服务器IP:9870【能够显示界面,且Summary下面的表格容量有数据了则datanode服务启动成功了】
#三、创建hadoop历史日志 HDFS 目录【仅首次部署执行,格式化 HDFS 完成,且Namenode与Datanode启动后执行】
#注意:如下路径必须是 HDFS 路径,不能是本地磁盘路径
hdfs dfs -mkdir -p /history/done /history/done_intermediate
# 所有者读写执行,同组可读进入,其他用户无访问权限
hdfs dfs -chmod 750 /history
hdfs dfs -chown yarn:hadoop /history
#四、启动resourcemanager服务【resourcemanager是yarn框架的服务,用于任务调度和分配】
yarn --daemon start resourcemanager
jps
ps -ef | grep ResourceManager
tail -f /data/hadoop/data/logs/hadoop-hadoop-resourcemanager-hadoop01.log
#在浏览器输入当前hadoop所在服务器IP:8088【能够显示界面则resourcemanager服务启动成功了】
#五、启动nodemanager服务【nodemanager是计算节点,主要用于分布式运算】
yarn --daemon start nodemanager
jps
ps -ef | grep NodeManager
tail -f /data/hadoop/data/logs/hadoop-hadoop-nodemanager-hadoop01.log
#在浏览器输入当前hadoop所在服务器IP:8088【能够显示界面,且Cluster Nodes Metrics表格的Active Nodes下有数字1,点击这个数字1就可以看到该节点的配置情况信息,则nodemanager服务启动成功了】
#到这里表示Hadoop的伪分布式安装部署完成了











到这里,恭喜你,Hadoop的伪分布式安装部署完成了!
三、Hadoop的基础操作测试
3.1、Hadoop的分布式存储操作测试
bash
#使用hadoop hdfs命令进行分布式存储操作测试
#1-先切换到hadoop用户下
su - hadoop
#2-创建文件并上传到hadoop的hdfs中的根目录下,并查看
echo "this is a hadoop hdfs storage test">>hadoop-hdfs.txt
hadoop fs -put hadoop-hdfs.txt /
hadoop fs -ls /
#3-给hadoop的hdfs存储创建目录、文件
hadoop fs -mkdir /testdata
hadoop fs -ls /
hadoop fs -touch /testdata/info.txt
hadoop fs -ls /
#4-在hadoop的文件进行操作与查看
echo "追加内容到文件中" | hadoop fs -appendToFile - /hadoop-hdfs.txt
hadoop fs -cat /hadoop-hdfs.txt
echo "直接覆盖文件原有内容" | hadoop fs -put -f - /hadoop-hdfs.txt
hadoop fs -cat /hadoop-hdfs.txt



3.2、Hadoop的分布式计算测试
bash
#hadoop的分布式计算测试
#hadoop安装包中附带了一个mapreduce的demo程序,可以用来做简单的mr计算
#1-在/data/hadoop/current/share/hadoop/mapreduce路径下找到hadoop-mapreduce-examples-3.5.0.jar包,我们执行一个wordcount程序,统计一批文件中,相同文件的行数。
#注意:/outwordcount是输出文件夹,必须不存在,它由程序自动创建,如果预先存在outwordcount文件夹,则会报错。
hadoop jar /data/hadoop/current/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount / /outwordcount
hadoop jar /data/hadoop/current/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar pi 20 1000000



