做这一行的人大多有个感受,学大数据绕不开 Hadoop,面试问大数据也绕不开 Hadoop。这篇稿子是《跟韩工学 Hadoop 系列》的第 002 篇,属于简介部分的翻译整理版。内容不是我临时拍脑袋写的,而是把韩工多年带项目的笔记、讲课时候的原话、以及实际踩坑记录做了汇总,更适合新手先把 Hadoop 的骨架搭起来。这个系列适合谁看?打算入行大数据、备战面试、做课程设计、或者刚接手集群被各种组件搞晕的人。看完这一篇,你至少能回答清楚三件事:Hadoop 到底解决什么问题、它由哪些核心部件组成、以及我该从哪个版本和环境开始动手。
1. 为什么学 Hadoop,先搞清楚它解决什么问题
1.1 先想想“大数据”背后的三个痛点
很多人一上来就装 Hadoop,装了之后又觉得它只不过是个能存能算的文件系统,没什么特别。问题出在起点,你没搞明白它为什么被设计出来,所以你装完之后不知道往哪个方向用。
我习惯把大数据场景下的问题压缩成三个痛点:第一是存不下,单台服务器硬盘再大也有上限,而且数据增长速度远大于硬盘扩容速度;第二是算不动,数据存下来了,但单机 CPU 和内存根本没法在合理时间内完成统计;第三是“坏不起”,机器越多故障越频繁,这在物理上无法避免,如果一台机器坏了整个系统就瘫痪,这个系统没法用。
Hadoop 对这三个痛点的回答分别是:HDFS 把数据切成块分散到多台机器上,逻辑上是一块大硬盘,物理上每台机器只承担一小部分;MapReduce 把计算任务分给多台机器并行跑,再把结果合并回来;数据块默认有多个副本,某台机器坏了,系统自动从其他副本恢复,不影响业务。这才是 Hadoop 的底层逻辑——分布式存储、分布式计算、自动容错。
1.2 Hadoop 不是一台机器,而是一套“全家桶”
很多新手把 Hadoop 理解成“一个大软件”,这个比喻是错的。Hadoop 更像一个家庭:HDFS 负责仓储,MapReduce 负责加工车间,YARN 负责调度和管理车间里的工人和原料。再加上后续不断加入的各种家庭成员,比如 Hive、HBase、Spark,这已经是一套庞大的生态。
所以学 Hadoop 的时候,我建议你在心里把它分成“底子”和“上层应用”。底子就是 HDFS、MapReduce、YARN,这三个是 Hadoop 的根,任何发行版都包含。上层是后来长出来的各种工具,有的为了让你少写 Java,有的为了让你能实时查询,有的为了你做数据仓库更方便。先打底子,再谈上层,学习路径会清晰很多。
提示:面试时如果被问到“Hadoop 是什么”,别只背教科书定义。先说它解决什么问题,再拆成哪几块,每块干什么,最后补一句它是怎么实现容错和并行计算的。这种回答方式才像干过活的人,而不是背笔记。
2. Hadoop 核心组件与架构拆解
2.1 HDFS:存储层的“分布式文件系统”
HDFS 全称 Hadoop Distributed File System,说人话就是一台“逻辑上的超大硬盘”。它把文件切分成固定大小的块,默认块大小在 Hadoop 2.x 以后是 128MB,然后分散存储在集群的不同节点上。
HDFS 的架构是主从模式,一个 NameNode 加多个 DataNode。NameNode 管元数据,你可以把它理解成一本字典,记录着“哪个文件被切成哪些块、这些块在哪台机器上”。DataNode 就是真正存数据的工人,负责读写数据块,并定期向 NameNode 汇报状态。
要特别注意几件事:NameNode 是单点,它挂了整个 HDFS 就不可用了,这是 Hadoop 1.x 时代很痛的问题,后来用 HA(High Availability)架构配合 Zookeeper 解决;数据块的副本数默认是 3,但这不是死规定,如果你只是做课程设计、压根没有三台机器做真正意义的冗余,完全可以改成 2 甚至 1;NameNode 元数据需要持久化,靠的是 FsImage 和 EditLog 两个文件,生产上如果配置不当,重启元数据丢失非常酸爽。
2.2 MapReduce:计算层的“分而治之”
MapReduce 是 Hadoop 的计算引擎,核心思想就四个字:分而治之。Map 阶段把任务拆成多个小任务,让它们在不同节点上独立执行;Reduce 阶段把 Map 的结果汇总、排序、合并,最终输出最终结果。
比如你有一堆日志文件,想统计每个关键词出现了多少次。Map 阶段会把每行文本拆成单词,输出“单词, 1”这样的键值对;Reduce 阶段把所有相同单词的计数加起来,输出“单词, 总次数”。这个模型在设计上非常简单,但正因为简单,所以它能应对各种非结构化数据任务,也容易做到并行。
不过我得提醒你,在实际业务里直接写 MapReduce 的 Java 代码非常痛苦。一次简单统计,代码量动辄一两百行,调试还麻烦。所以后来出现了 Hive,把 SQL 翻译成 MapReduce 任务;再后来 Spark 出现之后,很多场景直接用 Spark 取代了原生 MapReduce 计算。但这不代表 MapReduce 不用学,因为 MapReduce 是理解分布式计算最佳入口,很多公司的老旧任务还在跑,面试也爱问它的 shuffle 过程。
2.3 YARN:资源调度层的“管家”
YARN 是 Hadoop 2.x 才引入的资源管理器,它的作用是把集群的 CPU、内存统一管理起来,然后按需分配给跑在上面的任务。没有 YARN 之前,资源是被人为分块的,没用上的资源闲着,用上的资源还可能互相抢;YARN 把资源做成统一池子,谁要用就申请,用完就释放。
它的架构也是一个主从模式:ResourceManager 管全局,NodeManager 管每台机器上的资源。每个任务会有一个 ApplicationMaster,负责和 ResourceManager 协商资源、监督任务执行。YARN 最聪明的一点是它把自己设计成了“通用的操作系统”,不光是 MapReduce,Spark、Flink 都能跑在 YARN 上。所以在生产环境里,你经常会看到一套 Hadoop 集群上同时跑着好几种计算引擎,靠的就是 YARN。
从运维角度讲,YARN 调度器有三种实现:FIFO、Capacity、Fair。我见过的中小企业大多用 Capacity 调度器,把生产队列和测试队列隔开,避免测试任务把生产资源吃干净。如果你们公司追求多租户公平使用,Fair 调度器更合适。这块内容在你做集群搭建和调优时一定会碰到。
3. Hadoop 生态圈与主流版本选型
3.1 生态圈里常用组件一句话认清
Hadoop 生态圈很像一个小区:有了底层的存储和计算(HDFS、MapReduce、YARN),就会有人在这个基础上盖各种楼。你不需要一开始全部掌握,但至少要知道每栋楼是干嘛的,这样看招聘 JD 和做技术选型时才不慌。
| 组件 | 作用 | 一句话理解 |
|---|---|---|
| Hive | 数据仓库 | 把 SQL 翻译成 MapReduce/Tez/Spark 任务,你会写 SQL 就会做离线统计 |
| HBase | NoSQL 数据库 | 在 HDFS 之上提供随机读写能力,适合海量数据的实时查询 |
| Zookeeper | 分布式协调服务 | 管节点状态、做分布式锁、给 HA 提供选主能力 |
| Spark | 内存计算引擎 | 比 MapReduce 快很多,适合迭代计算、机器学习特征处理 |
| Flink | 流式计算引擎 | 毫秒级实时处理,适合实时报警、实时大屏 |
| DistCp | 数据拷贝工具 | Hadoop 自带的集群内/跨集群大规模数据复制工具 |
| Sqoop | 数据迁移工具 | 在关系型数据库和 HDFS 之间互导数据 |
很多人在网上搜“Hadoop 和 Zookeeper 怎么整合”,其实就是把 Zookeeper 部署好之后,修改 HDFS 和 YARN 的高可用配置,让主节点自动切换。课程设计和真实生产环境里都很常见,后面我专门写一篇实操。
还有一点值得提醒:HBase 虽然跑在 HDFS 上,但它有自己的 RegionServer 进程,有自己的架构逻辑。你不能把它理解成“HDFS 上加了索引”,它和 HDFS 的配合关系比这复杂得多。如果只是为了做一次性离线分析而引入 HBase,大概率是杀鸡用牛刀。
3.2 版本选型:社区版还是发行版,选 Apache 还是 CDH
新手问得最多的一个问题:“我该装哪个版本?”这问题看似简单,选错了后面全是坑。
如果只是为了学习,我建议选 Apache 社区版,版本号选 Hadoop 3.3.x 或 3.4.x,原因很简单:文档全、踩坑贴多、兼容生态周全,随便搜一个问题都有答案。不要去装 1.x,太老,很多新特性都没有,学习价值低;也不建议一上来就搞 2.7,虽然十年前它是神,但你要跟新工具做整合时,各种 JAR 包冲突能让你崩溃。
如果是公司生产环境,一般不会直接裸用 Apache 社区版,更多是买商业发行版或自建发行版。Cloudera 的 CDP、Hortonworks 的 HDP、以及国内云厂商的 EMR,都是把 Hadoop 生态里一堆组件做兼容性测试再打包发布,配上管理界面和运维脚本。虽然商业版有授权费用,但它省下来的运维成本通常远大于授权费。
还有一个思路值得考虑:用 Docker 镜像跑 Hadoop。本地没那么多机器,想快速起一个三节点集群做 demo,拉一个 Hadoop 镜像配合 docker-compose,十几分钟就能搞定。热词里搜“hadoop 的 docker 镜像”的人很多,说明这个需求非常普遍。但注意,Docker 里的 Hadoop 适合学习、测试和给客户做演示,不敢说适合长期跑生产。
4. 小白上手 Hadoop:环境搭建与常见玩法
4.1 伪分布式与集群模式怎么选
Hadoop 有两种典型部署方式:伪分布式(Pseudo-Distributed)和完全分布式(Cluster Mode)。
伪分布式其实就是在一台 Linux 机器上,让 HDFS 的 NameNode、DataNode,YARN 的 ResourceManager、NodeManager 都作为一个独立的 Java 进程跑在同一台机器上。它和你未来要维护的集群在配置层面非常接近,但物理上只有一台机器。
我特别建议新手先从伪分布式开始,原因是排查问题成本低。你改配置、重启进程,全部在一台机器上完成;如果是集群,配置同步、节点间网络、权限问题会叠加在一起,出了问题你根本分不清是哪一环。
等你把伪分布式跑顺了,再处理这几件事:准备三台或更多虚拟机,配好 SSH 免密登录,把 core-site.xml、hdfs-site.xml、yarn-site.xml 改成真正的主从结构,启动顺序从先格式化 NameNode 开始,然后逐步启动 HDFS 和 YARN。做过一遍集群模式,你对“分布式”的理解会上一个台阶。
提示:不要在一开始就把目标和热度捆绑起来。搜“Hadoop 分布式集群搭建”的视频一大堆,但我见过太多人照着敲一遍,配置全对却还是起不来,最后发现是/etc/hosts 里机器名映射写错。基础网络问题和 JDK 版本问题,占了新手失败原因的七八成。
4.2 安装配置的注意点和常见问题清单
我把安装过程里的高频坑整理成一张自查表,你照着一条条检查,大概率能少熬几个通宵。
| 检查项 | 说明 | 常见坑 |
|---|---|---|
| JDK 版本 | 必须和 Hadoop 版本兼容,通常装 Hadoop 3.x 配 JDK 8 或 JDK 11 | 直接装 JDK 17,部分组件会报不兼容 |
| SSH 免密 | 集群节点间必须免密登录 | 没配置 ssh-copy-id,启动时反复要密码 |
| core-site.xml | 最核心的是 fs.defaultFS | 写成了 localhost,导致跨节点访问失败 |
| hdfs-site.xml | 指定 NameNode 和 DataNode 数据目录 | 用默认目录,格式化后数据残留,重启报错 |
| 环境变量 | HADOOP_HOME、PATH 必须配置正确 | 配了但没 source,命令找不到 |
| 防火墙 | 节点间的端口必须放行 | 默认防火墙拦掉 DFS 心跳和 RPC 通信 |
| NameNode 格式化 | 只在第一次初始化时执行 | 反复执行,元数据丢失引发连锁问题 |
再说一个我亲测很稳的学习路线:先在 VM 虚拟机里装 CentOS 或 Ubuntu,把 Hadoop 的 tar 包解压、改配置、启动、执行一个 wordcount 测试;跑通之后,再用 Docker 镜像快速搭建一个多节点集群练手;最后如果时间和精力够,再用三台云主机或者本地虚拟机搭一个完全分布式集群,顺便把 Zookeeper 也装上去,体验一下 HA 切换。这个过程下来,你对“分布式”的理解绝对超过大多数培训班学员。
4.3 DistCp:一个必须会的底层工具
很多人做数据迁移时第一反应是 scp 或者 rsync,但在 Hadoop 集群之间复制海量数据,这些工具并不可靠,也不适合。Hadoop 自带的 DistCp(Distributed Copy)是更专业的选项。
DistCp 的原理是基于 MapReduce 做分布式拷贝,它会把复制任务拆分成多个 Map 任务并行执行,所以几十 TB 的数据复制速度明显比单机 scp 快得多。基础用法是:
hadoop distcp hdfs://源集群:8020/data hdfs://目标集群:8020/data常用参数我整理一下:-m指定并行的 Map 数;-overwrite覆盖目标路径已存在的文件;-update只同步那些源端有变化或新增的文件;-delete删除目标端多余文件,保持两目录完全一致。这组参数是面试常客,也是实际运维必须掌握的。
有一点要特别注意:跨集群执行 DistCp 时,最好在目标集群的一台机器上执行命令,不要隔着一层跳板机操作,否则可能的“当前用户身份不一致”或认证问题会让你排查到头秃。
5. 面试高频点、课程设计与实战建议
5.1 面试题高频点:别再背概念,要有逻辑
从搜索结果来看,“Hadoop 面试题”是搜索热词,说明大家在面试前最需要的是“问什么、怎么答”。我总结几个面试官真正会考的方向,并给出答题思路:
第一个是“HDFS 读写流程”。不要只背“Client 联系 NameNode,NameNode 返回 DataNode 列表”这种骨架,要能说出细节:写文件时按块写入,写完一个块后由第一个 DataNode 流水线式复制给第二个、第三个;读文件时是就近读取,如果本机存有副本就直接本机读,否则按网络距离选择 DataNode。
第二个是“MapReduce 的 Shuffle 过程”。这是面试重灾区。你要能在黑板上画出:Map 输出后先写入环形缓冲区,达到阈值就溢写到本地磁盘,分区、排序、合并,然后 Reduce 端拉取属于自己分区的数据,再归并排序,最后才进 Reduce 函数。
第三个是“NameNode 宕机了怎么办”。先回答单点问题,再引出 HA 架构:多个 NameNode 通过 Zookeeper 选主,Active 节点挂了,Standby 节点自动接管,虚拟 IP 平滑切换。如果还知道 edit log 需要多个 JournalNode 共享,基本可以拿高分。
第四个是“为什么 Hadoop 1.x 慢,2.x 有哪些改进”。这时候你要提到 YARN 的出现,把资源调度和计算框架解耦。再说 3.x 里支持了 Erasure Coding、多个 NameNode 等新特性,就会显得你有持续跟进。
5.2 课程设计场景:从零做一个拿得出手的项目
“Hadoop 课程设计”和“基于 Hadoop 的……”这类热搜词说明很多人要交课程作业,但不知道怎么定题。以我的经验,课程设计切忌选太空泛的题目,比如“基于 Hadoop 的电商数据分析平台”这种,听起来高大上,实际上你很难做深。
我给你一套更容易落地的题目组合:数据选公开数据集,比如某电商平台的用户行为日志、某城市的出租车轨迹数据、某网站的访问日志。清洗和统计用 Hive 或 Spark SQL,把结果写入 MySQL,再套一个简单的可视化页面。如果要拿高分,额外加一个用 MapReduce 手写 WordCount 或倒排索引的环节,让老师看到你确实掌握了底层原理。
这里有个很关键的加分点:别只展示“我跑通了”。你要在报告里写清楚你遇到了什么问题、怎么排查的、最后的结论是什么。比如“集群节点时钟不同步导致任务失败,改用 NTP 同步解决”这种真实排障经历,比你列十个功能点更有说服力。
5.3 一条从入门到实战的学习路线
最后给出一条我认为经过验证的学习路线。第一阶段只看不做,花两天时间搞清楚 Hadoop 是什么、能解决什么问题、核心组件有哪些,也就是本文的内容。第二阶段动手安装伪分布式,跑通 WordCount,看懂日志,理解进程关系,大概需要三到五天。第三阶段搭建三节点完全分布式集群,启用 Zookeeper + HA,体验主节点自动切换,并把 Hive 装上去,实现 SQL 查询 HDFS 数据,大概一到两周。
第四阶段做一个小项目,离线统计某份真实数据集,用 Hive 做 ETL,把结果导出到 MySQL,并用可视化库展示。有条件的话,再对比 Spark 和 MapReduce 跑同一份数据的耗时差异。这个阶段大概需要两到三周,做完之后你再去投大数据岗位,至少简历上能写“独立搭建 Hadoop HA 集群并完成离线分析项目”。
我个人在实际操作中最深刻的体会是:Hadoop 这套东西,入门门槛不在于难,而在于信息太杂。网上教程阶段混乱,有的教你装 2.x,有的直接上 CDH,有的让你用 Docker,新手很容易迷失。所以别贪多,先把无产出的概念和版本问题放到一边,用一份固定版本、一套固定部署方式跑透,之后再逐步扩展生态组件。你如果决定跟着这个系列走,我后续会把伪分布式搭建、HA 高可用整合 Zookeeper、DistCp 数据迁移、Hive 部署这些压箱底的东西一篇一篇补完。先把这篇简介消化掉,装好环境跑通第一个 WordCount,我们再继续。