简介: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.sh |
sbin/ | 启动和停止脚本:start-dfs.sh、stop-dfs.sh、start-yarn.sh |
bin/ | 客户端命令: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_HOME:
export 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> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop/tmp</value> </property> </configuration>fs.defaultFS设为hdfs://localhost:9000,表示所有 HDFS 操作都走这个地址。hadoop.tmp.dir是 NameNode 和 DataNode 存放元数据和数据块的根目录,务必换成持久化路径,这是很多老手都会提醒的点。
接着改hdfs-site.xml,伪分布式副本数设为 1 就行,至少设置dfs.namenode.name.dir和dfs.datanode.data.dir指向明确目录,方便以后排查磁盘占用。
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/hadoop/tmp/dfs/data</value> </property> </configuration>dfs.replication=1是伪分布式必须的,否则三副本会把磁盘撑爆。dfs.namenode.name.dir里用file://前缀是因为该路径指向本地文件系统,而不是 HDFS 路径。新手经常在这里漏掉file://,导致 NameNode 无法启动。
yarn-site.xml需要配置资源管理相关的属性。伪分布式模式下,让 ResourceManager 和 NodeManager 都跑在本机就行,但需要注意yarn.nodemanager.aux-services必须设置为mapreduce_shuffle,否则 MapReduce 作业在 Shuffle 阶段会失败。
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</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 的框架为 YARN:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</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>.log,DataNode 是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:9000,dfs.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-port=9870/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 磁盘空间被三副本撑爆
现象:跑了一晚上后发现磁盘只剩几个 GB,hdfs 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文档,里面对这些参数的定义是最权威的答案。希望这篇实战笔记能帮你少走几个坑。
本文还有配套的精品资源,点击获取