在数据爆炸的时代,我们每天都在产生海量的信息。从社交媒体的每一次点赞,到电商平台的每一笔交易,再到智能设备的每一条日志,这些数据如同数字世界的“新石油”,蕴含着巨大的价值。然而,如何存储和处理这些远超单机能力的数据,曾是一个巨大的技术挑战。
Apache Hadoop 的出现,彻底改变了这一局面。它作为一个开源的分布式系统基础架构,让普通服务器组成的集群也能轻松应对PB级别的数据存储与计算任务,成为了大数据领域的基石。本文将带你走进 Hadoop 的世界,了解它的核心思想、架构组成,并手把手教你搭建一个属于自己的三节点 Hadoop 集群,迈出大数据学习的第一步。
Hadoop 相关知识与文章参考:
1. 大数据概论
1.1. 大数据概述
大数据(Big Data):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决,海量数据的存储和海量数据的分析计算问题。
1.2. 大数据特点
- Volume(大量);
- Velocity(高速);
- Variety(多样);
- Value(低价值密度);
2. Hadoop概述
2.1. Hadoop是什么
简单来说,Hadoop 是一个能够让你在成百上千台廉价服务器上存储和处理海量数据的开源框架。它的核心设计思想只有两个:分布式存储和分布式计算。
- 分布式存储:将一个巨大的文件切割成许多小块,分散存储到集群中的不同机器上。
- 分布式计算:将一个复杂的计算任务拆分成许多小任务,分发到存储着对应数据块的机器上并行处理,最后汇总结果。
2.2. Hadoop特点
- 高可靠性:数据会自动创建多个副本,分散存储在不同机器上。即使某台机器宕机,数据也不会丢失,计算任务也能自动转移到其他节点继续执行。
- 高扩展性:当存储或计算能力不足时,只需向集群中添加新的服务器即可,集群能力可以近乎线性地增长。
- 高容错性:能够自动检测和处理硬件故障,无需人工干预,保证了服务的稳定性。
- 低成本:它运行在廉价的商用服务器上,无需依赖昂贵的小型机或大型机,极大地降低了大数据处理的门槛。
2.3. Hadoop发展历史
Hadoop 的诞生源于 Google 发表的两篇划时代论文:《Google File System》和《MapReduce: Simplified Data Processing on Large Clusters》。Hadoop 的创始人 Doug Cutting 受此启发,创建了 Nutch 项目的开源实现,并最终将其独立出来,成为 Apache 的顶级项目。
Hadoop 的发展经历了几个关键版本:
- Hadoop 1.x:这是早期版本,其核心是 HDFS 和 MapReduce。MapReduce 不仅负责计算,还兼管集群资源调度,耦合度高,扩展性和稳定性存在瓶颈。
- Hadoop 2.x:这是一个里程碑式的版本。它引入了YARN(Yet Another Resource Negotiator)作为独立的集群资源管理系统,将资源管理和任务调度/监控分离。这使得 Hadoop 不再仅仅是一个 MapReduce 框架,而是一个可以运行多种计算引擎(如Spark, Flink)的操作系统。
- Hadoop 3.x:当前主流版本,在2.x的基础上进行了大量优化,例如引入了纠删码(Erasure Coding)来降低存储开销,支持 Zstandard 压缩算法,并增强了 HDFS 的性能和可维护性。
2.4. Hadoop优势
相比于传统数据处理方式,Hadoop的优势显而易见:
| 对比维度 | 传统方式 (如关系型数据库) | Hadoop |
|---|---|---|
| 数据规模 | GB 到 TB 级别 | TB 到 PB 级别 |
| 数据访问 | 频繁读写,实时更新 | 一次写入,多次读取,批量处理 |
| 硬件成本 | 昂贵的高端服务器 | 廉价的商用服务器集群 |
| 计算模式 | 集中式计算 | 分布式并行计算 |
2.5. Hadoop核心组件
Hadoop 的核心架构通常被称为“三驾马车”,它们分别是 HDFS、YARN 和 MapReduce。
2.5.1. HDFS:分布式文件系统
HDFS 是 Hadoop 的存储基石,专为存储超大文件而设计。它采用主从(Master/Slave)架构。
- NameNode(主节点) :它是HDFS的“大脑”,负责管理文件系统的命名空间(元数据),记录文件被切分成哪些块(Block),以及这些块存储在哪些 DataNode 上。它不存储实际的数据。
- DataNode(从节点) :它是 HDFS 的“肌肉”,负责存储实际的数据块。它会定期向 NameNode 汇报自己存储的块信息。
当你上传一个文件到 HDFS 时,HDFS 会将其切分成固定大小的块(默认128MB),然后为每个块创建多个副本(默认3个),并分散存储在不同的 DataNode 上,从而保证数据的高可靠性。
2.5.2. YARN:集群资源管理器
YARN 是 Hadoop 2.x 引入的“大管家”,负责整个集群的资源管理和任务调度。它将 Hadoop 1.x 中 JobTracker 的资源管理和任务调度功能分离开来。
- ResourceManager(RM) :全局的资源管理器,负责整个集群的资源分配和调度。
- NodeManager(NM) :运行在每个从节点上,负责管理本节点的资源(CPU、内存),并启动和监控容器(Container)。
- ApplicationMaster(AM) :每个应用程序都有一个专属的 AM,负责向 RM 申请资源,并协调任务的执行。
- Container:资源的抽象和封装,一个任务就运行在一个 Container 里。
YARN 的出现,使得 Spark、Flink 等更多优秀的计算框架也能在 Hadoop 上运行,极大地丰富了 Hadoop 的生态系统。
2.5.3. MapReduce:分布式计算框架
MapReduce 是 Hadoop 的计算引擎,用于大规模数据集的并行处理。它的核心思想是“分而治之”,一个计算任务主要分为两个阶段:
- Map(映射)阶段:将输入的大数据集分割成独立的块,由 Map 任务并行处理,输出一系列
<key, value>键值对。 - Reduce(归约)阶段:将 Map 阶段输出的相同 key 的键值对进行汇总、合并,最终得到计算结果。
经典的“词频统计”(WordCount)就是 MapReduce 的“Hello World”程序。
3. Hadoop部署集群规划
| hadoop102 | hadoop103 | hadoop104 | ||
|---|---|---|---|---|
| HDFS | NameNode | ✔ | ||
| DataNode | ✔ | ✔ | ✔ | |
| SecondaryNameNode | ✔ | |||
| YARN | ResourceManager | ✔ | ||
| NodeManager | ✔ | ✔ | ✔ | |
| MapReduce | JobHistoryServer | ✔ |
4. Hadoop部署前期准备
在部署安装 Hadoop 之前,需要先部署好 JDK,并且,集群间需要配置免密登录。
4.1. JDK安装
- 卸载现有的 JDK。
# 查看
rpm -qa | grep java
# 卸载
rpm -qa | grep java | xargs sudo rpm -e --nodeps
- 上传 JDK 包,并解压。
tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
- 配置环境变量。
sudo vim /etc/profile.d/myEnv.sh
添加以下代码内容:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
- 集群间同步 JDK。
# 同步JDK
rsync -avz -e ssh /opt/module/jdk1.8.0_144/ linux@192.168.88.103:/opt/module/
rsync -avz -e ssh /opt/module/jdk1.8.0_144/ linux@192.168.88.104:/opt/module/
# 同步环境变量文件
sudo rsync -avz -e ssh /etc/profile.d/myEnv.sh linux@192.168.88.103:/etc/profile.d/
sudo rsync -avz -e ssh /etc/profile.d/myEnv.sh linux@192.168.88.104:/etc/profile.d/
- 分别在每个节点,刷新环境变量。
source /etc/profile
- 分别在每个节点,测试 JDK 是否安装成功。
java -version
出现 JDK 版本号,即说明 JDK 安装成功。
4.2. 集群间免密登录
- 生成密钥。
ssh-keygen -t rsa # 三次回车
- 发送公钥到其他节点。
ssh-copy-id hadoop102
该步骤,需要分别执行到其他各个节点。
- 测试配置是否成功。
ssh hadoopp103
通过 SSH 是否可以不需要密码直接连接到对应节点。
5. Hadoop集群部署
5.1. Hadoop官网
Hadoop 官网地址:hadoop.apache.org/
Hadoop 下载地址:hadoop.apache.org/releases.ht…
5.2. Hadoop版本选择
当前使用 Hadoop 版本:hadoop-3.1.3
5.3. 安装Hadoop
由于是部署三个节点的 Hadoop 集群,我们先在一台机器上部署完成,再同步其他节点。所以,以下操作,我们在hadoop102节点执行。等安装部署完成后,再同步。
- 上传 Hadoop 包,并解压到指定目录下。
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
- 配置环境变量。
sudo vim /etc/profile.d/myEnv.sh
添加以下代码内容:
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 刷新环境变量。
hadoop version
测试是否可以打印 Hadoop 版本号,如果正常打印 Hadoop 版本号,则说明部署成功。
5.4. 修改配置文件
这里由于各个组件都是单独的配置文件,所以我们这里需要修改5个配置文件,主要是:
- core-site.xml,Hadoop核心配置文件;
- hdfs-site.xml,HDFS 核心配置文件;
- yarn-site.xml,Yarn 核心配置文件;
- mapred-site.xml,MapReduce核心配置文件;
- workes,工作节点配置文件;
配置文件的目录是在$HADOOP_HOME/etc/hadoop/目录下。
5.4.1. core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!--
指定Hadoop运行时产生文件的存储目录
注:生产环境可以指定到其他目录,如挂载的数据盘等
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data/tmp</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户名为 linux -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>linux</value>
</property>
5.4.2. hdfs-site.xml
<!-- namenode web访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- secondary namenode web访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
<!-- 数据的副本数量 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
5.4.3. yarn-site.xml
<!-- Site specific YARN configuration properties -->
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</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>
5.4.4. mapred-site.xml
<!-- YARN模式,由YARN负责整个集群的资源管理和任务调度 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop104:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop104:19888</value>
</property>
5.4.5. works
由于我们是复用的三台节点,有的节点既是管理节点,同时,也是工作节点,所以,这里我们配置三个节点。
hadoop102
hadoop103
hadoop104
注意:这个文件配置时,不允许有空格和空行。
5.5. 同步Hadoop
以上“5.3 安装Hadoop”,以及“修改配置文件”两个步骤的操作,都是在hadoop102节点完成,现在将该节点 Hadoop 同步到其他节点。
# 同步Hadoop
rsync -avz -e ssh /opt/module/hadoop-3.1.3/ linux@192.168.88.103:/opt/module/
rsync -avz -e ssh /opt/module/hadoop-3.1.3/ linux@192.168.88.104:/opt/module/
# 同步环境变量文件
sudo rsync -avz -e ssh /etc/profile.d/myEnv.sh linux@192.168.88.103:/etc/profile.d/
sudo rsync -avz -e ssh /etc/profile.d/myEnv.sh linux@192.168.88.104:/etc/profile.d/
需要在 hadoop103 和 hadoop104 两个节点,分别执行hadoop version,以确定 Hadoop 是否配置成功。
5.6. 启动集群
5.6.1. 格式化NameNode
如果集群是第一次启动,需要在启动前格式化 NameNode。
在 hadoop102 节点(NameNode 所在节点)格式化 NameNode。
./bin/hadoop namenode -format
格式化后,如果输出 "successfully formatted." 信息,即格式化成功。
INFO common.Storage: Storage directory ... ... has been successfully formatted.
5.6.2. 启停HDFS
HDFS 启动的进程为 namenode 和 datanode,直接在部署了 namenode 节点(hadoop102)执行以下命令:
./sbin/start-dfs.sh
./sbin/stop-dfs.sh
单节点启停。
./sbin/hdfs --daemon [start|stop] datanode
./sbin/hdfs --daemon [start|stop] namenode
启动成功后,浏览器访问:http://192.168.88.102:9870,查看 HDFS NameNode 的管理界面。
5.6.3. 启停YARN
YARN 启动的进程为 resourcemanager 和 nodemanager,直接在部署了 resourcemanager 节点(hadoop103)执行以下命令:
./sbin/start-yarn.sh
./sbin/stop-yarn.sh
单节点启停。
./sbin/yarn --daemon [start|stop] nodemanager
./sbin/yarn --daemon [start|stop] resourcemanager
启动成功后,浏览器访问:http://192.168.88.103:8088,查看 YARN 的管理界面。
5.6.4. 启动历史服务器
启动历史服务器,直接在部署了 historyserver 节点执行以下命令。
./bin/mapred --daemon [start|stop] historyserver
启动成功后,浏览器访问:http://192.168.88.104:19888,查看历史服务器管理界面。
5.6.5. Hadoop所有进程
===== ===== hadoop102 ===== =====
5025 NodeManager
4342 NameNode
4505 DataNode
5487 Jps
===== ===== hadoop103 ===== =====
4258 ResourceManager
3829 DataNode
3997 NodeManager
4814 Jps
===== ===== hadoop104 ===== =====
3745 SecondaryNameNode
3875 NodeManager
4195 JobHistoryServer
3623 DataNode
4407 Jps
6. WordCount
启动集群后,通过 hadoop 自带的 wordcount 示例程序,测试 hadoop 集群搭建是否成功。
- 创建测试文件。
hello hadoop
hadoop hdfs
yarn
hadoop
hello
- 创建目录,并上传测试文件到 HDFS。
# 在hdfs上,创建指定目录
hadoop fs -mkdir -p /test/input
# 上传测试文件到hdfs
hadoop fs -put input.txt /test/input
- 运行 wordcount 示例程序。
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /test/input /test/output
- 查看输出。
hadoop fs -cat /test/output/*
输出结果:
hadoop 3
hdfs 1
hello 2
yarn 1
7. Hadoop端口号汇总
由于 Hadoop 有多个组件组成,每个组件都有各自的职责,它们会占用一些端口号,这里对其进行汇总一下,方便后期查看。
| 端口名称 | 端口 | 配置文件 | 配置 |
|---|---|---|---|
| NameNode内部通信端口 | 8020 | core-site.xml | fs.defaultFS |
| NameNode http端口 | 9870 | hdfs-site.xml | dfs.namenode.http-address |
| SecondaryNameNode http端口 | 9868 | hdfs-site.xml | dfs.namenode.secondary.http-address |
| YARN resourcemanager http端口 | 8088 | yarn-site.xml | yarn.resourcemanager.webapp.address |
| 历史服务器通信端口 | 19888 | mapred-site.xml | mapreduce.jobhistory.webapp.address |
8. 总结
通过这篇入门指南,我们系统梳理了大数据的核心特点与 Hadoop 的架构精髓,从理论认知到集群部署,再到WordCount 的实战演练,完整走通了 Hadoop 生态的基础链路。Hadoop 不仅是分布式存储与计算的标杆框架,更教会我们用“分而治之”的思维拆解海量数据难题。入门只是起点,后续可深入探索 Hive 数据仓库、HBase 实时存储或 Spark 内存计算,在实践中体会“数据驱动”的真正力量。