
简介Apache Hadoop 3.3.3 官方发行包hadoop-3.3.3.tar.gz面向大数据初学者、分布式系统开发者与运维人员用于搭建可靠、可扩展的分布式计算与存储环境。该框架以简单编程模型实现跨集群处理大型数据集可从单机平滑扩展至数千节点并在应用层检测与处理故障从而在易出错的普通硬件上提供高可用服务。压缩包共含 22536 个文件约 615.16MB以 18870 个 html 文档、763 个 jpg 与 762 个 gif 图片、488 个 css 样式为主辅以 449 个 jar 依赖、124 个 xml 配置、75 个 sh 脚本及 63 个 txt 说明另含 libhadoop、libhdfs、libnativetask 等本地库与 wordcount 示例程序覆盖文档、配置、依赖与原生组件。目前已有 644 人学习下载适合需要完整发行包进行环境部署、源码查阅与组件调试的读者。1. 为什么 2024 年还在折腾 Hadoop 3.3.3一份能跑起来的 tar.gz 到底值在哪如果你最近在招聘网站搜「大数据开发」会发现一个反直觉的现象Spark、Flink 满天飞但岗位 JD 里几乎都藏着一句「熟悉 Hadoop 生态」。原因不复杂——离线数仓的底座还是 HDFS YARN实时链路再花哨最终落地存储和资源调度绕不开它。而 hadoop-3.3.3.tar.gz 这个包恰好是 Apache 官方 3.x 系列里被企业用得最稳的一个版本既不像 2.7 那样老到缺特性也不像 3.4 之后改动大、踩坑资料少。它解决的核心问题就一个给你一套能自己掌控的分布式存储和计算调度环境不依赖任何云厂商绑定。适合谁正在搭离线数仓的初中级工程师、需要本地复现生产问题的运维、以及被「伪分布式都装不起来」卡住的学生。下面我按自己拆包、改配置、跑任务的顺序把这份资源从头到尾过一遍。2. 解包前先想清楚HDFS 与 YARN 的角色分工和目录规划2.1 为什么不是解压完就能用很多人拿到 hadoop-3.3.3.tar.gz 第一反应是tar -zxvf然后start-all.sh结果报一堆 JAVA_HOME 和 hostname 错误。根子在于 Hadoop 是「配置驱动」的框架tar.gz 里只有二进制和默认配置真正的运行形态由你写的 XML 决定。先理解两个核心角色HDFS 负责把文件切成块分散存储NameNode 记元数据、DataNode 存实际块YARN 负责资源调度ResourceManager 管全局资源、NodeManager 管单机容器。伪分布式就是把 NameNode、DataNode、ResourceManager、NodeManager 全塞在一台机器上用不同进程模拟集群。选型上3.3.3 默认用 Java 8别急着上 Java 17否则会遇到反射相关的IllegalAccessError这是血泪经验。2.2 目录结构与环境变量落地解压后先别改配置把目录规划好能省后面很多事。我一般放在/opt/module/下软链一个hadoop指向具体版本升级时只换软链。# 解压到统一模块目录-C 指定目标路径 tar -zxvf hadoop-3.3.3.tar.gz -C /opt/module/ # 建立软链接后续配置全部基于 /opt/module/hadoop ln -s /opt/module/hadoop-3.3.3 /opt/module/hadoop # 验证解压结果应看到 bin、etc、sbin、share 等目录 ls /opt/module/hadoop逻辑说明软链的好处是配置文件里写/opt/module/hadoop即可将来换 3.3.4 只改软链指向环境变量和脚本不用动。参数上-C必须存在否则会解压到当前目录造成混乱。接着配环境变量编辑/etc/profile.d/my_env.shexport HADOOP_HOME/opt/module/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export JAVA_HOME/opt/module/jdk1.8.0_212HADOOP_HOME是所有脚本找配置的基准sbin里放的是start-dfs.sh这类集群启停脚本bin里是hdfs、yarn客户端命令。JAVA_HOME必须指向 JDK 根目录而不是bin这是新手最常翻车的地方。改完source /etc/profile.d/my_env.sh用hadoop version验证能打印 3.3.3 就说明二进制和 Java 都通了。2.3 四类 XML 配置文件的修改顺序Hadoop 的配置文件都在$HADOOP_HOME/etc/hadoop/下改的顺序建议按「先 HDFS 后 YARN先核心后外围」来。核心是这四个core-site.xml定默认文件系统和临时目录hdfs-site.xml定副本数和 NameNode 数据目录mapred-site.xml指定计算框架走 YARNyarn-site.xml配 ResourceManager 和 NodeManager。下面逐个给可抄的配置。core-site.xmlconfiguration !-- 默认文件系统指向本机 NameNode 的 RPC 端口 -- property namefs.defaultFS/name valuehdfs://hadoop102:8020/value /property !-- 临时目录NameNode 格式化和运行时数据都放这 -- property namehadoop.tmp.dir/name value/opt/module/hadoop/data/tmp/value /property /configurationhadoop.tmp.dir一定要显式指定默认在/tmp下机器重启可能被清空导致集群元数据丢失这是生产环境大忌。fs.defaultFS里的主机名要和/etc/hosts里配的一致否则客户端连不上。hdfs-site.xmlconfiguration !-- 伪分布式副本数只能为 1因为只有一个 DataNode -- property namedfs.replication/name value1/value /property !-- NameNode 元数据存放路径 -- property namedfs.namenode.name.dir/name value/opt/module/hadoop/data/namenode/value /property !-- DataNode 数据块存放路径 -- property namedfs.datanode.data.dir/name value/opt/module/hadoop/data/datanode/value /property /configuration副本数设大于 1 在单机伪分布式下会一直报「只能复制到 0 个节点」因为块放置策略找不到第二个 DataNode。把 name 和 data 目录分开排查问题时能快速定位是元数据坏了还是块文件坏了。mapred-site.xml和yarn-site.xml的关键项!-- mapred-site.xml告诉 MapReduce 用 YARN 调度 -- property namemapreduce.framework.name/name valueyarn/value /property !-- yarn-site.xmlNodeManager 的辅助服务必须含 mapreduce_shuffle -- property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuehadoop102/value /propertymapreduce_shuffle不配MapReduce 任务会卡在 reduce 阶段拿不到 map 输出。yarn.resourcemanager.hostname写主机名而不是 IP方便后续换网络环境。3. 格式化与启动NameNode 初始化到 Web UI 验证的完整链路3.1 格式化 NameNode 的正确姿势与重复格式化的坑配置改完第一步是格式化 NameNode本质是创建dfs.namenode.name.dir下的元数据目录和初始 fsimage。# 格式化 NameNode只在首次搭建时执行 hdfs namenode -format看到Storage directory ... has been successfully formatted才算成功。这里有个高频翻车点如果你改了dfs.namenode.name.dir或fs.defaultFS里的集群 ID必须先把旧的 data 目录删干净再格式化否则会出现clusterID不一致DataNode 启动后直接退出。我一般格式化前先rm -rf /opt/module/hadoop/data保证干净。格式化只能做一次重复格式化会让已有数据全部失效这是没有后悔药的操作。3.2 启动 HDFS 与 YARN 并核对进程# 启动 HDFS会拉起 NameNode、DataNode、SecondaryNameNode start-dfs.sh # 启动 YARN会拉起 ResourceManager、NodeManager start-yarn.sh # 查看 Java 进程确认五个核心进程都在 jpsjps正常应看到 NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager 五个。少哪个就去$HADOOP_HOME/logs/下看对应日志。常见情况是 DataNode 没起来多半是 clusterID 不匹配或 data 目录权限问题。启动脚本依赖免密登录伪分布式下也要给本机配 SSH 免密否则start-dfs.sh会反复提示输密码。3.3 用 Web UI 和命令行双重验证进程起来不代表能用必须验证读写。先看 Web UINameNode 在http://hadoop102:9870能看到 Overview 里 Live Nodes 为 1ResourceManager 在http://hadoop102:8088能看到集群资源。命令行验证# 在 HDFS 根目录建测试目录 hdfs dfs -mkdir -p /test/input # 上传本地文件到 HDFS hdfs dfs -put /etc/profile /test/input/ # 列出文件确认大小和副本数 hdfs dfs -ls /test/input/ # 查看块信息验证副本数为 1 hdfs fsck /test/input/profile -files -blocksfsck输出里能看到每个块所在 DataNode副本数显示 1 就对了。这一步过了说明 HDFS 读写链路完整。YARN 的验证放到下一章跑 MapReduce 时一起做因为空跑 YARN 看不出调度问题。4. 跑通第一个 MapReduce从 wordcount 到 YARN 调度排查4.1 用自带示例验证全链路Hadoop 自带 wordcount 示例 jar不用自己写代码就能验证 HDFS YARN 是否打通。# 提交 wordcount 任务输入 HDFS 目录输出目录必须不存在 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar \ wordcount /test/input /test/output # 查看输出结果 hdfs dfs -cat /test/output/part-r-00000参数说明第一个路径是输入目录第二个是输出目录输出目录若已存在会直接报FileAlreadyExistsException这是 Hadoop 的保护机制防止覆盖历史结果。任务提交后去 8088 端口能看到 application 状态从 ACCEPTED 到 RUNNING 再到 FINISHED。如果卡在 ACCEPTED 超过一分钟多半是 YARN 资源不够或 NodeManager 没注册上。4.2 资源参数怎么调才不报错伪分布式下默认容器内存可能不够跑大一点的任务会报Container is running beyond physical memory limits。这时要改yarn-site.xml!-- 单容器可用最大内存按机器实际内存调整 -- property nameyarn.nodemanager.resource.memory-mb/name value4096/value /property !-- 单个任务可申请的最大内存 -- property nameyarn.scheduler.maximum-allocation-mb/name value2048/value /propertyresource.memory-mb是 NodeManager 能分配给所有容器的总内存maximum-allocation-mb是单个容器上限后者不能大于前者。改完要stop-yarn.sh再start-yarn.shYARN 不支持热加载这些参数。MapReduce 任务本身的内存通过mapreduce.map.memory.mb和mapreduce.reduce.memory.mb控制默认 1024小数据量够用。4.3 日志定位的三层结构任务失败别急着百度Hadoop 日志分三层客户端提交日志、YARN 容器日志、具体 task 日志。容器日志在$HADOOP_HOME/logs/userlogs/application_xxx/container_xxx/下syslog是框架日志stderr是业务报错。我一般先看stderr90% 的问题空指针、类型转换、路径不存在都在那。YARN 的聚合日志功能默认没开开了之后可以用yarn logs -applicationId xxx直接拉全量日志省得去每台机器翻目录。5. 避坑与排查伪分布式搭建里最容易翻车的五件事5.1 现象DataNode 启动后立刻消失jps 里看不到原因NameNode 格式化后 clusterID 变了而 DataNode 的 data 目录里还留着旧 clusterID两者对不上DataNode 启动时校验失败自动退出。解决停掉所有进程删除dfs.datanode.data.dir指向的目录重新hdfs namenode -format后再启动。根治办法是格式化前统一清空 data 目录。5.2 现象Web UI 9870 打不开但进程明明在原因3.x 版本 NameNode 的 HTTP 端口从 2.x 的 50070 改成了 9870很多人还按老教程访问 50070。另外防火墙没放行也会导致打不开。解决确认访问 9870并检查firewalld状态测试环境可临时关闭生产环境按需放行端口。ResourceManager 的 Web 端口是 8088不是 8080别搞混。5.3 现象hdfs dfs 命令报「Connection refused」原因fs.defaultFS里写的主机名在/etc/hosts里没映射或者 NameNode 根本没起来。解决先jps确认 NameNode 在再cat /etc/hosts确认主机名解析到本机 IP。常见错误是 hosts 里写成了127.0.0.1而配置里用了真实主机名导致客户端连到回环地址失败。5.4 现象MapReduce 任务一直卡在 ACCEPTED原因YARN 可用资源不足或者 NodeManager 没注册到 ResourceManager。解决去 8088 看 Nodes 数量是否为 1为 0 说明 NodeManager 没起来查它的日志为 1 但资源显示 0说明resource.memory-mb配得比机器实际内存还大调小即可。伪分布式下把内存参数设成机器内存的一半比较稳妥。5.5 现象上传文件报「Could only be replicated to 0 nodes」原因DataNode 没正常运行或者磁盘空间不足或者副本数设成了大于可用 DataNode 数量。解决先jps确认 DataNode 在再df -h看磁盘最后确认dfs.replication在伪分布式下是 1。三个都排查完基本能定位。6. 进阶技巧用 distcp 做数据迁移和快照做误删恢复搭好集群只是开始真正体现 Hadoop 价值的是数据搬家和容错。先说 distcp它是分布式复制工具底层跑 MapReduce适合跨集群或集群内大批量迁移。# 集群内复制-m 指定 map 数量控制并发 hadoop distcp -m 10 /test/input /test/input_backup # 跨集群复制源和目标都写完整 URI hadoop distcp -m 10 hdfs://hadoop102:8020/test/input hdfs://hadoop103:8020/test/input-m控制并发 map 数太小迁移慢太大压垮 NameNode一般按数据量除以 256MB 估算。distcp 会校验文件大小和 checksum比手动hdfs dfs -cp可靠后者在跨集群时根本用不了。再说快照HDFS 支持目录级快照误删后能秒级恢复这是生产环境的后悔药。# 允许目录创建快照 hdfs dfsadmin -allowSnapshot /test # 创建快照命名带日期便于追溯 hdfs dfs -createSnapshot /test snap_20240101 # 误删后从快照恢复 hdfs dfs -cp /test/.snapshot/snap_20240101/input /test/input快照只记录块列表的差异不复制实际数据所以创建几乎不占额外空间。但要注意快照目录是只读的不能直接往里写。我一般对核心数仓层目录开启快照每天定时建一个保留最近七天。从那以后我每次做数据迁移前都强制走一遍 distcp 加快照双保险再也没出现过迁移中断导致源数据损坏的情况。希望帮到你。本文还有配套的精品资源点击获取