
简介这是 Hadoop 3.3.6 的二进制安装包tar.gz面向需要搭建分布式存储与计算环境的大数据开发者和运维人员可解决从零安装 Hadoop 的部署需求适用于离线集群、学习实验等场景。压缩包约 696 MB共含 2000 个文件其中 1.6 万余个 html 为自带的 Web UI 页面与文档jar 为运行核心依赖sh/cmd 是启停脚本xml、conf、properties 则提供配置模板配套 css、js 支撑界面展示。已有 1344 人学习下载。包内版本标识清晰目录结构沿用 Hadoop 标准布局解压后按官方文档设置环境变量和配置文件即可启动 NameNode、DataNode 等组件自带的示例程序、测试脚本和完整 Web 管理界面静态文件可帮助使用者快速验证集群状态降低环境搭建门槛适合入门学习和本地分布式环境演练。 搞大数据环境的第一步几乎都是从拿到一个安装包开始的。我手上这个hadoop-3.3.6.tar.gz就是 Hadoop 3.3.6 的官方 Linux 安装包压缩格式是 tar.gz。别小看这个文件很多人在“下载完成、解压报错、启动失败”这三部曲里反复折腾最后卡在伪分布式搭建上大半天。这篇博文我会围绕这个安装包把 Hadoop 3.3.6 从解压到配置、格式化、启动、验证的完整流程走一遍同时把 Zookeeper 整合、集群扩展这些进阶方向的核心思路也讲清楚。适合刚入门大数据、正在搭实验环境的学生也适合要在测试环境快速部署 Hadoop 的开发者。只要你跟着操作踩坑的概率会小很多。1. 安装包解析hadoop-3.3.6.tar.gz 到底有什么讲究1.1 版本选择为什么是 3.3.6Hadoop 的版本线其实挺乱的2.x 和 3.x 之间差异很大。3.3.6 属于 3.x 分支里比较成熟的一个补丁版本修复了不少之前版本的问题同时对 JDK 8 和 JDK 11 都做了很好的支持。相比 3.2.x3.3.x 在 YARN 资源类型、Scheduler 性能、HDFS 的 EC擦除编码等方面都有改进。如果你去 Apache 官网下载页面看Hadoop 3.3.6 的发布文件列表里会有hadoop-3.3.6.tar.gz和hadoop-3.3.6-src.tar.gz两个包。前者是编译好的二进制发行版直接解压、配置、启动就行后者是源码包需要自己编译一般搞二次开发的人才会碰。我们平时说的“安装包”默认就是前者。1.2 tar.gz 格式与解压前的准备工作tar.gz 在 Linux 下是再常见不过的打包压缩格式。tar 负责把多个文件打成一个包gzip 负责压缩所以后缀是.tar.gz。解压命令就是tar -zxvf hadoop-3.3.6.tar.gz其中z表示用 gzip 解压x表示解压v表示显示过程f表示指定文件。如果你是在 Windows 下下载的想传到 Linux 服务器上那在 Windows 本地不要用 WinRAR 之类的工具解压后再传直接传原始压缩包到 Linux 服务器上再解压避免文件权限和软链接丢失的问题。下载完安装包后强烈建议先做一件事校验文件完整性。Apache 官网每个发行包旁边都有对应的.sha512文件拿它对比一下本地文件的哈希值防止下载损坏或被篡改sha512sum hadoop-3.3.6.tar.gz比对一下输出和官方给的哈希是否一致不一致就重新下。注意解压目录不要带中文路径不要放在/root以外的奇怪位置更不要放在有空格或特殊字符的目录下。很多莫名其妙的启动报错都是路径问题引起的。2. 环境准备与前置条件2.1 JDK 版本Hadoop 3.3.6 和 JDK 的匹配关系Hadoop 本身是用 Java 写的所以运行环境必须有 JDK。3.3.6 官方支持的 JDK 版本是 JDK 8 和 JDK 11。我实际测试下来JDK 1.8 是最稳的选择网上大部分教程和踩坑经验也都基于 JDK 8。如果你机器上本来就有 JDK 17那建议还是装个 JDK 8 专门给 Hadoop 用避免遇到一些奇怪的兼容性问题。安装 JDK 8 后记得把JAVA_HOME配好。以 CentOS/Rocky Linux 为例编辑/etc/profileexport JAVA_HOME/usr/local/jdk1.8.0_202 export PATH$PATH:$JAVA_HOME/bin配置完执行source /etc/profile让环境变量生效然后java -version确认一下输出中有1.8字样。2.2 SSH 免密登录伪分布式也逃不掉很多人不理解就搭一个伪分布式为什么还需要 SSH 免密因为 Hadoop 的启动脚本在启动 DataNode、NodeManager 等守护进程的时候会通过 SSH 远程登录到workers文件里列出的每台主机。即使是本机它也会走一次 SSH 流程。如果每次登录都要输密码启动过程会卡住或者直接失败。配置免密很简单三行命令的事ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys然后ssh localhost测试一下能直接进就说明配好了。这里有个小坑如果你的用户名不是当前用户或者主机名不是localhost还需要把本机 IP 或主机名对应的公钥也加到authorized_keys里。实操建议用单独的用户来跑 Hadoop不要用 root。Hadoop 对 root 用户支持不友好很多脚本会拒绝以 root 身份运行。我习惯建一个hadoop用户专门用来部署和运行。3. 解压配置与伪分布式搭建3.1 目录规划与环境变量解压本身没什么技术含量但目录规划有讲究。我惯用的做法是把安装包解压到/usr/local下然后建一个软链接指向具体版本目录好处是以后升级版本不用改环境变量tar -zxvf hadoop-3.3.6.tar.gz -C /usr/local ln -s /usr/local/hadoop-3.3.6 /usr/local/hadoop接着配置 Hadoop 的环境变量同样编辑/etc/profile或者~/.bashrcexport HADOOP_HOME/usr/local/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin配置完记得让环境变量生效。注意/usr/local/hadoop的所有权要给hadoop用户否则后续写数据、生成 pid 文件都会报权限错误。用chown -R hadoop:hadoop /usr/local/hadoop搞定。3.2 核心配置文件逐个说清楚Hadoop 的配置全部集中在$HADOOP_HOME/etc/hadoop目录下。伪分布式模式下真正需要手动改的也就四五个文件。第一个是 hadoop-env.sh这个文件主要设置 Java 环境。找到里面的JAVA_HOME配置项去掉注释并改成你的 JDK 路径export JAVA_HOME/usr/local/jdk1.8.0_202第二个是 core-site.xml它决定 NameNode 的地址和临时文件目录。花两分钟理解一下fs.defaultFS是 Hadoop 分布式文件系统 HDFS 的入口地址伪分布式模式下就指向本机端口用 9000 或 8020 都行。hadoop.tmp.dir是 Hadoop 存放临时数据和元数据的基础目录如果不配置默认用的是/tmp系统一重启文件就丢了那麻烦就大了configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configuration第三个是 hdfs-site.xml这个文件配置 HDFS 的副本数。伪分布式只有一台机器副本数必须设成 1如果保持默认的 3DataNode 会因为无法复制副本而报错configuration property namedfs.replication/name value1/value /property /configuration第四个是 mapred-site.xml这个文件决定 MapReduce 任务的资源调度框架。在 Hadoop 3.x 里推荐用 YARN所以配置configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration第五个是 yarn-site.xmlYARN 是资源调度层负责给 MapReduce 任务分配 CPU 和内存。伪分布式模式下需要配置的其实不多但我建议把 NodeManager 的资源限制调大一些特别是本机内存小的时候避免任务因为资源不足被直接干掉configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.vmem-check-enabled/name valuefalse/value /property /configurationaux-services必须配成mapreduce_shuffle否则跑 MapReduce 作业时会报错。vmem-check-enabled关掉虚拟内存检查是因为容器跑起来实际物理内存占用经常比申请的大开着容易误杀任务。提示以上配置适合伪分布式。如果你是按“完全分布式”模式搭集群fs.defaultFS要改成 NameNode 所在机器的主机名或 IPdfs.replication要改成 DataNode 节点数量或至少大于等于节点数。4. 格式化、启动与基础验证4.1 格式化 NameNode一生只能做一次的操作配置好之后启动 HDFS 之前必须格式化 NameNode。这个操作的作用是初始化文件系统的元数据目录生成一个空的fsimage。命令是hdfs namenode -format格式化成功的关键标志是输出日志最后几行出现successfully formatted同时你能看到Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted这样的字样。这里必须泼一盆冷水格式化操作只能做一次。如果你后面启动了 HDFS写入了数据然后又去重新格式化那么 NameNode 新生成的clusterId和 DataNode 里记录的clusterId就对不上了启动时 DataNode 会一直报错。如果不小心真的重复格式化了最简单的补救方法就是把tmp目录下的dfs整个删掉然后重新格式化。但这就意味着之前 HDFS 里的数据全没了。4.2 启动 HDFS 和 YARN并用 jps 验证格式化完成后开始启动进程。HDFS 和 YARN 是两套独立的进程需要分别启动start-dfs.sh start-yarn.shstart-dfs.sh启动的进程包括 NameNode、SecondaryNameNode 和 DataNodestart-yarn.sh启动的进程包括 ResourceManager 和 NodeManager。启动完成后用一个命令确认所有进程都活着jps正常输出应该包含下面 5 个进程NameNodeSecondaryNameNodeDataNodeResourceManagerNodeManager有一个没出现就说明对应进程启动失败了。这时候别慌去看日志日志在$HADOOP_HOME/logs目录下一个进程一个文件命名格式是hadoop-hadoop-namenode-主机名.log这种。除了命令行验证Web 界面也能看。Hadoop 3.3.6 的 HDFS Web 端口是9870YARN 的资源管理界面端口是8088。浏览器打开http://localhost:9870能看到 Namenode 状态、DataNode 列表、HDFS 存储容量等信息。实操心得如果 jps 少了 DataNode最可能的原因是格式化过两次导致 clusterId 不一致。解决办法是查看logs目录下 DataNode 的日志确认报错信息后删除tmp文件夹重新格式化或者手动把dfs/name/current/VERSION和dfs/data/current/VERSION里的 clusterId 改成一致。5. 踩坑与排障速查表5.1 启动失败的典型原因和解决方法我在不同机器上搭过十几次 Hadoop把最常见的几类故障整理出来了现象可能原因解决方法格式化时报Incorrect configurationhadoop.tmp.dir路径不存在或没权限手动创建目录并设置属主mkdir -p /usr/local/hadoop/tmp chown -R hadoop:hadoop /usr/local/hadoopssh: Could not resolve hostname没有配 localhost或/etc/hosts里有冲突检查/etc/hosts确保本机 IP 和主机名的映射正确DataNode 一直启动不了重复格式化导致 clusterId 不一致删除tmp下 dfs 目录重新格式化访问 9870 端口超时防火墙没放行关闭防火墙或放行端口跑 mapreduce 作业报vmem超限NodeManager 虚拟内存检查太严在 yarn-site.xml 里设置yarn.nodemanager.vmem-check-enabled为false报Permission denied错误用了 root 用户启动或目录权限不足切换为 hadoop 用户检查 HDFS 目录权限5.2 日志排查技巧比搜索引擎更靠谱的办法很多新手一看到报错就上网搜效率太低。我的经验是先看日志日志看不懂的部分再搜。Hadoop 的日志体系非常完善关键信息全在logs目录里。举个例子有一次我搭集群ResourceManager 起来后一访问 8088 就自动退出。网上搜了一圈没找到答案最后打开yarn-hadoop-resourcemanager-xxx.log里面明确写着端口被占用。一查发现sbin目录下的某个脚本把 RM 重复跑了杀掉多余进程就解决了。日志里面其实有很多“看起来像是错误但其实是警告”的信息不用过度担心。判断方法很简单进程能正常起来功能正常那就是警告进程起不来告警就成了致命错误。6. 从单机到集群与 Zookeeper 整合的进阶方向6.1 伪分布式到完全分布式的扩展思路单机跑通之后下一步自然就是搭集群。很多人觉得集群搭建就是把同样的配置复制到多台机器上其实没这么简单。要改的地方主要有这几个fs.defaultFS从localhost改成 NameNode 节点的真实主机名或 IPworkers文件旧版本叫slaves里写入所有 DataNode 节点的主机名各节点之间配置 SSH 免密包括 NameNode 到所有 DataNode、NodeManagerdfs.replication改成集群的 DataNode 数量决定哪台机器跑 SecondaryNameNode或者直接启用 NameNode HA每一步都不要想当然。比如workers文件每行一个主机名别写 IP 又写主机名混着来脚本解析会出错。我当时搭 3 节点集群第一遍 DataNode 一个都起不来就是因为主机名解析不一致。6.2 Zookeeper 在 Hadoop HA 中到底干了什么集群规模一大NameNode 就成了单点。NameNode 挂了整个 HDFS 就不可用了。Hadoop 官方解决这个问题的方案是 NameNode HA而 Zookeeper 在里面扮演了三个关键角色第一是自动故障切换。两个 NameNode 一个是 Active 一个是 StandbyActive 挂掉的时候Zookeeper 通过 ZKFCZookeeperFailoverController机制快速选出新的 Active。第二是存储共享状态。Active 和 Standby 节点需要共享一个编辑日志JournalNode 集群用来保持元数据一致。Zookeeper 记录当前哪个 NameNode 在写日志、写到哪一位置保证不会出现脑裂。第三是分布式锁。防止两个 NameNode 同时认为自己是 Active这个锁就是 Zookeeper 的临时节点。所以如果你想搭真正的高可用集群把 Zookeeper 整合进来是绕不开的路。官方给出的 HA 架构中Zookeeper 通常部署 3 台或 5 台形成一个小的奇数节点集群。6.3 整合 Zookeeper 时的几点实战建议Zookeeper 的安装包也是 tar.gz 格式解压后改配置文件即可这里不展开。但有三点经验特别重要Zookeeper 的数据目录不要放在/tmp下和 Hadoop 的hadoop.tmp.dir同理系统重启就丢到时候整个集群状态全乱。Zookeeper 集群启动有先后顺序第一台启动后在zookeeper.out日志里会看到一堆连接失败错误别慌正常现象它要等其他节点起来后才能选出 Leader。按顺序把 3 台全启动完日志自然就正常了。Hadoop 和 Zookeeper 的版本不要乱配。Hadoop 3.3.6 官方兼容的 Zookeeper 版本是 3.7.x 和 3.8.x别拿太老的 Zookeeper 版本去配会出一些莫名其妙的序列化问题。最后的操作体会想了想还是多说一句我每次装 Hadoop 都习惯在解压后的根目录下新建一个logs软链接指向logs真实目录方便快速定位。有一次排查了半天才发现日志目录被我不小心删了进程虽然起来了但没有任何输出全靠重新创建目录才解决。半路接手一个 Hadoop 环境的时候别急着看配置先执行jps看进程再去logs目录翻最近修改的文件。这套排查顺序我用得最多比背命令高效得多。本文还有配套的精品资源点击获取