简介一份Hadoop技术综述PPT课件面向大数据初学者与技术爱好者系统梳理分布式存储与计算的核心概念。内容重点包括HDFS的设计目标、块存储原理、NameNode与DataNode的主从架构及心跳机制MapReduce的编程模型、数据流过程与工作原理以及HBase的基础介绍、数据模型、行列时间戳和API接口。课件还提及HDFS的元数据持久化、Editlog与FsImage等底层机制适合用于高校课程教学、自学入门或技术分享时的提纲式资料。资源为1个PPT文件资源包仅1.03MB内容高度浓缩便于快速浏览。目前已有32人学习下载。通过这份课件读者可以快速搭建Hadoop知识框架理解分布式文件系统如何通过块与副本保障可靠性和高吞吐掌握MapReduce的“分而治之”处理思路并了解HBase作为列式非关系型数据库的应用场景为进一步阅读源码或动手实践打下基础。1. 别把 Hadoop 综述.ppt 当入门讲义它是排雷地图拿着 Hadoop 综述.ppt 去装环境很多人会折在第一步PPT 里把 HDFS、YARN、MapReduce 讲得再清楚也不等于你能把hdfs namenode -format之后的文件夹清理干净更不等于你能知道为什么datanode起不来。这份标题真正想讲的是 Hadoop 的组件协作、分布式存储计算的适用边界以及部署时的前置条件。它适合刚接手集群、准备课程设计或者在做 Hadoop 面试题时需要把“认知”转成“可执行命令”的人。我见过太多人把综述当成速查手册结果伪分布式搭建、从零开始安装 Hadoop 这些环节全部踩坑。这篇文章就按“原理—搭建—提交—集群—避坑—验证”的顺序把 PPT 里的知识点翻译成能复现的操作。2. 从理论到最小可运行Ubuntu 伪分布式搭建的完整命令与参数2.1 为什么第一步是伪分布式而不是集群Hadoop 有单机、伪分布式、完全分布式三种运行模式。单机模式只跑本地 Java 进程不启动 HDFS 和 YARN通常用来验证 MapReduce 逻辑能否编译通过伪分布式是在一台机器上用多个进程模拟分布式集群NameNode、DataNode、ResourceManager、NodeManager 分别跑在独立 JVM 里能让你看到完整的数据读写链路完全分布式需要至少三台机器适合真正承载任务。我一般会建议新手从伪分布式开始原因很实际它能把“配置错误”和“网络错误”分开。伪分布式下如果任务跑不通问题大概率出在配置参数或权限上如果你直接上集群节点之间主机名解析、防火墙、SSH 免密、副本数这些因素会同时扑过来很难定位。同时它又是参加 Hadoop 课程设计和面试前最好的演练场因为你可以在单机上把 HDFS 命令行、YARN 资源分配、MapReduce 作业调参数全部过一遍。伪分布式也有它的边界它不会帮你发现分布式环境下的网络分区问题也不会暴露时钟同步、磁盘坏道这类物理问题。所以我把这章定位成“最小可运行环境”先把管线打通再谈扩展。2.2 环境准备JDK、HADOOP_HOME 与三个数据目录在 Ubuntu 上建议使用 OpenJDK 8 配合 Hadoop 3.x。Hadoop 3.x 可以跑在 JDK 8 或 11 上但很多依赖本地库的压缩功能在 JDK 11 下表现不稳定我习惯直接固定到 JDK 8避免后续排查 Java 版本问题。安装好之后用java -version确认版本然后从 Hadoop 官网下载稳定版 tar.gz 包解压并设置环境变量。# 安装 OpenJDK 8Hadoop 3.x 下兼容性最稳 sudo apt update sudo apt install -y openjdk-8-jdk # 解压下载好的 Hadoop 包目录名简化为 hadoop tar -xzf hadoop-*.tar.gz mv hadoop-* $HOME/hadoop # 写入环境变量注意 JAVA_HOME 路径以实际安装为准 echo export HADOOP_HOME$HOME/hadoop ~/.bashrc echo export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin ~/.bashrc echo export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 ~/.bashrc source ~/.bashrc # 验证环境 hadoop version这里HADOOP_HOME的路径决定了后面所有脚本去哪找配置文件。bin目录里有hdfs、yarn客户端命令sbin目录里有start-dfs.sh、start-yarn.sh这类启停脚本。JAVA_HOME 如果配错启动时会出现JAVA_HOME is not set或者Cannot find Java我建议你配置完先执行hadoop version如果这个命令能打出版本号说明环境变量基本正确。数据目录方面Hadoop 默认把元数据和数据块写在/tmp下重启机器会被清掉。所以我在用户目录下建了hadoopdata目录下设namenode、datanode、tmp三个子目录分别存放 NameNode 元数据、DataNode 数据块和临时文件。这样可以避免因为/tmp被清理导致集群丢失元数据的尴尬。2.3 四个核心配置文件的修改要点Hadoop 的核心配置文件都在$HADOOP_HOME/etc/hadoop下。伪分布式只需要改四个core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。我建议直接重写这些文件不要留模板里的其他属性否则后排查会很绕。mkdir -p $HOME/hadoopdata/{tmp,namenode,datanode} cat $HADOOP_HOME/etc/hadoop/core-site.xml EOF ?xml version1.0? configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name valuefile:${user.home}/hadoopdata/tmp/value /property /configuration EOF cat $HADOOP_HOME/etc/hadoop/hdfs-site.xml EOF ?xml version1.0? configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:${user.home}/hadoopdata/namenode/value /property property namedfs.datanode.data.dir/name valuefile:${user.home}/hadoopdata/datanode/value /property /configuration EOF cat $HADOOP_HOME/etc/hadoop/mapred-site.xml EOF ?xml version1.0? configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration EOF cat $HADOOP_HOME/etc/hadoop/yarn-site.xml EOF ?xml version1.0? configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configuration EOFfs.defaultFS决定了客户端默认连接的 HDFS 地址这里使用hdfs://localhost:9000端口要和 NameNode 的 RPC 端口保持一致。hadoop.tmp.dir指向临时目录我把它放在hadoopdata/tmp下避免系统临时目录被清理。dfs.replication在伪分布式下必须设为 1否则单个 DataNode 上存不下两份副本写文件会一直等待副本确认。dfs.namenode.name.dir和dfs.datanode.data.dir分别指定 NameNode 和 DataNode 的数据目录这两个路径一定要提前建好Hadoop 不会自动补全层级目录。mapreduce.framework.name设为yarn表示 MapReduce 作业交给 YARN 调度yarn.nodemanager.aux-services设为mapreduce_shuffle这是 Shuffle 阶段必须的辅助服务不配会导致 Reduce 任务无法拉取 Map 输出。2.4 格式化、启动与进程验证配置完成后第一件事是格式化 NameNode不是直接启动。格式化会生成集群 ID 和 NameNode 的初始元数据只做一次。如果不是第一次启动格式化前需要把namenode和datanode目录清空否则新的集群 ID 会和旧的 DataNode 记录不一致导致 DataNode 注册不上。# 格式化 NameNode注意只在第一次或者确认清空数据目录后执行 hdfs namenode -format # 启动 HDFS 和 YARN $HADOOP_HOME/sbin/start-dfs.sh $HADOOP_HOME/sbin/start-yarn.sh # 查看 Java 进程应该看到 NameNode、DataNode、ResourceManager、NodeManager jps启动后jps输出里至少要有四个进程NameNode、DataNode、ResourceManager、NodeManager。如果只是多了SecondaryNameNode但没有DataNode基本是数据目录没清干净或者dfs.datanode.data.dir权限不对。注意格式化这一步是很多新手的第一个坑格式化过程会重新生成元数据如果你在已有数据的集群上执行它相当于把文件系统的“根目录账本”换掉DataNode 上残留的数据块会变成孤儿块结果就是目录能打开但文件全丢。所以伪分布式环境里格式化前先确认你不需要旧数据。启动完成后用hdfs dfsadmin -report看 DataNode 是否在线再用hdfs dfs -mkdir -p /tmp验证 HDFS 可写。3. 提交作业到 YARNWordCount 跑通后的链路与两个必调参数3.1 YARN 任务提交链路从 jar 到 ApplicationMaster很多资料把 YARN 讲成“资源调度器”但落到作业提交时你需要理解一条完整链路客户端把打包好的作业提交给 ResourceManagerRM 在某个 NodeManager 上启动一个 ApplicationMasterAMAM 再向 RM 申请容器RM 把可用的 NodeManager 和内存分配给 AMAM 把 Map、Reduce 任务调度到这些容器里执行。这条链路中最容易出问题的一环是 AM 拿不到足够的资源。如果yarn.nodemanager.resource.memory-mb设置得太小比如只有 2GB而你的 Map 任务默认申请 1GB、Reduce 任务默认申请 1GB那么一台节点上同时运行多个任务时会很快耗尽内存。更隐蔽的是yarn.scheduler.maximum-allocation-mb这个值限制单个容器能申请的最大内存如果它小于 Map 或 Reduce 任务的内存请求任务会一直等待资源表现为一直 Accepted 但没有 Task 启动。所以在向 YARN 提交任何真实作业前先想清楚你的作业是 CPU 密集还是内存密集。单纯跑 WordCount核心参数用默认值就能过但生产作业往往需要把每个 Map 容器、Reduce 容器的内存边界调清楚否则集群会变成“看起来活着实际上什么都不跑”。3.2 用 HDFS 准备数据并跑通 WordCountHadoop 安装包自带hadoop-mapreduce-examples示例 jar不需要写代码就能验证完整流程。先把本地文件上传到 HDFS再执行 WordCount。# 创建输入目录并上传 Hadoop 的配置文件作为测试输入 hdfs dfs -mkdir -p /input hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /input # 提交 WordCount输出目录不能已存在 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \ wordcount /input /output # 查看统计结果 hdfs dfs -cat /output/part-r-00000命令里的hadoop-mapreduce-examples-*.jar需要和你解压出来的包一致如果你的 shell 里没有通配符匹配可以直接用ls查看实际文件名再完整写上。/output目录必须不存在否则 MapReduce 框架会因为“输出目录已存在”直接报错这是框架故意设计的安全机制防止覆盖上一轮结果。WordCount 跑通后用yarn application -list可以看到作业状态用yarn application -status applicationId看具体进度。如果你想要最基本的调参验证可以在mapred-site.xml里把mapreduce.map.memory.mb从 1GB 调到 2GB再重跑同一个作业观察 YARN UI 里容器资源的变化。3.3 两个必调的内存参数mapreduce 容器与 NodeManager 上限Hadoop 内存参数很容易搞混我这里给出一组最小映射关系yarn.nodemanager.resource.memory-mb决定每个 NodeManager 总共可分配的内存yarn.scheduler.maximum-allocation-mb决定单个容器最大能申请多少内存mapreduce.map.memory.mb和mapreduce.reduce.memory.mb决定每个 Map 和 Reduce 容器请求多少内存。参数默认值作用典型调整思路yarn.nodemanager.resource.memory-mb8192单节点 YARN 可用内存设为物理内存减去系统预留后的值yarn.scheduler.maximum-allocation-mb8192单个容器最大内存必须大于等于 Map/Reduce 的最大值mapreduce.map.memory.mb1024每个 Map 容器内存数据倾斜时调大到 2048mapreduce.reduce.memory.mb1024每个 Reduce 容器内存排序合并阶段内存大时调大我一般这样设如果节点物理内存 8GB就把yarn.nodemanager.resource.memory-mb设为 6GB系统预留 2GB 给操作系统和 HDFS 进程yarn.scheduler.maximum-allocation-mb设为 4GBMap 和 Reduce 容器都设为 2GB。这样单个容器不会超过 4GB同时 Map 和 Reduce 各自的 2GB 都能被调度器接受。还有一个细节容易被忽略mapreduce.reduce.memory.mb设置过大时YARN 在启动 Reduce 容器前会检查剩余资源如果剩余资源不足Reduce 会一直等。这时 YARN UI 上往往能看到很多Reduce Pending状态原因是资源碎片化。解决办法是把 Map 和 Reduce 的容器内存设置成相同值减少碎片。4. 搭两节点集群从 localhost 到 hostname 的配置迁移4.1 从伪分布式到集群真正变化的只有三个地方伪分布式跑通后很多人误以为把localhost改成机器 IP 就是集群。实际上真正的变化只有三个一是客户端和节点间通过主机名而不是 IP 互相识别二是 NameNode 和 DataNode 的注册地址从localhost改成集群内的 master 主机名三是 YARN 的 ResourceManager 地址需要显式指定到 master 节点。我见过不少人在虚拟机里做 Hadoop 集群搭建直接在core-site.xml里把fs.defaultFS写成hdfs://192.168.56.101:9000。这样客户端是能连上但 DataNode 启动时会拿着自己的主机名去 NameNode 注册如果/etc/hosts没配好注册会被拒绝。所以第一步不是改 XML而是把每台机器的主机名和 IP 映射写进/etc/hosts。# 三台机器都要执行 echo 192.168.56.101 master /etc/hosts echo 192.168.56.102 data /etc/hosts同时要在 master 上配置对 data 节点的 SSH 免密登录因为start-dfs.sh和start-yarn.sh脚本会 SSH 到所有 worker 节点启动进程。如果免密没配置你会看到集群只启动了 master 本机的进程其他节点啥都没有。4.2 修改 core-site、yarn-site 与 workers 文件在两节点集群里我习惯把 master 部署 NameNode、SecondaryNameNode、ResourceManagerdata 节点部署 DataNode、NodeManager。在 master 上修改三处配置然后把整个etc/hadoop目录同步到 data 节点。# master 上的 core-site.xml关键改动是 fs.defaultFS cat $HADOOP_HOME/etc/hadoop/core-site.xml EOF ?xml version1.0? configuration property namefs.defaultFS/name valuehdfs://master:9000/value /property property namehadoop.tmp.dir/name valuefile:${user.home}/hadoopdata/tmp/value /property /configuration EOF # master 上的 yarn-site.xml指定 ResourceManager 主机名 cat $HADOOP_HOME/etc/hadoop/yarn-site.xml EOF ?xml version1.0? configuration property nameyarn.resourcemanager.hostname/name valuemaster/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.resource.memory-mb/name value4096/value /property /configuration EOF # 在 Hadoop 3.x 中worker 文件替代了 slaves echo data $HADOOP_HOME/etc/hadoop/workers然后同步配置到 data 节点。注意 data 节点的JAVA_HOME和HADOOP_HOME必须与 master 一致否则远端启动脚本找不到 Java。scp -r $HADOOP_HOME/etc/hadoop datadata:$HADOOP_HOME/etc/同步后在 master 上执行hdfs namenode -format格式化。这个操作只需要在 master 做一次格式化生成的 clusterID 会被 data 节点注册时自动学习。然后执行$HADOOP_HOME/sbin/start-dfs.sh $HADOOP_HOME/sbin/start-yarn.sh启动后用hdfs dfsadmin -report确认 DataNode 在线用yarn node -list确认 NodeManager 在线。如果 data 节点没有进程去 data 节点的$HADOOP_HOME/logs目录看日志最常见问题是 SSH 免密失效或权限拒绝。4.3 高可用扩展ZooKeeper 只是给 NameNode 加了一把锁Hadoop 和 ZooKeeper 整合最常见的目的是给 NameNode 做自动故障切换。NameNode 本身是无状态的但它的元数据只能有一个 Active 节点写入ZooKeeper 在这里的作用是保存 Active 节点是谁以及提供一个锁防止两个节点都认为自己是 Active即脑裂。很多教程会把 ZooKeeper 和 HDFS 绑在一起讲但其实 ZooKeeper 不参与数据读写只参与选举和状态存储。要做整合首先要有三台 ZooKeeper 节点组成一个 quorum我一般会单独部署在三台机器上。配置好zoo.cfg并启动后需要把 HDFS 的core-site.xml和hdfs-site.xml增加 HA 相关属性包括dfs.ha.namenodes、dfs.namenode.rpc-address、dfs.client.failover.proxy.provider然后执行# 初始化 ZooKeeper 中的 HA 状态注意 ZooKeeper 必须已经启动 hdfs zkfc -formatZK这一步是 Hadoop 和 ZooKeeper 整合的入口。格式化结束后重启 HDFS两个 NameNode 会开始互相探测其中一台会成为 Active。如果zkfc格式化失败通常不是命令问题而是core-site.xml里没有指定ha.zookeeper.quorum指向你的 ZooKeeper 地址。如果你只是搭测试集群不要求 HA 的话不要贸然加这些参数否则单节点模式下 NameNode 会进入 Standby 状态客户端写入时会报Operation category READ is not supported in state standby。5. 避坑清单五个 Hadoop 环境搭建中的常见翻车现场5.1 格式化 NameNode 后DataNode 一直不注册现象jps里能看到 NameNode 和 DataNode但hdfs dfsadmin -report显示只有 0 个存活 DataNode查看 DataNode 日志报java.io.IOException: Inconsistent clusterIDs。原因格式化 NameNode 会生成新的 clusterID而 DataNode 数据目录里保存的是旧 clusterID两个 ID 对不上DataNode 拒绝注册。解决先停掉 HDFS删除dfs.datanode.data.dir指向目录下的所有内容再重新格式化 NameNode 并启动。注意这招只能在测试环境用生产环境清掉 DataNode 数据等于丢数据块绝不能用“格式化大法”解决生产故障。5.2 YARN 作业一直 Accepted迟迟不启动 Task现象yarn application -list能看到作业状态停在 ACCEPTED但 YARN UI 里没有运行的容器也没有错误日志。原因ApplicationMaster 申请不到容器。最常见的是yarn.nodemanager.resource.memory-mb设得太大比如给 NodeManager 分配的内存超过物理机总量实际 NodeManager 根本没有这么多内存可分配或者mapreduce.map.memory.mb超过yarn.scheduler.maximum-allocation-mb导致任务请求永远无法被满足。解决先检查物理机剩余内存把yarn.nodemanager.resource.memory-mb调小到实际可用值再把yarn.scheduler.maximum-allocation-mb调到所有任务容器请求的最大值之上。最稳妥的做法是让 Map 和 Reduce 容器内存一致并预留 20% 的节点内存给系统。5.3hadoop jar报 “Could not find or load main class”现象命令能执行但抛Error: Could not find or load main class如果打开-verbose可以看到 CLASSPATH 里压根没有 MapReduce 框架包。原因示例 jar 文件名里包含版本号你的通配符*.jar在当前目录没有匹配成功或者HADOOP_CLASSPATH没有被正确加载。这种情况在从官网下载新版本后尤其常见因为开发环境里存在多个 Hadoop 版本环境变量串了。解决先用ls $HADOOP_HOME/share/hadoop/mapreduce/确认示例包实际文件名再完全写出路径执行不要依赖通配符。也可以执行hadoop classpath查看当前 CLASSPATH再决定是不是要把HADOOP_CLASSPATH写进~/.bashrc。5.4 HDFS 客户端写文件时偶发 standby 错误现象向 HDFS 写文件时报Operation category READ is not supported in state standby但集群里只部署了一个 NameNode并没有配置 HA。原因配置里残留了 HA 参数例如dfs.ha.automatic-failover.enabledtrue或者服务端存在一台废弃的 Standby NameNode 配置导致客户端把写请求路由到了非 Active 节点或错误地址。解决检查hdfs-site.xml把 HA 相关属性全部移除。如果只想在测试环境实验 HA至少保证dfs.namenode.rpc-address指向 Active 节点的主机名并用hdfs haadmin -getAllServiceState查看两个 NameNode 当前状态。5.5 ZooKeeper 整合后NameNode 状态一直 Standby现象完成hdfs zkfc -formatZK后两个 NameNode 都无法变成 Active日志提示FailoverController获取锁超时。原因ZooKeeper 集群本身没有健康运行或者ha.zookeeper.quorum配置的地址不可达。很多人在同一台机器上起了三个 ZK 进程以为就是集群结果端口 2181 被第一个进程占死后面两个进程根本没起来。解决在每台 ZooKeeper 节点用zkServer.sh status确认Mode: leader或Mode: follower再用echo ruok | nc 127.0.0.1 2181检查响应。确认三个节点都正常后再重新执行hdfs zkfc -formatZK。注意zkfc不是 HDFS 进程它的职责只是维护 NameNode 在 ZooKeeper 中的状态不要把它和 NameNode 本身混在一起排查。6. 进阶技巧用 jps nc HDFS 命令验证集群健康到了线上环境我不会一上来就看大日志文件而是先用三个命令快速圈定问题范围jps看进程nc看端口hdfs dfsadmin -report看节点状态。这三个命令组合起来能覆盖 80% 的假死场景。#!/usr/bin/env bash # 在所有节点上查看 Java 进程 for host in master data; do echo $host ssh $host jps -lm done # 检查 NameNode RPC 和 ResourceManager Web UI 端口 nc -zv master 9000 nc -zv master 8088 # 检查 HDFS 节点状态 hdfs dfsadmin -report # 检查 YARN 节点状态 yarn node -listjps -lm会显示进程完整主类名和启动参数一眼就能看出进程是否带上了正确的配置路径。nc -zv用来确认 TCP 端口是否通如果进程存在但端口不通问题多半在防火墙或者监听地址配置比如fs.defaultFS里写的是master:9000但 NameNode 实际监听的是localhost。hdfs dfsadmin -report里能看到 NameNode 的 ID、好节点数和坏节点数如果 Live DataNodes 数量不对再去对应节点的日志里查具体原因。我还有一个习惯每次改完配置不急着跑大任务先放一个 100 字节的小文件进去跑一次最简 MapReduce 看全链路是否通。小文件跑通了再逐渐加数据量这样能避免把数据倾斜和配置问题混在一起。如果小文件也失败就用上面的三句话定位如果小文件成功但大文件失败重点看内存和磁盘 IO而不是配置语法。在集群环境里待久了你会发现很多所谓“玄学问题”其实都是进程假死、端口占用、主机名解析不一致。排障时先别动数据目录先记录日志时间戳再决定要不要重启。我早年吃过亏一键格式化救活了进程却丢了一整天的测试数据后来所有实验环境都约定格式化等于放弃数据必须经过确认才能执行。希望帮到你。本文还有配套的精品资源点击获取