
简介Hadoop 3.3.6 二进制发行版打包为 tar.gz是开箱即用的分布式系统基础架构软件面向需要搭建大数据存储与计算环境的开发者、运维人员及学习者。解压即可获得完整运行环境省去源码编译步骤适合快速部署伪分布式或小型集群进行实验验证。包体共约2000个文件总体积696.28MB以 HTML 文档、JAR 依赖库、CSS/JS 前端资源为主并含 xml/properties 配置文件、Shell 脚本、SQL 示例及少量原生库so可支撑环境配置、服务启停和 Web 界面访问。目录结构遵循官方布局便于对照文档定位。目前已有1360人学习/下载。资源提供完整的二进制配套文件包括守护进程启动脚本、默认配置模板、依赖 JAR 包及自带 WordCount、Pipes 等示例程序配合官方文档即可完成安装配置为 HDFS 存储、MapReduce 计算和 YARN 调度实践提供稳定基础。1. 拿到 hadoop-3.3.6.tar.gz 之后这包到底能干什么如果你是第一次接触 Hadoop多半是下载了一个叫hadoop-3.3.6.tar.gz的压缩包然后在百度或 GitHub 上翻教程想把它跑起来。这个包就是 Apache Hadoop 3.3.6 的官方二进制发行版解压后就能直接在 Linux 上运行不需要编译源码。它能帮你在一台机器上搭起伪分布式集群也能作为完全分布式集群的安装底包覆盖 HDFS、YARN、MapReduce 这三件套的完整功能。很多人被“分布式”三个字吓住觉得非要几台服务器才能玩。事实上用这个 tar.gz 包配合 JDK 8 和 SSH 免密登录一台 4GB 内存的虚拟机就能把 NameNode、DataNode、ResourceManager、NodeManager 全跑起来。这篇文章我会从解压校验讲到伪分布式搭建再到完全分布式和排错全程用可复现的命令尽量让你少走弯路。2. 拆解 hadoop-3.3.6.tar.gz安装包里的目录结构与版本选型2.1 为什么选 3.3.6 而不是 2.x 或 3.2.x选 Hadoop 版本是门学问。很多老教程还在讲 2.7.x 或 3.1.x但你在生产环境或课程设计里用新版会省很多麻烦。3.3.6 属于 3.3 系列的中后段版本修复了不少已知问题同时保留了相对稳定的 API第三方组件如 Hive、Spark、Flink对它的适配也比较成熟。选 3.3.6 还有几个实际理由它默认支持 JDK 8 和 JDK 11这意味着你不用去装很新的 JDK 17 来迁就 Hadoop它的 HDFS 支持 Erasure Coding纠删码在保证容错的同时把副本开销从 3 倍降到 1.4 倍左右YARN 的容量调度器在 3.x 里支持多实例做资源隔离比 2.x 顺手得多。对入门者和中小集群来说3.3.6 是个性价比很高的平衡点。2.2 解压后你应该认识的目录拿到hadoop-3.3.6.tar.gz后先别急着配环境变量。解压后你会看到一个hadoop-3.3.6目录里面真正常用的有这几个目录 / 文件作用etc/hadoop/所有配置文件所在地core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、hadoop-env.shsbin/启动和停止脚本start-dfs.sh、stop-dfs.sh、start-yarn.shbin/客户端命令hdfs、yarn、mapred、hadoop等share/hadoop/依赖 jar 包跑 MapReduce 作业时 classpath 会指向这里logs/运行日志目录排错必看我一般习惯把解压后的目录放到/opt/hadoop/hadoop-3.3.6然后做一个软链ln -s /opt/hadoop/hadoop-3.3.6 /opt/hadoop/current。这样以后升级版本时只需要换软链指向不用改一堆脚本里的绝对路径。2.3 从哪里下载、怎么校验文件完整性Apache 官方下载页给出的文件名通常是hadoop-3.3.6.tar.gz但国内访问官方源比较慢。常见做法是去华为云镜像或阿里云镜像下载速度会快很多。下载后建议校验 SHA-512防止文件损坏或被篡改。官方页面会提供.sha512文件Linux 下用一条命令就能比对echo 刚下载的sha512值 hadoop-3.3.6.tar.gz | sha512sum -c -如果输出OK说明文件完整。如果是FAILED就删除重新下载别硬解压否则后面会遇到各种诡异的报错排查起来非常浪费时间。2.4 安装包里没有的东西JDK 与 SSH这个 tar.gz 只包含 Hadoop 本体不包含 JDK。Hadoop 3.3.6 要求 JDK 8 或 JDK 11所以你得先确认机器上有 Java 环境。另外伪分布式模式需要 SSH 免密登录因为 Hadoop 脚本会通过 SSH 在本地主机上启动 DataNode 和 NodeManager 进程。提示如果你用的是 root 用户跑 Hadoop很多教程会告诉你先创建一个普通用户理由是 Hadoop 脚本对 root 有一些限制检查。虽然可以强行改配置但线上环境里最好还是用独立用户隔离权限。3. 从零开始装JDK、SSH 免密、环境变量一次配到位3.1 先确认 JDK 版本和安装路径Hadoop 启动脚本通过JAVA_HOME找 Java。如果JAVA_HOME没配或配错start-dfs.sh会直接报Error: JAVA_HOME is not set and could not be found。常见的 JDK 安装路径是/usr/lib/jvm/java-8-openjdk-amd64或/opt/jdk1.8.0_202。先执行下面命令确认java -version which java readlink -f $(which java)把readlink -f输出的路径去尾巴得到类似/usr/lib/jvm/java-8-openjdk-amd64/bin/java那么JAVA_HOME就是/usr/lib/jvm/java-8-openjdk-amd64。如果机器上已经装了多个 JDK 版本建议在hadoop-env.sh里显式写死JAVA_HOME避免 shell 环境变量干扰。3.2 配置 SSH 免密登录伪分布式和完全分布式都需要 SSH 免密。如果没配启动 DataNode 时会卡在密码输入然后超时失败。配免密只需要三步ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys第一条命令生成空密码的 RSA 密钥对-P 表示不用 passphrase这样脚本才能自动登录。第二条把公钥追加到授权列表第三条收紧权限。配完后执行ssh localhost如果直接进到 shell 而不提示密码就说明免密生效了。这一步堪称整个 Hadoop 安装里最“玄学”的地方很多人卡在权限不对实际原因就是authorized_keys或.ssh目录的权限过松SSH 会拒绝信任。3.3 解压 tar.gz 安装包并设置环境变量解压就用标准的 tar 命令tar -zxvf hadoop-3.3.6.tar.gz -C /opt/hadoop/-z表示通过 gzip 解压-x解包-v显示过程-f指定文件名。解压完成后把 Hadoop 的 bin 和 sbin 目录加进 PATH并设置HADOOP_HOMEexport HADOOP_HOME/opt/hadoop/hadoop-3.3.6 export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop这三行建议写进/etc/profile.d/hadoop.sh而不是直接改/etc/profile这样重装系统或切换用户时不需要重复配置。配完后执行source /etc/profile.d/hadoop.sh让环境变量生效再用hadoop version验证是否识别到安装包。3.4 验证安装包的二进制文件可用性hadoop version这条命令会读取share/hadoop/common下的 jar 包来显示版本信息。如果输出类似Hadoop 3.3.6且没有抛ClassNotFoundException说明安装包本身没损坏、JDK 兼容性没问题。如果在这里就报错基本可以断定是JAVA_HOME没配对或 JDK 版本太新比如用了 JDK 17 就会出现一些反射相关的报错。到这里你已经把一个裸的 tar.gz 变成了可执行的 Hadoop 环境。但光能执行hadoop version还不够下一步要做的是真正把 HDFS 和 YARN 进程拉起来。4. 从 tar.gz 到跑通的集群伪分布式搭建全程实录4.1 四个核心配置文件core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml伪分布式的关键是不改代码只改配置文件。先看core-site.xml它决定 NameNode 的地址和临时目录位置。我一般会显式指定hadoop.tmp.dir否则默认路径在/tmp下重启机器后会丢数据格式化完的 NameNode 元数据一旦丢了整个 HDFS 就废了。configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/tmp/value /property /configurationfs.defaultFS设为hdfs://localhost:9000表示所有 HDFS 操作都走这个地址。hadoop.tmp.dir是 NameNode 和 DataNode 存放元数据和数据块的根目录务必换成持久化路径这是很多老手都会提醒的点。接着改hdfs-site.xml伪分布式副本数设为 1 就行至少设置dfs.namenode.name.dir和dfs.datanode.data.dir指向明确目录方便以后排查磁盘占用。configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///opt/hadoop/tmp/dfs/name/value /property property namedfs.datanode.data.dir/name valuefile:///opt/hadoop/tmp/dfs/data/value /property /configurationdfs.replication1是伪分布式必须的否则三副本会把磁盘撑爆。dfs.namenode.name.dir里用file://前缀是因为该路径指向本地文件系统而不是 HDFS 路径。新手经常在这里漏掉file://导致 NameNode 无法启动。yarn-site.xml需要配置资源管理相关的属性。伪分布式模式下让 ResourceManager 和 NodeManager 都跑在本机就行但需要注意yarn.nodemanager.aux-services必须设置为mapreduce_shuffle否则 MapReduce 作业在 Shuffle 阶段会失败。configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.aux-services.mapreduce_shuffle.class/name valueorg.apache.hadoop.mapred.ShuffleHandler/value /property property nameyarn.resourcemanager.hostname/name valuelocalhost/value /property /configuration最后是mapred-site.xml。这个文件在安装包里默认不存在只有mapred-site.xml.template你需要手动复制一份cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml然后设置 MapReduce 的框架为 YARNconfiguration property namemapreduce.framework.name/name valueyarn/value /property /configuration四份文件全部改完后可以用hdfs namenode -format格式化文件系统。格式化会生成 NameNode 的元数据并写入dfs.namenode.name.dir指定的目录。注意只能在首次启动前格式化一次以后每次启动都不需要再格式化否则会清空已有的元数据导致 DataNode 和 NameNode 的 clusterID 不一致这是后面常见的坑。4.2 启动 HDFS 和 YARN 并验证进程格式化完用start-dfs.sh和start-yarn.sh启动服务。启动后立刻用jps查看 Java 进程hdfs namenode -format start-dfs.sh start-yarn.sh jps正常情况下你应该看到 5 个进程NameNode DataNode ResourceManager NodeManager SecondaryNameNode如果缺少某个进程优先去logs/目录看对应的日志文件。NameNode 的日志是hadoop-hadoop-namenode-hostname.logDataNode 是hadoop-hadoop-datanode-hostname.log。很多人启动完不查日志就反复重启这是浪费时间日志里已经写清楚失败原因了。验证 HDFS 是否正常最直接的方法是执行hdfs dfs -mkdir /test hdfs dfs -put hadoop-3.3.6.tar.gz /test/ hdfs dfs -ls /test/如果put成功说明 HDFS 的读写链路是通的。访问http://localhost:9870可以看到 NameNode 的 Web 界面3.x 默认端口是 9870不是 2.x 时代的 50070这个改动坑了不少从旧教程迁移过来的人。4.3 从伪分布式到完全分布式参数变化在哪儿伪分布式跑通后往完全分布式扩展其实只是把localhost换成主机名或 IP并把角色拆到多台机器。最少需要三台机器一台跑 NameNode ResourceManager两台跑 DataNode NodeManager。core-site.xml里的fs.defaultFS改成hdfs://namenode-host:9000dfs.replication改成 2 或 3然后在每台 DataNode 上单独配置hdfs-site.xml并指向相同的 NameNode 地址。完全分布式里最容易出错的是 SSH 免密的覆盖范围不仅 NameNode 要能免密登录自己还要能免密登录所有 DataNode否则start-dfs.sh在远程启动 DataNode 时会失败。我一般会在 NameNode 上把每台 DataNode 的id_rsa.pub收集到authorized_keys里而不是逐台机器重复配密钥。5. 安装与配置里最常见的 5 个坑现象、原因、解法5.1 NameNode 启动失败日志报 “Cannot lock storage”现象执行start-dfs.sh后jps看不到 NameNode 进程日志里出现Cannot lock storage或NameNode is still formatting。原因dfs.namenode.name.dir指定的目录被多次格式化或者上一次启动的 NameNode 进程没被杀干净文件锁还在。解决先stop-dfs.sh再执行jps确认没有NameNode进程如果有就kill -9杀掉。然后删除hadoop.tmp.dir下的dfs/name/current目录重新执行hdfs namenode -format。注意不要在多台机器上同时格式化同一个共享存储目录。5.2 DataNode 报 “Incompatible clusterIDs”现象NameNode 正常DataNode 启动失败日志里有Incompatible clusterIDs。原因格式化 NameNode 后DataNode 的 data 目录里残留了旧 clusterID。DataNode 会用自己 data 目录里的 VERSION 文件去和 NameNode 对比对不上就拒绝启动。解决找到dfs.datanode.data.dir配置的目录删除里面的dfs/data/current整个目录如果你设的是/opt/hadoop/tmp/dfs/data就把这个 data 目录里的内容清空然后重启 DataNode。千万别说“我格式化过 DataNode 了”——你格式化的是 NameNode不是 DataNode这两套元数据是分开的。5.3 Web 界面打不开但进程都在现象jps看到 5 个进程都在但浏览器访问http://localhost:9870就是不通。原因最常见的是防火墙没放行端口或者你用的是云服务器但安全组没开。伪分布式本地访问时也可能是浏览器所在机器和 Hadoop 不在同一网络段。解决先在 Hadoop 机器上执行curl http://localhost:9870能通说明服务正常问题出在网络。然后检查防火墙规则systemctl status firewalld如果开着就systemctl stop firewalld或者执行firewall-cmd --add-port9870/tcp --permanent。云主机还要去控制台确认安全组规则。5.4 运行 WordCount 时报 “Unsupported Class Version”现象HDFS 正常hadoop jar提交作业后NodeManager 日志里报UnsupportedClassVersionError。原因编译 MapReduce 程序用的 JDK 版本和 Hadoop 运行时的 JDK 版本不一致。Hadoop 3.3.6 默认用 JDK 8 字节码编译的库跑作业如果你用 JDK 11 编译作业且目标字节码版本是 55而 NodeManager 的 JVM 是 JDK 8就会直接抛这个错。解决统一集群所有节点的 JDK 版本并且编译作业时指定-source 8 -target 8。Maven 项目里在pom.xml配maven.compiler.source和maven.compiler.target为 1.8。5.5 HDFS 磁盘空间被三副本撑爆现象跑了一晚上后发现磁盘只剩几个 GBhdfs dfsadmin -report显示 Used 空间异常大。原因伪分布式模式下你却把dfs.replication设成了 3。每个数据块会被复制 3 份存储开销直接翻三倍。很多教程在讲完全分布式时强调副本数 3新手转到伪分布式时忘了改。解决检查hdfs-site.xml把dfs.replication改为 1然后重启 HDFS。已经写入的大文件不用急着删可以把副本率调低后执行hdfs dfs -setrep -R 1 /。如果你用虚拟机做实验快照文件还会额外占空间建议把 HDFS 的 data 目录放到单独的磁盘分区。6. 玩转 3.3.6纠删码、Timeline Server 与集群健康检查Hadoop 3.3.6 里最值得尝鲜的功能是 HDFS Erasure Coding。传统三副本模式存储开销太大纠删码用rs-3-2-1024k这类编码策略只需要 1.4 倍左右的存储开销就能容忍两个节点同时故障。开启方式很简单hdfs ec -enablePolicy -policy RS-3-2-1024k hdfs ec -setPolicy -path /test -policy RS-3-2-1024k注意纠删码只适合冷数据也就是写入后很少修改的数据。如果是频繁追加写的热数据建议还是保持副本模式因为纠删码在数据更新时要重新计算编码块反而拖慢性能。生产环境里我一般把临时目录设为副本模式把归档目录设为纠删码模式。YARN 的 Timeline Service v2 在 3.x 里改成了流式写入能帮你查看历史作业的 CPU 和内存使用曲线。但它默认是关闭的需要修改yarn-site.xml里的yarn.timeline-service.enabled和yarn.resourcemanager.system-metrics-publisher.enabled。如果只是做课程设计或面试准备凑齐jps五件套就够了Timeline Server 属于锦上添花。验证集群是否健康我有一个固定流程先hdfs dfsadmin -report看 DataNode 是否 alive、剩余空间是否够再访问 ResourceManager 的 Web 页面看是否有节点被标记为 LOST最后跑一次 WordCount 验证 MapReduce 全链路。这三个检查都通过我才会认为这个环境是交付状态。跑 WordCount 是最好用的“验尸”手段很多配置错误都会在这个阶段暴露出来比你在 Web 界面里翻半天日志快得多。我的个人习惯是每搭完一个 Hadoop 环境就把当天用到的命令、改过的配置文件和踩过的坑写成一篇笔记下次换机器时直接照着跑。因为这种分布式组件的环境搭建充满细节三个月后再碰就全忘了。如果你照着这篇文章搭完发现某个步骤没写清楚那就看看官方docs目录下的hadoop-project-dist文档里面对这些参数的定义是最权威的答案。希望这篇实战笔记能帮你少走几个坑。本文还有配套的精品资源点击获取