Hadoop单机模式保姆级安装教程:零配置跑通WordCount全流程
做大数据方向的朋友几乎没有人能绕开 Hadoop。我见过太多人一上来就照着伪分布式搭建教程折腾Eclipse 里配了一堆 XML结果 NameNode 都起不来愣是排查了一整天。其实学习 Hadoop 完全可以从单机非分布式模式入手——它是 Hadoop 默认的本地运行模式不需要任何配置文件、不需要启动 HDFS 守护进程、甚至不需要 SSH一条 hadoop jar 命令就能把 MapReduce 完整跑通。这篇文章就是一份保姆级的单机模式安装教程从 JDK 选型、下载解压、环境变量配置到第一个 WordCount 任务每一步都给出命令和背后逻辑适合零基础初学者、准备 Hadoop 面试的开发以及只想快速验证自己写的 MapReduce 代码的人。1. 为什么先学单机模式Hadoop 三种部署形态的定位和选择1.1 三种部署形态的本质区别Hadoop 官方文档把部署形态分成三种本地模式standalone 或 local mode、伪分布式模式pseudo-distributed mode、完全分布式模式fully-distributed mode。它们的差别不在功能上而在进程上。本地模式所有组件都跑在同一个 JVM 进程里直接读写本地文件系统不启动 NameNode、DataNode、ResourceManager 这些守护进程。伪分布式模式在一台机器上以独立进程的方式启动所有守护进程NameNode 和 DataNode 跑在同一台物理机但数据读写会真正落到 HDFS 上。完全分布式模式多台机器各自承担角色是生产环境的标准形态。很多新手把伪分布式当成学习起点我觉得这是个误区。伪分布式本质上是在一台机器上模拟集群涉及的守护进程有五个——NameNode、SecondaryNameNode、DataNode、ResourceManager、NodeManager任何一个没起来整个环境都是半瘫状态排查起来非常痛苦。而单机模式没有守护进程你的全部注意力可以集中在一份输入文件是如何被拆分、映射、排序、归并成结果的这条主线上而这恰恰是学习 Hadoop 最核心的部分。1.2 哪些人适合先用单机模式起步按我带人的经验下面三类人最适合用单机模式打底刚入门大数据的学生或转行者第一套环境别给自己上难度先把跑通这个正反馈拿到手。需要调试自己写的 MapReduce 代码或 HDFS API 的开发者单机模式启动快、日志直观、出问题好定位比在集群上反复提交任务节省大量时间。准备 Hadoop 面试的人。面试里大量机制题比如 InputSplit 如何划分、Map 输出如何排序、Reducer 如何拉取数据本质上都是单机模式下就能观察到的行为。反过来如果你的目标是学习 HDFS 的元数据管理和副本策略或者要模拟生产环境的 HA 高可用那就得从伪分布式甚至完全分布式开始。先把目标定清楚再选部署形态别一上来就朝最复杂的方案走。2. 开工前的环境准备JDK 版本、专用用户与 SSH 的四点建议2.1 JDK 选型版本、厂商与安装验证Hadoop 是 Java 写的机器上必须先有 JDK。这里直接给最稳妥的结论省得大家在版本上反复纠结Hadoop 3.x 系列要求 Java 8 或 Java 11。大多数公司的生产环境至今仍以 Java 8 为主学习阶段建议直接用 Java 8兼容性最稳。Oracle JDK 和 OpenJDK 都行。从零开始练手的话OpenJDK 免费且没有授权顾虑。不要用 Java 17 及以上版本跑 Hadoop 3.x部分版本存在兼容问题没必要给自己挖坑。Ubuntu/Debian 系安装 OpenJDK 8 的命令sudo apt update sudo apt install openjdk-8-jdk -yCentOS/RHEL 系则是sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y装完务必验证两件事而不是只看一眼版本号就完事java -version echo $JAVA_HOMEjava -version有输出只代表 JRE 能跑而 Hadoop 的启动脚本会去读JAVA_HOME环境变量。如果echo $JAVA_HOME输出为空说明 JDK 的安装路径还没暴露给环境变量后面运行 Hadoop 大概率会报找不到 Java。这一步是很多人踩的第一个坑。提示如果服务器上已经有 Java用readlink -f $(which java)可以解析出真实安装路径后面写hadoop-env.sh时直接用它避免配到软链路径上。2.2 为什么建议创建专用用户而不是直接用 root网上很多教程为了省事让你直接用 root 装 Hadoop能跑通但我还是强烈建议创建一个专用用户sudo useradd -m hadoop sudo passwd hadoop理由有三层。第一Hadoop 生态不少脚本和管理命令对 root 的权限处理很敏感直接以 root 运行偶尔会触发莫名的权限告警或拒绝执行第二Hadoop 运行时会写日志、临时文件用专用用户能让安装目录下面的文件属主关系干净避免解压时 root、运行时普通用户这种权限错乱第三生产集群从来不会用 root 跑数据服务这是行业习惯学习阶段就建立这个习惯没有坏处。创建好用户后用su - hadoop切换过去后续所有操作都在这个用户下进行。2.3 SSH 到底要不要配一个被伪分布式教程带偏的问题这是单机模式最容易被人误导的一点。大量伪分布式搭建教程第一步就让你配置 SSH 免密登录原因是伪分布式启动守护进程时需要 SSH 到本机执行远程命令。但单机模式下根本不会启动任何守护进程自然也就不需要 SSH。换句话说你装的是单机模式SSH 不通、没配密钥都不影响你运行 WordCount。把这个认知理清了后面排查问题的时候就不会被无关的报错分散注意力。等到你决定升级到伪分布式的那天再回来补 SSH 配置完全来得及。3. 下载与解压选对版本后Hadoop 目录结构怎么读3.1 版本怎么选Apache 社区版与发行版的取舍Hadoop 目前主流有 2.x 和 3.x 两条版本线。新项目基本都在 3.x 上社区资料和维护力度也明显向 3.x 倾斜所以建议直接选 Apache 官方 releases 目录中的最新 3.x 稳定版比如 3.3.x 系列。有些朋友会纠结要不要装 CDH、HDP 这类商业发行版。我的建议是学习阶段用社区版就足够了。发行版的价值主要体现在生产环境的组件版本兼容和管理工具上那个复杂度对个人学习反而是负担。3.2 下载与解压的完整命令到 Apache Hadoop 的 Releases 页面找到stable目录下的 tar.gz 包复制下载链接。如果直接从官方地址下载比较慢可以把 URL 前面的域名换成你所在地区访问速度快的 Apache 镜像站路径结构完全一致改个域名就行。拿到链接后在服务器上执行cd /usr/local sudo wget https://mirrors.example.org/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz sudo tar -zxvf hadoop-3.3.6.tar.gz sudo mv hadoop-3.3.6 hadoop sudo chown -R hadoop:hadoop /usr/local/hadoop逐条解释一下为什么这么写。mv hadoop-3.3.6 hadoop是把目录名去掉版本号后续配置环境变量时路径短、清爽也方便以后换版本时直接替换目录而不改配置chown -R hadoop:hadoop是把安装目录的属主交给 hadoop 用户对应前面创建专用用户的建议这一步能避免后面运行时出现一堆 Permission denied。提示下载完成后顺手校验一下 SHA-256 是好习惯学习阶段可以跳过。但如果 tar 包解压时总报损坏第一反应应该是重新下载而不是怀疑命令写错了。3.3 目录结构速览bin、sbin、etc、share 分别是干嘛的解压完花三分钟把目录扫一遍能帮你少走很多弯路bin/客户端命令所在地hadoop、hdfs、yarn这些命令行工具都在这里。sbin/管理员启动脚本比如start-dfs.sh、start-yarn.sh单机模式下基本用不到伪分布式和集群模式才会碰。etc/hadoop/配置文件目录core-site.xml、hdfs-site.xml、mapred-site.xml、hadoop-env.sh全在这里。share/预编译的 jar 包和官方示例经典测试程序hadoop-mapreduce-examples-*.jar就躺在share/hadoop/mapreduce/下面。logs/运行日志目录排错时第一反应应该是来看这里而不是满世界搜报错。记住一个原则要改配置去etc/hadoop/要敲命令用bin/要查问题看logs/。这个习惯能让你在后面的学习里效率翻倍。4. 环境变量与首个任务单机模式为什么能零配置跑起来4.1 环境变量配置的两种写法和生效原理单机模式之所以叫零配置是因为 Hadoop 默认不需要你编写任何 XML 配置文件。但零配置不等于零准备你至少要保证两件事。第一Hadoop 脚本能找到 Java。编辑etc/hadoop/hadoop-env.sh找到顶部被注释掉的export JAVA_HOME那一行改成实际路径export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64路径不是固定的用readlink -f $(which java)查出来的那个路径才是准的。为什么必须在这里写死因为 Hadoop 的启动脚本在解析JAVA_HOME时并不完全依赖 shell 全局环境hadoop-env.sh是它的第一读取来源。这个文件配置错位是新手安装时最容易遇到隐性问题的根源。第二命令行能直接敲hadoop。编辑~/.bashrc末尾追加上export HADOOP_HOME/usr/local/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin执行source ~/.bashrc让配置生效。这里有个经常出问题的小细节很多人把这两行写进/etc/profile或~/.bash_profile换个终端或者重启后环境变量就丢了因为不同登录方式加载的文件不一样。写到~/.bashrc对绝大多数交互式终端最通用。验证配置是否生效hadoop version能看到 Hadoop 版本号输出环境配置就算过关了。4.2 第一次跑 WordCount完整命令与输出解读接下来用 Hadoop 自带的 WordCount 示例验证安装成果。先建输入目录cd ~ mkdir wcinput cd wcinput echo hello hadoop hello world file1.txt echo hello hdfs world hadoop file2.txt cd ~然后执行 WordCounthadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount wcinput wcoutput注意 jar 包的版本号要和你的安装版本对应我这边以 3.3.6 为例。运行期间控制台会刷出大量日志核心信息就两类一类是 Map 和 Reduce 的进度比如map 100% reduce 100%另一类是任务标识类似job_local...看到local字样就说明任务确实跑在本地模式没有提交给任何资源管理器。跑完查看结果cat wcoutput/part-r-00000输出是每个单词和它出现的次数比如hadoop 2、hello 3。这个文件就是 Reduce 阶段最终落盘的结果part-r-00000是默认输出文件名。4.3 单机模式背后的工作原理一个 JVM 里的完整 MapReduce跑通之后我强烈建议你顺便思考一下刚才到底发生了什么。单机模式下MapReduce 任务不会提交给 ResourceManager而是在当前 JVM 里直接执行输入来自本地文件系统中间结果落在本地临时目录整个生命周期只有一个 Java 进程。这正是它适合学习的根本原因。你可以用jps命令观察 Java 进程会发现任务期间只多了一个进程而不是像伪分布式那样冒出一堆守护进程。把一个进程完成 MapShuffleReduce这个模型理解透后面再看伪分布式的独立进程模型你就能抓住本质——它们只是把进程拆开了计算逻辑并没有变化。5. 单机、伪分布式、完全分布式三种模式一张表说清楚5.1 一张对比表这一节把三种模式放到一起对比面试时或者给别人讲清楚时可以直接引用对比维度单机本地模式伪分布式模式完全分布式模式守护进程不启动单机启动全部守护进程多机各自启动角色进程文件系统本地文件系统HDFS单机HDFS跨机器JVM 数量1 个多个每个守护进程一个按节点多个配置工作量零配置4 个 XML SSH配置 网络 规划机器数量1 台1 台3 台以上适用场景学习 MR、调试代码学习 HDFS/YARN 组件生产环境这张表最核心的一列是守护进程。伪分布式和完全分布式的本质相同都是多个独立进程协作完成一个任务区别只是这些进程分布在一台还是多台机器上。所以先学单机模式再往上走成本是线性增长而不是指数增长。5.2 从单机升级到伪分布式你需要补的东西搞清楚三种模式的区别后再回头看网上那些伪分布式搭建教程就会通透很多。从单机往伪分布式升级主要需要补齐几件事配置 SSH 免密登录、创建 HDFS 目录并格式化 NameNode、在core-site.xml里指定 NameNode 地址、在hdfs-site.xml里设置副本数和数据目录、在mapred-site.xml里指定 YARN 作为资源调度框架然后调用start-dfs.sh和start-yarn.sh启动所有进程。配置项看起来不少但有了单机模式的基础你已经确认了 JDK、Hadoop 安装和 MapReduce 示例代码都能跑通剩下的就是进程管理和配置语法问题排查范围一下子小了很多。这也是我一直建议大家别跳过单机模式的直接原因。6. 踩坑实录安装过程中最容易遇到的四个报错与排查链路6.1 报错一JAVA_HOME is not set或找不到 Java现象执行hadoop version或运行 jar 时提示JAVA_HOME未设置或者直接提示找不到命令。排查链路先echo $JAVA_HOME如果输出为空说明没在~/.bashrc里写如果输出有值再检查hadoop-env.sh里的JAVA_HOME是否还是注释状态。Hadoop 脚本解析 Java 路径有自己的一套优先级hadoop-env.sh是它的第一来源。所以两个地方都要确认这是最经典的组合坑。6.2 报错二Permission denied无法写本地目录现象建输入目录成功但运行 WordCount 时中间过程报权限错误。排查链路先ls -l /usr/local/hadoop看属主。如果你之前是用 root 解压的目录属主是 root而提交任务的用户是 hadoop自然写不了日志和临时目录。解决办法就是前面提到的那条chown -R hadoop:hadoop /usr/local/hadoop。如果已经 chown 还报错再df -h看看磁盘空间排除磁盘写满的情况。优先级从属主错误到磁盘空间按这个顺序查最快。6.3 报错三Unable to load native-hadoop library警告现象每次运行命令都输出一行黄色 WARNUnable to load native-hadoop library for your platform... using builtin-java classes where applicable。结论这是警告不是错误。Hadoop 尝试加载本地库来优化压缩解压等操作加载失败时会自动回退到 Java 自带的实现单机练习场景完全不影响功能。网上不少教程让你去装 zlib 甚至重新编译libhadoop.so学习阶段真没必要。看到这个警告继续跑你的任务能出结果就是好环境。注意这个警告不需要处理但面试时如果被问到能解释清楚本地库的作用是提升数据压缩性能缺失时自动回退 Java 实现反而是加分项。6.4 报错四第二次运行报Output directory ... already exists现象第一次 WordCount 成功后改了一下输入文件再跑直接报输出目录已存在。排查链路这不是安装问题是 MapReduce 的安全机制——输出目录如果已存在任务会直接拒绝执行防止覆盖历史数据。解决办法很朴素每次换一个新的输出目录名或者先rm -rf删掉旧目录。这个坑几乎每个初学者都会踩一次我自己也被它教育过记一次就够了。7. 装完之后的路怎么走学习路径与实用建议7.1 把单机环境的练习价值榨干环境装好的头几天建议做三件事把价值最大化拆开 WordCount 的输入文件改换单词之间的分隔符观察输出如何变化体会默认分词逻辑。自己写一个最简单的 MapReduce 程序比如求一组数字的最大值在本地模式调试到跑通。这一步能帮你把 Mapper、Reducer 两个接口的用法彻底打通。试着敲hadoop fs系列命令但心里要清楚单机模式操作的是本地文件系统hadoop fs -ls /列出的不是 HDFS 内容。很多人到这一步才搞明白本地模式和HDFS 已启动完全是两回事这种混淆到伪分布式阶段会非常致命。第 3 点尤其重要。只有等你进入伪分布式模式hadoop fs才真正意义上操作 HDFS这份时机感只能靠亲手跑一遍才能建立。7.2 从单机到伪分布式下一步的建议顺序如果你打算继续深入学习 Hadoop单机模式只是入口。建议的进阶顺序是先补 YARN 的资源管理概念再看伪分布式下 HDFS 的格式化与启动过程然后动手搭一个三台机器的完全分布式集群最后再去碰 HA 高可用和 Zookeeper 整合。每一步都有对应的官方文档耐心跟着文档走比刷十篇碎片化博客都强。按照我这些年带新人的经验单机环境保持在开箱能用、能跑通官方示例、能跑自己写的小 job这个状态就足够了不必急着在里面堆各种服务。基础环境的重点在稳定两个字把这块基石打牢后面学什么都有底气。