简介本资源为Apache Hadoop 2.6.5的官方发行压缩包面向大数据初学者、运维工程师及分布式系统学习者用于在Linux环境下搭建HDFS、MapReduce与YARN组成的分布式计算平台解决大规模数据存储与并行处理的环境准备问题。压缩包共900个文件约175.09MB以477个jar核心库、129个class字节码、51个xml配置文件及50个sh启动脚本为主另含html、properties、so动态库与示例文档等覆盖运行、配置与监控所需组件。目前已有1266人学习下载。解压后可得完整hadoop-2.6.5目录包含HDFS分布式文件系统、MapReduce编程模型与YARN资源调度器三大模块并附带core-site.xml、hdfs-site.xml等配置模板及集群节点设置参考便于读者快速完成单机或伪分布式部署理解NameNode、DataNode、ResourceManager等角色分工为后续学习Hive、Spark等生态组件打下基础。1. 拿到 hadoop-2.6.5.tar.gz 之后为什么老版本仍有人在生产里跑手上拿到一个hadoop-2.6.5.tar.gz第一反应往往是「这版本也太老了吧」。确实Hadoop 2.6.5 是 2016 年前后的产物官方早已停止维护可在不少存量项目、教学实验、课程设计里它依然是主力——很多基于 Hadoop 的交通信息分析系统、日志离线统计、课程设计题目环境基线就锁死在这个版本。原因很现实生态里的 Hive、HBase、Sqoop 老版本和它磨合得最稳JDK 7/8 就能跑虚拟机内存占用也小。这篇笔记就围绕这个压缩包展开讲清楚从零开始安装 Hadoop、伪分布式搭建、完全分布式集群搭建的完整路径以及 Windows 下用 IDEA 连 HDFS 做开发环境时那些容易翻车的地方。适合两类人一是要交课程设计、跑通头歌实践平台实验的学生二是接手了老集群、需要重新拉起一套测试环境的运维和开发。核心不是背命令而是搞明白每一步在改什么、为什么这么改、改错了看哪里。2. 解压之前先想清楚单机、伪分布式、完全分布式怎么选2.1 三种模式的本质差别Hadoop 的「单机模式」「伪分布式模式」「完全分布式模式」不是三套不同的软件而是同一份hadoop-2.6.5.tar.gz配不同的配置文件。单机模式什么都不用改解压即用所有进程跑在一个 JVM 里用的是本地文件系统只能拿来验证hadoop jar能不能跑通没有 HDFS 也没有 YARN。伪分布式是把 NameNode、DataNode、ResourceManager、NodeManager 全部塞到一台机器上各自独立进程走的是真正的 HDFS 和 YARN 逻辑只是副本数只能设 1。完全分布式才是把角色拆到多台机器主节点跑 NameNode 和 ResourceManager从节点跑 DataNode 和 NodeManager。选哪种取决于你要验证什么。只想跑个 WordCount 看结果单机模式五分钟搞定。要练 HDFS 的读写、要提交作业到 YARN 看调度流程伪分布式足够一台 4G 内存的虚拟机就能撑。要做集群模式主节点配置、要观察多节点数据分布和容错才需要完全分布式至少三台机器。2.2 环境准备与 JDK 选择Hadoop 2.6.5 对 JDK 很挑。它编译时用的是 JDK 7跑在 JDK 8 上没问题但 JDK 9 及以上会因为模块化改动直接报错java.lang.NoClassDefFoundError: javax/activation/DataSource这类异常就是典型症状。所以第一件事是把 JDK 锁到 8。# 确认当前 JDK 版本必须是 1.8.x java -version # 如果是 Ubuntu装 openjdk-8 sudo apt-get update sudo apt-get install -y openjdk-8-jdk # 配置 JAVA_HOME写进 /etc/profile 让所有用户生效 echo export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 | sudo tee -a /etc/profile echo export PATH$JAVA_HOME/bin:$PATH | sudo tee -a /etc/profile source /etc/profile这段逻辑很直白先确认版本再装包最后把JAVA_HOME固化到全局 profile。参数上唯一要注意的是路径不同发行版 JDK 安装目录不一样Ubuntu 是/usr/lib/jvm/java-8-openjdk-amd64CentOS 通常是/usr/lib/jvm/java-1.8.0-openjdk用update-alternatives --config java能看到真实路径。JAVA_HOME配错是后面所有启动失败的头号原因hadoop-daemon.sh启动时会直接提示找不到 Java。2.3 主机名、hosts 与 SSH 免密完全分布式和伪分布式都依赖主机名解析。伪分布式虽然只有一台但 Hadoop 内部会用主机名去连 NameNode如果/etc/hosts里没有映射就会出现「连接 xshell 不成功」类似的连不上问题——本质是主机名解析不到。# 设置主机名 sudo hostnamectl set-hostname hadoop-master # 编辑 /etc/hosts把本机 IP 和主机名绑上 # 假设本机 IP 是 192.168.1.100 sudo tee -a /etc/hosts EOF 192.168.1.100 hadoop-master EOF # 生成密钥并授权实现自己连自己免密 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 验证免密 ssh hadoop-masterssh-keygen的-P 表示空密码-f指定密钥文件位置。authorized_keys权限必须是 600权限过宽 SSH 会拒绝使用。验证时如果还要输密码说明authorized_keys没生效检查~/.ssh目录权限是不是 700。完全分布式里主节点还要把自己的公钥分发到每个从节点否则启动脚本没法远程拉起 DataNode。3. 伪分布式搭建全过程从解压到 HDFS 初体验3.1 解压、目录规划与环境变量# 解压到 /opt这是社区惯例方便统一管理 sudo tar -zxvf hadoop-2.6.5.tar.gz -C /opt/ # 建个软链接以后升级版本不用改一堆配置 cd /opt sudo ln -s hadoop-2.6.5 hadoop # 把 Hadoop 的 bin 和 sbin 加进 PATH echo export HADOOP_HOME/opt/hadoop | sudo tee -a /etc/profile echo export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH | sudo tee -a /etc/profile source /etc/profile # 验证 hadoop version用软链接是个好习惯配置文件里写/opt/hadoop而不是带版本号的路径将来换版本只改软链接指向。hadoop version能打印出Hadoop 2.6.5就说明环境变量生效了。如果提示 command not found八成是source没执行或者 PATH 拼错。3.2 五个核心配置文件怎么改Hadoop 2.6.5 的配置全在$HADOOP_HOME/etc/hadoop/下伪分布式要改的是core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml外加hadoop-env.sh里的 JAVA_HOME。!-- core-site.xml指定 HDFS 的入口地址和临时目录 -- configuration property namefs.defaultFS/name valuehdfs://hadoop-master:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/data/tmp/value /property /configuration!-- hdfs-site.xml伪分布式副本数只能是 1 -- configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/opt/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name value/opt/hadoop/data/datanode/value /property /configuration!-- mapred-site.xml告诉 MapReduce 用 YARN 跑不是本地 -- configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration!-- yarn-site.xmlNodeManager 的辅助服务缺了作业起不来 -- configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuehadoop-master/value /property /configurationfs.defaultFS里的端口 9000 是 NameNode 的 RPC 端口2.x 默认就是 9000别和 Web UI 的 50070 搞混。hadoop.tmp.dir一定要显式指定默认落在/tmp下机器一重启数据全没NameNode 格式化过的元数据丢了就得重来。dfs.replication在伪分布式下必须设 1设 3 会因为凑不齐副本一直卡在安全模式。mapreduce.framework.name设成yarn才是真正的分布式计算设成local就退回单机了。yarn.nodemanager.aux-services的值mapreduce_shuffle是固定写法写错作业会卡在 ACCEPTED 状态不动。hadoop-env.sh里把export JAVA_HOME${JAVA_HOME}改成绝对路径因为脚本执行时不一定继承了 profile 里的变量。3.3 格式化与启动看日志判断成败# 第一次启动前必须格式化 NameNode只能做一次 hdfs namenode -format # 启动 HDFS start-dfs.sh # 启动 YARN start-yarn.sh # 用 jps 看进程正常应该有 5 个 jpsjps期望看到NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager五个进程。少哪个就去$HADOOP_HOME/logs/下找对应角色的日志。格式化只能做一次重复格式化会生成新的 clusterID导致 DataNode 的 clusterID 对不上而拒绝启动报Incompatible clusterIDs。真格式化了两次就把dfs.namenode.name.dir和dfs.datanode.data.dir指向的目录全删掉重新格式化。3.4 HDFS 初体验上传、查看、下载# 在 HDFS 上建目录 hdfs dfs -mkdir -p /user/root/input # 上传本地文件 hdfs dfs -put /etc/profile /user/root/input/ # 查看 hdfs dfs -ls /user/root/input/ # 查看文件内容 hdfs dfs -cat /user/root/input/profile # 下载回本地 hdfs dfs -get /user/root/input/profile /tmp/profile.bak-mkdir -p支持多级创建-put是上传-get是下载-cat直接打印内容。这些命令和 Linux 文件操作很像但操作的是 HDFS 命名空间。上传后可以打开浏览器访问http://hadoop-master:50070在 Utilities 里 Browse the file system能看到文件被切成块、每个块存在哪个 DataNode 上。这一步是理解 HDFS 分块存储最直观的方式。4. 完全分布式集群搭建主节点配置与从节点加入4.1 集群规划与角色分配完全分布式至少要三台机器规划如下主机名IP角色hadoop-master192.168.1.100NameNode、ResourceManager、SecondaryNameNodehadoop-slave1192.168.1.101DataNode、NodeManagerhadoop-slave2192.168.1.102DataNode、NodeManager每台机器都要做前面说的 JDK、hosts、SSH 免密。主节点额外要把公钥分发到两个从节点从节点也要能免密登录主节点因为启动脚本是双向通信的。# 在主节点上分发公钥到从节点 ssh-copy-id hadoop-slave1 ssh-copy-id hadoop-slave2 # 验证从主节点能免密登录从节点 ssh hadoop-slave1 hostnamessh-copy-id会自动把公钥追加到对方authorized_keys。如果从节点也要免密回主节点就在从节点上同样执行一次ssh-copy-id hadoop-master。这一步漏了start-dfs.sh会卡在启动 DataNode 那一步日志里能看到Permission denied。4.2 主节点配置的差异点完全分布式的core-site.xml和hdfs-site.xml和伪分布式基本一致差别在dfs.replication要设成 2 或 3以及要显式配置slaves文件。# 编辑 $HADOOP_HOME/etc/hadoop/slaves列出所有从节点 tee $HADOOP_HOME/etc/hadoop/slaves EOF hadoop-slave1 hadoop-slave2 EOFslaves文件2.x 里叫 slaves3.x 改叫 workers是启动脚本读取的从节点清单每行一个主机名。start-dfs.sh会遍历这个文件SSH 到每台机器拉起 DataNode。文件里写 IP 也行但推荐写主机名和 hosts 保持一致。dfs.replication设成 2 意味着每个块存两份分布在不同的 DataNode 上。如果只有两台从节点设 3 会导致部分块永远凑不齐副本集群一直处于安全模式。副本数的上限是 DataNode 数量。4.3 分发配置与启动顺序# 把配置好的 Hadoop 目录同步到从节点 for host in hadoop-slave1 hadoop-slave2; do rsync -avz /opt/hadoop-2.6.5/ $host:/opt/hadoop-2.6.5/ done # 在主节点格式化只做一次 hdfs namenode -format # 启动 HDFS脚本会自动拉起所有从节点 start-dfs.sh # 启动 YARN start-yarn.sh # 在主节点和从节点分别 jps 验证rsync -avz的-a保留权限和时间戳-v输出详情-z压缩传输。分发完要确认从节点上的JAVA_HOME和主节点一致否则从节点启动会失败。启动顺序上先 HDFS 后 YARN因为 YARN 的 ResourceManager 启动时会去连 HDFS。全部起来后主节点jps应该有 NameNode、ResourceManager、SecondaryNameNode从节点应该有 DataNode、NodeManager。4.4 作业提交到 YARN 的完整流程# 跑一个自带的 WordCount 例子 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar \ wordcount /user/root/input /user/root/output # 查看输出 hdfs dfs -cat /user/root/output/part-r-00000作业提交后客户端先把 jar 和输入分片信息传给 ResourceManagerResourceManager 在某个 NodeManager 上起一个 ApplicationMasterApplicationMaster 再去申请容器跑 Map 和 Reduce 任务。整个过程可以在http://hadoop-master:8088的 Web UI 上看到从 ACCEPTED 到 RUNNING 再到 FINISHED。如果卡在 ACCEPTED 不动多半是yarn.nodemanager.aux-services配错或者 NodeManager 没起来。输出目录必须不存在否则作业直接报Output directory already exists这是 MapReduce 的保护机制防止覆盖已有结果。5. 避坑与排查那些让集群起不来的常见问题5.1 重复格式化导致 clusterID 不一致现象DataNode 启动后立刻退出日志里报java.io.IOException: Incompatible clusterIDs。原因是 NameNode 格式化了两次每次生成新的 clusterID而 DataNode 的 clusterID 还是旧的。解决办法是把dfs.namenode.name.dir和dfs.datanode.data.dir指向的目录全部清空重新格式化一次然后重启。血泪经验是格式化前先确认目录是空的别手快连点两次。5.2 主机名解析失败导致连不上现象start-dfs.sh卡住或者从节点 DataNode 起不来日志里是UnknownHostException。原因是/etc/hosts里没配主机名映射或者主机名和配置文件里写的不一致。解决是每台机器都检查hostname和/etc/hosts确保fs.defaultFS、yarn.resourcemanager.hostname里用的主机名能在 hosts 里找到。改完 hosts 不用重启但已经启动的进程要重启才能重新解析。5.3 端口占用与防火墙拦截现象NameNode 起不来日志报BindException: Address already in use或者 Web UI 打不开。原因是 9000、50070、8088 这些端口被别的进程占了或者防火墙没放行。解决是用netstat -tlnp | grep 9000找到占用进程要么杀掉要么改 Hadoop 端口。防火墙方面测试环境直接systemctl stop firewalld或ufw disable生产环境要按需放行端口而不是全关。5.4 JDK 版本不匹配的隐蔽报错现象hadoop version能跑但一启动就报NoClassDefFoundError或者UnsupportedClassVersionError。原因是系统里有多个 JDKhadoop-env.sh里的JAVA_HOME指向了高版本。解决是打开hadoop-env.sh把export JAVA_HOME改成 JDK 8 的绝对路径不要用${JAVA_HOME}这种依赖外部环境的写法。改完所有节点都要同步。5.5 从节点磁盘目录权限问题现象DataNode 启动报Permission denied无法写入数据目录。原因是数据目录是用 root 建的而 Hadoop 进程可能以普通用户跑。解决是统一用同一个用户操作或者把数据目录的属主改成运行 Hadoop 的用户chown -R hadoop:hadoop /opt/hadoop/data。权限问题在完全分布式里尤其常见因为每台机器的用户和目录权限可能不一致。6. Windows 下用 IDEA 连 HDFS 开发把开发环境搭起来前面讲的都是 Linux 侧。实际开发中很多人是在 Windows 上用 IDEA 写 MapReduce 程序远程提交到 Linux 集群。这条路能走通但坑不少核心是让 Windows 上的客户端能识别 HDFS 的 URI 和权限。第一步是准备 Windows 版的 Hadoop 依赖。hadoop-2.6.5.tar.gz是 Linux 包Windows 上跑需要额外的winutils.exe和hadoop.dll放到HADOOP_HOME/bin下并把HADOOP_HOME加进系统环境变量。缺了这两个文件会报Could not locate executable null\bin\winutils.exe。第二步是在 IDEA 里建 Maven 项目引入依赖dependencies dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-client/artifactId version2.6.5/version /dependency /dependencieshadoop-client是个聚合包把hadoop-common、hadoop-hdfs、hadoop-mapreduce-client-core都带进来了版本必须和集群一致2.6.5 对 2.6.5跨小版本也可能出问题。第三步是写一个最简单的 HDFS 操作类import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HdfsDemo { public static void main(String[] args) throws Exception { // 指定 NameNode 地址和 core-site.xml 里一致 Configuration conf new Configuration(); conf.set(fs.defaultFS, hdfs://192.168.1.100:9000); // 用 root 身份访问避免权限拒绝 System.setProperty(HADOOP_USER_NAME, root); FileSystem fs FileSystem.get(conf); // 创建目录 fs.mkdirs(new Path(/user/root/idea-test)); // 判断是否存在 System.out.println(fs.exists(new Path(/user/root/idea-test))); fs.close(); } }fs.defaultFS直接写 IP 加端口避免 Windows 解析不了 Linux 主机名。HADOOP_USER_NAME设成 root 是因为 Windows 当前用户名在 HDFS 上不存在不设会报Permission denied: userxxx。FileSystem.get(conf)会按配置返回分布式文件系统实例mkdirs和exists是最基础的验证。跑通这个再写 MapReduce 的 Driver、Mapper、Reducer 就是顺理成章的事。一个具体技巧调试时把log4j.properties放到src/main/resources下把日志级别调到 WARN否则控制台会被 INFO 日志刷屏真正的报错反而被淹没。这个习惯我保持了多年能省下大量翻日志的时间。希望帮到你。本文还有配套的精品资源点击获取
