简介:Hadoop 3.3.6 二进制安装包(tar.gz 格式)是一款面向大数据开发与运维人员的官方发布版本,解压后即可用于搭建分布式存储与计算环境,非常适合需要快速部署 Hadoop 集群、学习 MapReduce 编程或开展数据处理实验的读者。资源包共包含约 2000 个文件,以 HTML 帮助文档、JAR 核心库、CSS/JS 前端资源及 Shell 配置脚本为主,其中 JAR 包承载了 HDFS、YARN 等核心组件,HTML 与图片提供了界面展示和文档支持,整体压缩包约 696 MB,文件结构清晰,便于按需检索。目前已有 1344 人学习下载,社区使用热度较高。这份安装包省去了源码编译的繁琐流程,拿到手即可解压使用,配合官方文档能快速完成基础配置,尤其适合作为入门分布式系统和大数据技术的实用资源。 拿到hadoop-3.3.6.tar.gz这个安装包,很多人第一反应是解压、改配置、启动,然后被各种报错按在地上摩擦。这个版本我前前后后在测试环境和生产环境都折腾过,3.3.6 算是 3.3.x 里比较稳的一个版本,社区资料多、坑相对少,适合作为学习或内网部署的首选版本。这篇博文就围绕这个 tar.gz 包,从下载校验、目录结构、核心配置、伪分布式搭建、集群与 ZooKeeper 整合注意点,再到高频故障排查,一次讲透。不管你是刚接触 Hadoop 的新手,还是准备从伪分布式往集群迁移的工程师,照着做能省下大量试错时间。
1. 拿到安装包之后:版本选择和前置环境检查
很多教程直接告诉你“下载解压改配置”,但忽略了最重要的一件事——你拿到的到底是个什么包,以及你的环境配不配跑起来。这两点没想清楚,后面每一步都是在给报错埋雷。
1.1 为什么推荐 3.3.6 这个版本
Hadoop 3.3.x 是当前社区活跃维护的稳定分支,3.3.6 修复了此前版本里诸如FileSystem缓存泄漏、YARN 资源调度在某些场景下的异常等一批问题,同时对 JDK 8 和 JDK 11 都有很好的兼容性。相比 3.2.x,它在YARN容器重试、S3A客户端、HDFS的EC(纠删码)能力上都有明显增强。
我在实际部署中更看重的一点是:3.3.6 对应的生态组件(ZooKeeper、Hive、Spark 等)版本匹配资料非常齐全。换句话说,你遇到问题去搜,基本都能找到前人踩过坑的记录。做技术选型,有时候“资料多”本身就是一种优势,这能极大降低排障成本。
1.2 tar.gz 与商业发行版的区别
Apache 官方发布的hadoop-3.3.6.tar.gz是纯开源版本,不含任何商业技术支持。它的特点是:结构透明、无额外封装,适合想深入理解 Hadoop 运行机制的人。而像 CDH、HDP 这类商业发行版,本质上是把 Hadoop 及相关组件打包成 rpm/deb 仓库,通过 Cloudera Manager 或 Ambari 做统一管控。
如果你看到热词里有“Ambari 部署 hadoop 集群”,底层原理其实和手动部署一样,Ambari 只是把“解压、改配置、启动、监控”这套流程自动化了。所以先用 tar.gz 手动搭一遍,再去看 Ambari 的部署逻辑,会通透很多。反过来直接上 Ambari,很多细节被隐藏了,出了问题反而难排查。
1.3 部署前的环境检查清单
这部分我吃过亏,第一次部署时没检查 JDK 版本,启动 NameNode 直接报UnsupportedClassVersionError,排查了半天。以下清单建议逐项确认:
| 检查项 | 要求 | 说明 |
|---|---|---|
| JDK 版本 | 8 或 11(64位) | 3.3.6 不支持 JDK 7;JDK 17 虽然能跑,但生态兼容性风险高,不建议 |
| Linux 用户 | 建议单独创建 hadoop 用户 | 不要用 root 跑,权限问题会让你怀疑人生 |
| SSH | 必须安装 sshd 并启用 | 伪分布式需要 SSH 免密登录到本机 |
| 内存 | 至少 4GB,推荐 8GB+ | NameNode、DataNode、ResourceManager 都是 Java 进程,堆内存动辄 1-2GB |
| 磁盘 | 预留 50GB+(含数据盘) | HDFS 默认副本数 3,单机伪分布式建议调成 1 |
| 防火墙 | 关闭或放行对应端口 | 8020/9870/8088 等端口不连通,UI 和通信都会出问题 |
| 时区/时钟 | 集群节点间需同步 | 后续上 ZooKeeper 时时间不同步会直接导致会话超时 |
我习惯在部署前把 JDK、SSH、免密登录先配好,再解压 Hadoop,这样每一步出问题都能明确知道是哪个环节。千万别图省事把所有事堆到最后一起处理。
2. 下载、校验与解压:扎实的第一步
这一步看似基础,但很多生产事故的根源就是“下载了非官方包”或“解压后目录权限不对”。我见过的案例里,有人从第三方网站下载了被植入后门的安装包,也有人因为把 Hadoop 解压到了/tmp,系统重启后数据全丢。这些坑,都是可以从源头避免的。
2.1 官方下载渠道与校验方式
Hadoop 的官方下载入口有两个:Apache 镜像站的当前版本页面,以及archive.apache.org/dist/hadoop/common/的历史版本归档页。3.3.6 属于已发布版本,两边都能找到。下载时注意选择带有hadoop-3.3.6.tar.gz和配套.sha512校验文件。
校验步骤非常简单:
# 切到下载目录 cd /data/soft # 计算 sha512 校验值 sha512sum hadoop-3.3.6.tar.gz # 将官方 .sha512 文件里的哈希值与计算结果对比 cat hadoop-3.3.6.tar.gz.sha512对比无误后,再执行解压。这一步很多人跳过,但在生产环境或内网环境,我强烈建议保留,因为内网镜像源有被篡改的可能。官方包是 .tar.gz,解压后是一个hadoop-3.3.6目录,里面没有多余的“广告”文件,看到一堆不认识的脚本就要警惕了。
2.2 解压操作与目录位置的选择
解压命令本身很简单:
tar -zxvf hadoop-3.3.6.tar.gz -C /data/soft但关键在于目录位置的选择。我推荐统一放到/data/soft或/opt下,并创建一个软链接:
ln -s /data/soft/hadoop-3.3.6 /data/soft/hadoop这样后续配置环境变量、升级版本时只需要重新指一下软链接,不用改一堆配置里的绝对路径。这是一个很多老手都在用、但新手容易忽略的习惯。
解压后的目录结构里,重点关注这些目录:
| 目录 | 作用 |
|---|---|
etc/hadoop | 所有核心配置文件所在地,后续主要改这里 |
sbin | 启动/停止脚本,如start-dfs.sh、start-yarn.sh |
bin | 客户端命令,如hdfs、yarn、mapred |
logs | 运行日志目录,排查问题全靠它 |
share/hadoop | 官方自带的 jar 包、示例程序 |
我习惯把logs目录单独软链到磁盘空间大的分区,否则长时间运行后日志文件堆积可能撑爆系统盘。生产环境下这一步能避免很多运维事故。
2.3 权限设定:别让 root 污染数据目录
如果你是用 root 解压的 Hadoop,之后切换为 hadoop 用户启动服务,经常会遇到Permission denied。这是因为解压出来的文件 owner 是 root,普通用户没有写权限。最稳妥的做法是解压后立即把整个目录的属主交给 hadoop 用户:
chown -R hadoop:hadoop /data/soft/hadoop-3.3.6 chown -R hadoop:hadoop /data/soft/hadoop我自己踩过一次坑:用 root 启动了第一次 NameNode,结果 namenode 目录生成在 root 家目录下,后面切回 hadoop 用户怎么格式化都不对,最后只能清空重建。这个教训很深刻——部署 Hadoop 的第一步,就是先切换到专用用户,再开始操作。
3. 核心配置文件解析:伪分布式一次跑通的关键
Hadoop 的配置难点不在“改什么”,而在“为什么这么改”。很多教程直接给一份改好的配置,读者照抄后跑起来了,但换个环境又不会了。这里我拆开讲每个文件的作用和关键参数,理解了再动手,遇到问题才能自主排查。
3.1 环境变量与 hadoop-env.sh 的坑
先配置/etc/profile或~/.bashrc中的环境变量:
export HADOOP_HOME=/data/soft/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export JAVA_HOME=/usr/local/jdk1.8.0_202注意JAVA_HOME必须设置,而且最好在hadoop-env.sh里也显式指定一次。因为 Hadoop 的守护进程脚本有时不会读取系统全局环境变量,导致报错JAVA_HOME is not set。这个坑在图形界面安装的 JDK 环境中特别容易出现——/usr/bin/java存在,但JAVA_HOME没配置。
编辑$HADOOP_HOME/etc/hadoop/hadoop-env.sh,找到export JAVA_HOME=这一行,去掉注释并填上实际 JDK 安装路径。
3.2 四个核心 XML:谁负责什么
伪分布式最少需要修改四个文件,每个文件对应一个守护进程或一组功能:
| 文件名 | 对应进程 | 功能 |
|---|---|---|
core-site.xml | 客户端/NN | 配置默认文件系统(NameNode 地址) |
hdfs-site.xml | NameNode/DataNode | 配置副本数、数据存储目录、HTTP 地址 |
mapred-site.xml | MapReduce | 配置 MapReduce 的资源调度框架 |
yarn-site.xml | ResourceManager/NodeManager | 配置 YARN 的调度与辅助服务 |
下面是一份经过验证的伪分布式配置,可以直接参考:
core-site.xml:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/soft/hadoop/tmp</value> </property> </configuration>hdfs-site.xml:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///data/hadoop_data/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///data/hadoop_data/datanode</value> </property> <property> <name>dfs.http.address</name> <value>0.0.0.0:9870</value> </property> </configuration>mapred-site.xml:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>yarn-site.xml:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property> </configuration>3.3 为什么数据目录不能放在默认的 /tmp
配置hadoop.tmp.dir是这个环节最容易踩的大坑。Hadoop 默认的临时目录在/tmp/hadoop-${user}下,format时生成的元数据也默认在那里。问题在于,很多 Linux 发行版会定期清理/tmp下的旧文件,或者在重启时清空/tmp。一旦发生,NameNode 起不来,之前的 HDFS 数据全部“蒸发”。
我见过不止一个人因此重装 Hadoop。稳妥的做法是:在/data或其他磁盘分区下单独建目录,并确保 hadoop 用户有权限访问。伪分布式下,NameNode 元数据目录和 DataNode 数据目录最好也独立出来,这样升级或迁移版本时,只需移动目录,原数据不丢。这一点在往集群部署时同样适用。
4. 伪分布式启动与验证:跑通第一个 WordCount
配置完成后就可以启动了。但启动前还有两个前置任务要做:SSH 免密登录和格式化 NameNode。这两个环节也是报错重灾区,字数不多但信息量大。
4.1 SSH 免密登录配置
Hadoop 脚本会通过 SSH 启动远程节点的守护进程,伪分布式模式下同样需要配置 localhost 的免密登录:
# 生成密钥对 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 将公钥追加到 authorized_keys cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 验证免密登录 ssh localhost验证时不输入密码能直接登录就说明成功了。这里有个细节:~/.ssh目录权限必须为 700,authorized_keys权限必须是 600,否则 SSH 会拒绝读取。
4.2 格式化时的正确操作与常见误区
格式化是把 NameNode 的元数据目录初始化的过程,命令是:
hdfs namenode -format看到Storage directory ... has been successfully formatted就表示成功。这里有几个关键心得:
- 不要反复格式化。每次格式化都会生成新的
clusterId,如果 DataNode 还保留着旧clusterId,启动时会报Incompatible clusterIDs,导致 DataNode 挂掉。 - 如果必须重新格式化,先清空 NameNode 和 DataNode 两个数据目录下的所有内容,再格式化,最后再去
logs里确认没有异常。 - 格式化不等于启动。看到提示“successfully formatted”不代表服务启动成功,还得继续启动守护进程。
4.3 启动、进程验证与 UI 访问
格式化完成后,分两步启动 HDFS 和 YARN:
# 启动 HDFS(NameNode + DataNode) start-dfs.sh # 启动 YARN(ResourceManager + NodeManager) start-yarn.sh启动成功后,用jps查看 Java 进程,正常情况下应看到 5 个进程:
| 进程名 | 作用 |
|---|---|
| NameNode | HDFS 元数据管理 |
| DataNode | HDFS 数据存储 |
| SecondaryNameNode | NameNode 元数据辅助合并 |
| ResourceManager | YARN 资源调度 |
| NodeManager | YARN 单节点任务执行 |
UI 访问地址:
- HDFS 管理界面:
http://localhost:9870 - YARN 资源管理界面:
http://localhost:8088
然后跑一个最简单的冒烟测试,验证整体链路是否通:
# 创建测试目录 hdfs dfs -mkdir -p /input # 上传一个本地文件(比如 etc/hadoop/core-site.xml) hdfs dfs -put $HADOOP_HOME/etc/hadoop/core-site.xml /input/ # 跑官方 WordCount 示例 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output # 查看结果 hdfs dfs -cat /output/part-r-00000第一次跑 WordCount 会比较慢,因为 JVM 启动和任务调度都有开销。如果能正常输出词频结果,说明伪分布式环境整体可用。如果卡住不动,优先去 YARN 的 UI 页面看任务状态,或检查 NodeManager 日志,而不是盲目重启。
5. 从伪分布式到集群:部署规模变多,思考方式也得变
跑通伪分布式只是起点。很多人搭完伪分布式后,直接想到的就是“再复制几台机器,把配置改成集群模式”。方向没错,但中间有一些关键差异,尤其是引入 ZooKeeper 之后,事情的性质发生了变化——从“配置单机服务”变成了“维护一组有状态服务之间的协调关系”。
5.1 集群部署与伪分布式的核心差异
伪分布式只有一台机器,所有角色都在同一个节点上,配置文件里大量使用localhost。集群部署后主要有三点变化:
core-site.xml的fs.defaultFS不再是localhost,而是指向 NameNode 所在主机名或 IP,例如hdfs://namenode-host:8020。hdfs-site.xml里的dfs.replication调整为实际副本数(如3),并且需要显式配置dfs.namenode.name.dir和dfs.datanode.data.dir,路径不要再用/tmp。- 所有节点的配置必须保持一致,尤其
core-site.xml和yarn-site.xml,否则客户端提交任务时会出现各种莫名的连接失败。
手动同步配置最可靠的方式是用脚本统一分发,而不是手改每台机器。最简单的做法:在一台主节点上改好配置后,用scp分发到所有从节点,再清空从节点上旧的数据目录。分发配置时,只同步etc/hadoop下的 XML 和脚本,不要同步数据目录。
5.2 与 ZooKeeper 整合时的注意点
热词里提到“hadoop 和 zookeeper 整合实战”,这是从伪分布式迈向高可用集群时绕不开的一步。ZooKeeper 在 Hadoop HA 架构中负责 NameNode 和 ResourceManager 的故障自动切换。整合时重点注意这几个点:
- ZooKeeper 版本与 Hadoop 3.3.6 的兼容性,推荐 3.6.x / 3.7.x,不要用太老的版本,否则客户端 ZK 会话机制会有兼容问题。
- 通信端口。ZooKeeper 集群需要保持 2181(客户端)、2888(节点间通信)、3888(选举)端口的畅通。防火墙配错了,ZooKeeper 会一直出现丢 leader 的现象。
- 核心配置变化。开启 HA 后,
core-site.xml的fs.defaultFS要改为逻辑名称,例如hdfs://mycluster;hdfs-site.xml要配置dfs.nameservices、dfs.ha.namenodes.mycluster、dfs.namenode.rpc-address.mycluster.nn1等一连串 HA 相关参数。 - JournalNode 的作用。HA 模式下,两个 NameNode 之间通过 JournalNode 共享 edits 日志。至少部署 3 个 JournalNode 节点才能过半写入成功,否则 NameNode 无法正常启动。
我第一次搭 HA 时忽略了 JournalNode 数量要求,只起了两个 ZKFC 和一个 JournalNode,结果第二个 NameNode 始终进入不了 Standby 状态,后来查文档才发现 JournalNode 必须奇数个,而且默认要求至少 3 个。这个经验提醒我:分布式系统的多数派机制是硬性约束,不能用“我环境小所以少配几个”来绕过。
5.3 Docker 镜像与 Windows 开发环境的小结
热词里还有“hadoop 的 docker 镜像”和“windows 下载 hadoop”。如果只是学习或临时代码调试,用现成的 Docker 镜像(如bde2020/hadoop系列)能省去大量环境折腾时间。但要注意,容器化的 Hadoop 不适合作为正式存储层,数据卷、网络、资源隔离都需要额外规划。
Windows 下下载 Hadoop 更多是为了本地跑客户端或代码调试。可以下载 tar.gz 包并用 WinRAR 或tar -zxvf解压,但在 Windows 上通常不能直接作为完整的 DataNode/NameNode 来跑,建议用 WSL2 或虚拟机学习。如果只是本地提交任务到远程集群,Windows 客户端配合core-site.xml指向远端 NameNode 即可。
6. 高频报错排查实录
这一节整理的是我在这套环境下实际遇到、并解决过的高频问题。建议先收藏,遇到类似报错直接对照处理。
| 报错现象 | 可能原因 | 解决方案 |
|---|---|---|
JAVA_HOME is not set | hadoop-env.sh中未显式配置 JAVA_HOME | 在hadoop-env.sh中填入真实 JDK 路径 |
Incompatible clusterIDs | 重复格式化 NameNode,DataNode 保留旧 clusterID | 清空 NameNode/DataNode 数据目录后重新格式化,再启动 |
NameNode is not running | 数据目录权限不对,或/tmp被清理 | 检查dfs.namenode.name.dir权限,目录设到/data下 |
| Namenode 启动后 9870 端口无法访问 | 防火墙未放行或dfs.http.address配置不当 | 关闭防火墙或放行 9870/8088/8020,检查监听地址 |
| DataNode 不断重启 | 节点时间不同步或磁盘空间不足 | ntpdate同步时间,清理磁盘,检查dfs.datanode.data.dir |
ResourceManager启动后 Web UI 500 | RM 存储目录权限或端口冲突 | 清空yarn.timeline-service相关数据目录后重启 |
| YARN 任务卡在 ACCEPTED | NodeManager 未注册,aux-services未配置 | 检查yarn-site.xml的yarn.nodemanager.aux-services是否设为mapreduce_shuffle |
排查这类问题时,第一动作永远是看日志。logs目录下的hadoop-hadoop-namenode-*.log、yarn-hadoop-resourcemanager-*.log等文件会把真正的异常信息打印得明明白白。不要凭感觉猜,日志文件的位置和内容本身就是问题诊断的信号来源。
另外提醒一句:集群环境里修改配置后,每台节点的配置必须同步,否则最容易出现“为什么刚才那台机器能跑,这台不行”的奇怪问题。我在实际工作中会写一个简单的分发脚本,把主节点的etc/hadoop目录用scp批量同步到所有 worker 节点,并额外校验一遍md5sum,避免漏同步。
一点个人实操体会
Hadoop 3.3.6 这套 tar.gz 包,我前后部署过不下十次,每次都能从错误中发现etc/hadoop下某个配置细节被自己忽略了。最大的体会是:配置项背后都有真实的场景约束,知道为什么这样配,比记住配什么更重要。比如dfs.replication为什么生产要设 3,因为要容忍单节点故障;ZooKeeper 为什么必须奇数节点,因为选举需要过半投票。这些底层逻辑想通了,遇到问题就不会慌。
如果你也是刚从伪分布式入门,我建议在跑通之后,故意制造一次故障来加深理解——比如把 NameNode 的数据目录删掉,看看会发生什么;或者故意写错 ZooKeeper 端口,观察整个 HA 切换的过程。这种“破坏性实验”在测试环境做非常值得,它能帮你把 Hadoop 的运行机制真正内化成自己的经验,比看十遍文档都有用。
本文还有配套的精品资源,点击获取