Hadoop学习笔记
一、Hadoop基础认知
1.1 什么是Hadoop
Hadoop是一个开源的、分布式的大数据处理框架,由Apache基金会开发,核心目标是高效处理海量数据(TB/PB级),适用于数据量大、数据类型复杂(结构化、半结构化、非结构化)、实时性要求不高的场景(离线计算)。
核心优势:高可靠性(多副本存储)、高扩展性(横向扩展节点)、高容错性(节点故障不影响整体任务)、低成本(基于普通服务器集群,无需高端硬件)。
1.2 Hadoop的起源与发展
源于Google的三篇核心论文(大数据领域的"三大支柱"):
-
GFS(Google File System):分布式文件系统,对应Hadoop的HDFS;
-
MapReduce:分布式计算模型,对应Hadoop的MapReduce;
-
BigTable:分布式数据库,对应Hadoop的HBase。
Apache Hadoop版本演进:主要分为1.x、2.x、3.x三个系列,目前主流使用3.x版本(解决2.x的性能瓶颈,支持更多节点、更高效的计算引擎)。
1.3 Hadoop生态系统(核心组件+周边工具)
Hadoop核心3大组件(Hadoop Core):HDFS(存储)、MapReduce(计算)、YARN(资源调度);
周边生态工具(常用):
-
HBase:分布式列式数据库,用于实时查询海量结构化数据;
-
Hive:数据仓库工具,将SQL转换为MapReduce/YARN任务,适用于离线数据分析;
-
Spark:快速通用的分布式计算引擎,速度远超MapReduce,可替代MapReduce作为计算核心;
-
ZooKeeper:分布式协调工具,负责集群的节点管理、选举、配置同步;
-
Flume:日志收集工具,用于采集、聚合、传输海量日志数据;
-
Sqoop:数据迁移工具,实现Hadoop与关系型数据库(MySQL、Oracle)之间的数据导入/导出。
二、Hadoop核心组件详解
2.1 HDFS(Hadoop Distributed File System)------分布式文件系统
2.1.1 核心作用
负责将海量数据分布式存储在集群的多个节点上,突破单台服务器的存储容量限制,同时通过多副本机制保证数据可靠性。
2.1.2 架构模型(主从架构 Master/Slave)
HDFS由3个核心角色组成,采用"一主多从"架构:
-
NameNode(NN,主节点):
- 核心职责:管理文件系统的元数据(文件名、路径、文件大小、块信息、副本数量等),不存储实际数据; - 特点:整个集群只有1个活跃的NameNode(3.x支持HA高可用,可部署备用NN),是集群的"大脑",若NN故障,整个HDFS集群无法使用; - 元数据存储:默认存储在内存中(提高查询速度),同时持久化到本地磁盘的fsimage(镜像文件)和edits(日志文件)中。 -
DataNode(DN,从节点):
- 核心职责:存储实际的数据块(Block),执行NameNode下达的读写指令(上传、下载数据); - 特点:集群中有多个DataNode(可横向扩展),每个DN将数据存储在本地磁盘上; - 数据块(Block):HDFS默认块大小(3.x)为128MB(可配置),将大文件分割成多个小Block分布式存储,小块便于并行处理和容错。 -
SecondaryNameNode(SNN, Secondary NN):
- 核心职责:辅助NameNode管理元数据,定期合并fsimage和edits文件,生成新的fsimage,减轻NN的负担; - 注意:SNN不是NN的备用节点(不能替代NN工作),3.x中可结合HA机制部署,避免NN单点故障。
2.1.3 关键机制
-
副本机制:默认副本数为3,1个副本存储在本地节点,1个副本存储在同机架的其他节点,1个副本存储在不同机架的节点,保证节点/机架故障时数据不丢失;
-
机架感知:HDFS会识别节点所在的机架,优化数据存储和读取路径,减少跨机架的数据传输(降低网络带宽压力);
-
读写流程:
- 写流程:客户端 → NameNode(申请存储路径和Block分配) → DataNode(按副本机制写入数据) → 反馈写入结果给NN; - 读流程:客户端 → NameNode(查询元数据,获取Block所在的DN节点) → 直接从DN读取数据(无需经过NN)。
2.2 MapReduce------分布式计算模型
2.2.1 核心作用
基于"分而治之"的思想,将海量数据的计算任务拆分成多个小任务,分布式运行在集群的DataNode节点上,最终汇总所有小任务的结果,得到最终计算结果(离线计算核心)。
2.2.2 核心思想与流程
MapReduce的计算过程分为两个核心阶段:Map阶段(拆分计算)和Reduce阶段(汇总计算),中间包含Shuffle阶段(数据分发与排序),整个流程由YARN调度管理。
-
Map阶段(映射阶段):
- 输入:HDFS中的数据块(Block),按行解析为键值对(Key-Value); - 处理:每个Map任务独立处理一个数据块,对输入的键值对进行过滤、转换,输出中间键值对(Intermediate K-V); - 特点:Map任务并行执行,互不依赖,无需交互。 -
Shuffle阶段(洗牌阶段):
- 核心:将所有Map任务输出的中间键值对,按Key进行分组、排序、合并,分发到对应的Reduce任务中; - 关键操作:分区(Partition)、排序(Sort)、合并(Combine)、归约(Reduce),是MapReduce的性能瓶颈(涉及大量数据传输和磁盘IO)。 -
Reduce阶段(归约阶段):
- 输入:Shuffle阶段分发的、同一Key对应的所有Value集合; - 处理:对同一Key的Value集合进行聚合、计算(如求和、计数、去重),输出最终键值对(Final K-V),写入HDFS; - 特点:Reduce任务并行执行,依赖Shuffle阶段的结果,不同Reduce任务的输出互不干扰。
2.2.3 核心特点与局限性
-
特点:易于编程(只需实现Map和Reduce函数)、高容错性(任务失败自动重试)、高扩展性(支持大规模集群);
-
局限性:实时性差(适合离线计算,延迟分钟/小时级)、不适合迭代计算(如机器学习算法)、Shuffle阶段性能瓶颈明显,目前逐渐被Spark替代。
2.3 YARN(Yet Another Resource Negotiator)------资源调度与任务管理框架
2.3.1 核心作用
Hadoop 2.x新增组件,替代1.x中MapReduce的资源调度功能,实现"资源调度与计算分离",统一管理集群的CPU、内存、磁盘等资源,为各类计算任务(MapReduce、Spark、Hive等)分配资源,调度任务执行。
2.3.2 架构模型(主从架构)
-
ResourceManager(RM,主节点):
- 核心职责:全局资源调度(管理整个集群的资源总量)、接受客户端的任务提交、分配资源给NodeManager、监控NodeManager的状态; - 组成:调度器(Scheduler)和应用程序管理器(ApplicationsManager); - 调度器:只负责资源分配,不负责任务监控和失败重试(如FIFO调度器、Capacity调度器、Fair调度器)。 -
NodeManager(NM,从节点):
- 核心职责:管理单个节点的资源(CPU、内存等)、执行ResourceManager下达的指令、启动和监控容器(Container)、向RM汇报节点状态; - 容器(Container):YARN的资源分配单元,包含一定量的CPU、内存,每个任务(Map/Reduce/Spark任务)都运行在Container中。 -
ApplicationMaster(AM,应用程序主节点):
- 核心职责:每个提交的计算任务(如一个MapReduce任务、一个Spark任务)都会对应一个AM,负责与RM协商资源、向NM申请Container、调度任务在Container中执行、监控任务状态(失败自动重试)。
2.3.3 核心流程(任务提交与执行)
-
客户端提交计算任务(如MapReduce任务)到ResourceManager;
-
RM的应用程序管理器为任务分配第一个Container,启动ApplicationMaster;
-
AM向RM注册,然后向RM协商后续任务所需的资源(Container);
-
RM将分配好的Container信息反馈给AM;
-
AM向对应的NodeManager发送指令,启动Container并执行任务;
-
任务执行完成后,Container释放资源,AM向RM汇报任务结果,RM注销AM。
三、Hadoop环境搭建(核心步骤)
Hadoop环境搭建分为3种模式,重点掌握伪分布式模式(单机模拟集群,适合学习):
3.1 环境准备(前置条件)
-
操作系统:Linux(推荐CentOS 7/8,Hadoop对Windows支持较差);
-
JDK:Hadoop依赖Java环境,需安装JDK 8(对应Hadoop 3.x,版本需匹配),配置JAVA_HOME环境变量;
-
关闭防火墙:避免集群节点之间通信受阻(学习环境可直接关闭,生产环境需配置防火墙规则);
-
免密登录:配置Linux本机免密登录(伪分布式模式需登录本机),集群模式需配置所有节点之间免密登录(ssh密钥配置)。
3.2 伪分布式模式搭建(核心步骤)
-
下载Hadoop安装包:从Apache Hadoop官网下载对应版本(如hadoop-3.3.4.tar.gz),解压到指定目录(如/opt/hadoop);
-
配置环境变量:修改/etc/profile文件,添加HADOOP_HOME、PATH等环境变量,使系统能识别hadoop命令;
-
修改Hadoop核心配置文件(位于$HADOOP_HOME/etc/hadoop目录):
- core-site.xml:配置HDFS的NameNode地址、临时文件存储目录; - hdfs-site.xml:配置副本数量(伪分布式设为1)、NameNode和DataNode的数据存储目录; - mapred-site.xml:配置MapReduce的框架(指定为yarn); - yarn-site.xml:配置YARN的ResourceManager地址、节点管理器的资源分配(CPU、内存)。 -
格式化HDFS:首次搭建需格式化NameNode(执行hdfs namenode -format),格式化后会生成元数据存储目录;
-
启动Hadoop集群:
- 启动HDFS:执行start-dfs.sh(启动NameNode、DataNode、SecondaryNameNode); - 启动YARN:执行start-yarn.sh(启动ResourceManager、NodeManager); - 查看集群状态:执行jps命令,查看所有核心进程是否启动成功。 -
验证环境:
- 访问HDFS Web界面:http://虚拟机IP:9870,查看HDFS集群状态; - 访问YARN Web界面:http://虚拟机IP:8088,查看YARN集群状态; - 运行官方示例程序(如WordCount),验证MapReduce任务能否正常执行。
3.3 常见问题
-
JDK版本不匹配:Hadoop 3.x需JDK 8,若使用JDK 11及以上会报错;
-
免密登录配置失败:导致start-dfs.sh启动时提示输入密码,需重新配置ssh密钥;
-
格式化HDFS失败:若多次格式化,会导致NameNode和DataNode的clusterID不一致,需删除数据存储目录后重新格式化;
-
进程启动失败:查看$HADOOP_HOME/logs目录下的日志文件,定位错误原因(如配置文件写错、端口占用)。
四、Hadoop核心操作(命令行+实操)
4.1 HDFS命令行操作(常用)
HDFS命令格式:hdfs dfs -命令 参数
-
目录操作:
- 创建目录:hdfs dfs -mkdir /test(创建根目录下的test目录); -
查看目录:hdfs dfs -ls /(查看根目录下的所有内容);
- 删除目录:hdfs dfs -rm -r /test(递归删除test目录,包括目录内文件)。 -
文件操作:
- 上传文件:hdfs dfs -put 本地文件路径 HDFS路径(如hdfs dfs -put /root/test.txt /test); -
下载文件:hdfs dfs -get HDFS文件路径 本地路径(如hdfs dfs -get /test/test.txt /root);
- 查看文件内容:hdfs dfs -cat /test/test.txt; - 删除文件:hdfs dfs -rm /test/test.txt。 -
其他常用命令:
- 查看HDFS磁盘使用情况:hdfs dfs -df -h; - 查看文件副本数:hdfs dfs -ls -h /test/test.txt; - 复制文件:hdfs dfs -cp /test/test.txt /test2。
4.2 MapReduce实操(WordCount示例)
WordCount是Hadoop的经典示例,功能是统计文本文件中每个单词出现的次数,完整流程如下:
-
准备输入数据:在本地创建一个文本文件(如words.txt),写入若干单词(每行一个或多个单词,用空格分隔);
-
上传输入数据到HDFS:hdfs dfs -put /root/words.txt /input;
-
运行WordCount程序(Hadoop自带示例):
命令:hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output 说明:/input是输入数据在HDFS的路径,/output是输出结果路径(必须是不存在的目录,否则报错); -
查看输出结果:
- 查看输出目录:hdfs dfs -ls /output; - 查看统计结果:hdfs dfs -cat /output/part-r-00000(part-r-00000是Reduce阶段的输出文件); -
删除输出目录(下次运行需删除):hdfs dfs -rm -r /output。
4.3 YARN常用操作
-
查看YARN集群状态:yarn node -list;
-
查看正在运行的任务:yarn application -list;
-
杀死正在运行的任务:yarn application -kill 任务ID;
-
查看任务日志:yarn logs -applicationId 任务ID。
五、Hadoop进阶知识点
5.1 HDFS高可用(HA)
Hadoop 1.x中NameNode是单点故障,一旦NN故障,整个HDFS集群无法使用。Hadoop 3.x通过HA机制解决单点故障,部署两个NameNode(Active NN和Standby NN):
-
Active NN:正常提供元数据管理和读写服务;
-
Standby NN:实时同步Active NN的元数据(通过JournalNode集群),当Active NN故障时,快速切换为Active状态,保证集群正常运行;
-
JournalNode:用于存储Active NN的edits日志,供Standby NN同步,至少部署3个节点。
5.2 HDFS Federation(联邦)
解决单一NameNode的内存瓶颈和扩展性问题,部署多个独立的NameNode(每个NN管理一部分目录,称为Namespace),共享所有DataNode的存储资源:
-
每个NameNode独立管理自己的元数据,互不干扰;
-
客户端通过挂载表(Mount Table)访问不同NameNode管理的目录;
-
适用于超大规模集群(节点数成千上万),提高集群的扩展性和可用性。
5.3 MapReduce优化
核心优化方向:减少Shuffle阶段的数据传输和磁盘IO,提高并行度,优化资源分配:
-
Map端优化:增大Map任务的输入块大小、启用Combine(在Map端提前合并相同Key的Value,减少Shuffle数据量)、优化Map任务数量;
-
Reduce端优化:优化Reduce任务数量、启用数据压缩(Shuffle阶段和输出结果压缩,减少数据传输量)、调整Reduce任务的并行度;
-
资源优化:在yarn-site.xml中调整Container的CPU、内存分配,匹配集群硬件配置。
六、常见问题与解决方案
6.1 HDFS相关问题
-
问题1:DataNode启动失败,日志提示"Incompatible clusterIDs";
解决方案:删除DataNode的数据存储目录(配置文件中指定的dfs.datanode.data.dir),重新启动DataNode(会自动同步NameNode的clusterID)。 -
问题2:HDFS上传文件失败,提示"Name node is in safe mode";
解决方案:NameNode处于安全模式(集群启动初期或故障后自动进入),等待安全模式退出,或手动退出:hdfs dfsadmin -safemode leave。
6.2 MapReduce相关问题
-
问题1:MapReduce任务执行缓慢,卡在Shuffle阶段;
解决方案:启用数据压缩、调整Map/Reduce任务数量、优化Combine操作,减少Shuffle阶段的数据量。 -
问题2:Reduce任务执行失败,提示"Out of memory";
解决方案:增大Reduce任务对应的Container内存(在mapred-site.xml中配置),或拆分Reduce任务,减少单个Reduce任务处理的数据量。
6.3 YARN相关问题
-
问题1:NodeManager启动失败,日志提示"Port already in use";
解决方案:查看端口占用情况(netstat -tunlp | grep 端口号),杀死占用端口的进程,或修改yarn-site.xml中的端口配置。 -
问题2:任务提交后,一直处于"Accepted"状态,无法进入"Running"状态;
解决方案:集群资源不足,停止无用任务,或调整YARN的资源分配(增大可用CPU、内存)。
七、学习总结与进阶方向
7.1 核心总结
Hadoop的核心是"分布式存储(HDFS)+ 分布式计算(MapReduce)+ 资源调度(YARN)",三者协同工作,实现海量数据的高效处理;
学习重点:掌握HDFS和YARN的架构、MapReduce的计算流程、环境搭建和基础操作,理解分布式系统的核心思想(容错、扩展、并行)。
7.2 进阶方向
-
Hadoop生态工具:深入学习Hive、HBase、Spark、ZooKeeper的使用和原理,掌握大数据处理的完整流程;
-
Hadoop源码:阅读HDFS和MapReduce的核心源码,理解底层实现机制(如NameNode元数据管理、Shuffle流程);
-
生产环境部署与调优:学习Hadoop集群的规模化部署、HA/Federation配置、性能调优,适应生产环境需求;
-
实时计算框架:学习Spark Streaming、Flink等实时计算框架,对比离线计算和实时计算的差异,应对不同业务场景。