资讯动态

Hadoop 2.6.5单机伪分布式搭建与ZooKeeper HA整合实战

发布时间:2026/10/7 5:07:44 来源:尧图企业网站定制
简介hadoop-2.6.5.tar.gz 是一份面向大数据初学者、系统运维及 Hadoop 二次开发人员的完整发行包解决离线部署与学习中快速获取稳定版本的问题。压缩包共900个文件体积175MB以477个 jar 库、129个 class 类、51个 xml 配置、50个 shell 脚本为主体辅以 html/css/js 管理页面、图片、license 等完整覆盖 HDFS、MapReduce、YARN 三大组件及配套工具。解压后目录结构规范可直接用于 Linux 环境安装、伪分布式与集群搭建。包含编译好的原生库与静态库可支持本地 I/O 与 HDFS API 调用也便于分析 JNI 接口。已有1267人学习下载适合希望绕开编译繁琐、快速掌握配置与运维要点的人群。借助该包可准备实验环境通过默认配置和启动脚本理解资源调度与文件存储机制为调优和二次开发打下基础。1. 拿到 hadoop-2.6.5.tar.gz 之后我建议你先别急着解压我第一次拿到 hadoop-2.6.5.tar.gz 这个包是在给一台 8G 内存的旧服务器搭最小数据管道验证环境的时候。当时的诉求很具体不想为跑通一个 MapReduce 作业去开三台虚拟机也不想一上来就追求高可用集群我需要的是一个能在单机上把 NameNode、DataNode、ResourceManager 全部跑起来的真实二进制环境。半年用下来这个 2.6.x 老版本反而成了我最常用的参考环境。它解决的是“一台机器上完整跑起 HDFS 和 MapReduce”这件事适合想看着真实日志改参数、做课程设计、复现老教程的人。这篇不会堆理论就按我自己落地的路径讲选型、搭建、配 ZooKeeper、排坑、日常验证。2. 先把 2.6.5 的版本账算清它适合什么场景和 JDK2.1 为什么 2.6.5 至今还有人在用现在网上一搜就是 3.x 的下载安装教程但 2.6.5 依然在很多场景里活着。它属于 Apache Hadoop 2.6 系列的最终补丁版本修掉了 2.6.0 到 2.6.4 的不少遗留问题功能上虽然保守但对跑通伪分布式、验证客户端 API、研究 HDFS 写流程来说性能完全够。很多课程设计和实训平台的题面还锁在这个版本照着 2.6.5 配不会出现“教程里用 mapred 包、你的集群却不认”这类错位。我一般会根据场景决定推荐什么版本从这几个维度考虑。场景为什么选 2.6.5需要注意什么教学与课程设计老教材和实训题面大多基于 2.6.x不要直接照搬 3.x 的 API 示例伪分布式学习内存占用比 3.x 小单机跑得动默认端口和 3.x 有差异面试备考熟悉端口、默认值、HA 机制足够新增特性如 Ozone 不在考察范围老项目维护线上如果部署的就是 2.6.x升级前先测 distcp 和读路径所以别看到老版本就划走。它不新但它的行为方式简单、可预期很多 3.x 里被拆解的组件在 2.6.5 里还是一个大包反而好追踪。2.2 下载前先把环境对齐JDK、系统架构和内存这是最容易翻车的一步。Hadoop 2.6.5 官方版本主要面向 64 位 Linux 系统JDK 官方支持 Java 7 和 Java 8。为了省事我一般都按 JDK 8 来配。先跑一遍环境检查不要在解压之后才发现机器不对。# 确认系统架构x86_64 直接可用aarch64 需要找对应构建 uname -m # 确认 JDK 是 1.82.6.5 在 Java 9 上跑容易出反射异常 java -version # 伪分布式常驻内存大约 1G 左右低于 512M 会很吃力 free -h # 检查 tar.gz 是否下载完整防止解压到一半报 unexpected end of file tar -tzf hadoop-2.6.5.tar.gz | head -5这段命令里uname -m的输出如果是x86_64就符合官方包的预期java -version看到1.8.0_xxx就说明 JDK 版本没问题free -h主要看 available 一列伪分布式 2G 内存基本够用。最后一条tar -tzf是很多人跳过的步骤它只列出压缩包内容而不解压如果包下载了一半这里会直接报错。我习惯先跑这一条因为等一个 200 多 MB 的包重新下载比排查解压中断快得多。3. 伪分布式最小搭建从 tar.gz 到三个 XML 和一条启动命令3.1 解压与目录规划别把软件散在 home 里拿到包的第一步不是tar -zxvf到当前目录而是先把目录规划好。我一般统一放在/opt下再用软链接指到具体版本这样以后升级时只需要改链接历史配置和数据目录可以原地保留。# 解压到 /opt 目录保留包内的 hadoop-2.6.5 目录结构 tar -zxvf hadoop-2.6.5.tar.gz -C /opt # 建一个不带版本号的软链接后续配置里统一用 /opt/hadoop ln -s /opt/hadoop-2.6.5 /opt/hadoop # 新建数据目录并给专用用户授权避免用 root 跑任务 mkdir -p /opt/hadoop/data/tmp chown -R hadoop:hadoop /opt/hadoop注意这里的数据目录路径/opt/hadoop/data/tmp是后面hadoop.tmp.dir要指向的位置不建好会在格式化时报父目录不存在。我习惯把软件和数据分开在两个路径下即使版本翻车需要回退旧数据也能留作排查依据。解压完成后还需要设置环境变量常见做法是在/etc/profile.d/hadoop.sh里写两行export HADOOP_HOME/opt/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbinsbin目录里放的是start-dfs.sh、start-yarn.sh这些管理脚本如果不加进 PATH后面每次启动都得写全路径。修改之后执行source /etc/profile.d/hadoop.sh让变量生效。3.2 必改的四个 XMLcore-site、hdfs-site、mapred-site、yarn-site伪分布式不需要动hadoop-env.sh里的大部分内容核心只有四个 XML 文件。先看etc/hadoop/core-site.xml它决定 NameNode 地址和临时目录。configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/data/tmp/value /property /configurationfs.defaultFS是客户端和 DataNode 连接 NameNode 的入口伪分布式写localhost:9000即可如果你要跨节点访问这里要改成对应主机名或 IP。hadoop.tmp.dir是在格式化时生成 NameNode 元数据的基础目录一定不要留默认的/tmp原因我会在避坑章节展开。接着是hdfs-site.xml这里控制副本数、元数据落盘位置和 SecondaryNameNode 的地址。configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///opt/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name valuefile:///opt/hadoop/data/datanode/value /property property namedfs.namenode.secondary.http-address/name value0.0.0.0:50090/value /property /configuration单机伪分布式副本数只能设为 1否则 DataNode 会因为凑不够副本数而一直报块复制任务。dfs.namenode.name.dir和dfs.datanode.data.dir分别指定元数据和数据块的位置这两个路径要提前建好。dfs.namenode.secondary.http-address对应 SecondaryNameNode 的 Web 端口默认是 50090很多老教程里写的是 50090 没错。然后是mapred-site.xml。这个文件在发行包里叫mapred-site.xml.template需要先复制一份再改。cp /opt/hadoop/etc/hadoop/mapred-site.xml.template /opt/hadoop/etc/hadoop/mapred-site.xmlconfiguration property namemapreduce.framework.name/name valueyarn/value /property /configuration这一项把 MapReduce 计算框架挂到 YARN 上如果不写任务会尝试在本机独立调度造成资源管理混乱。最后是yarn-site.xml只需要指定 ResourceManager 地址和辅助服务。configuration property nameyarn.resourcemanager.hostname/name valuelocalhost/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configurationyarn.nodemanager.aux-services必须填mapreduce_shuffle它是 NodeManager 向 MapReduce 任务提供 shuffle 数据的关键配置。漏掉这一项作业能提交但会卡在 Shuffle 阶段不动。3.3 启动前的一次格式化以及 jps 里该出现的六个进程配置改完进入启动流程。第一次启动前必须执行格式化命令它负责生成 NameNode 的集群标识和元数据目录。# 第一次启动前只执行一次后续不要重复跑 hdfs namenode -format # 启动 HDFS脚本会通过 ssh 到 localhost 拉起进程 start-dfs.sh # 启动 YARNResourceManager 和 NodeManager 会随之起来 start-yarn.sh # 检查进程列表 jps格式化成功后日志末尾会出现SHUTDOWN_MSG这类字样说明目录生成完毕。start-dfs.sh会顺序拉起 NameNode、DataNode、SecondaryNameNodestart-yarn.sh再补上 ResourceManager 和 NodeManager。正常情况jps输出以下六个条目NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager、Jps。如果你只看到前三个说明 YARN 没起或yarn-site.xml有问题如果少了DataNode多半是格式化路径和dfs.datanode.data.dir配置不一致。拿到这个输出就算跑通了。在虚拟机上安装和真机没有本质区别我建议把虚拟机内存调到 2G 以上然后按同样的命令走一遍唯一要注意的是虚拟机快照要在格式化前打一个这样出了问题能直接回滚。4. 整合 ZooKeeper2.6.5 自动故障转移要改的配置和验证4.1 HA 里的三件套NameNode、JournalNode、ZKFC 各管什么学完伪分布式下一步通常就是集群搭建和故障转移也就是常说的 Hadoop HA。这里 ZooKeeper 不是来存 HDFS 数据的它只扮演仲裁者角色两个 NameNode 谁做 Active、谁做 Standby由 ZooKeeper 上的临时节点决定。ZKFC 是部署在 NameNode 节点上的一个独立守护进程它的任务就是抢锁和监控JournalNode 则负责共享 edit log让 Standby NameNode 能追上 Active 的状态。我见过不少人把“hadoop和zookeeper整合”想得很玄其实落到配置上不过是多了几个属性而已。面试里被问“HDFS 写流程”时2.6.5 的客户端写路径还是 pipeline 模式原理和 3.x 一致不影响你讲清楚核心机制。4.2 三节点配置片段hdfs-site.xml 和 core-site.xml 怎么加真正要跑 HA最少需要三台机器两个 NameNode 节点、三个 JournalNode 节点可以复用 NodeManager 的宿主ZooKeeper 再单独或共用三台。常见做法是用虚拟机或者 docker 镜像拉三个容器把同一个hadoop-2.6.5.tar.gz分发到三台机器然后在hdfs-site.xml里追加这些配置。property namedfs.nameservices/name valuemycluster/value /property property namedfs.ha.namenodes.mycluster/name valuenn1,nn2/value /property property namedfs.namenode.rpc-address.mycluster.nn1/name valuenode1:8020/value /property property namedfs.namenode.rpc-address.mycluster.nn2/name valuenode2:8020/value /property property namedfs.ha.automatic-failover.enabled/name valuetrue/value /property这段配置里dfs.nameservices是给整个 HA 服务起个逻辑名字叫myclusterdfs.ha.namenodes.mycluster列出两个 NameNode 的 IDdfs.namenode.rpc-address分别指定它们的地址注意把node1、node2换成实际 IP 或主机名。dfs.ha.automatic-failover.enabled设为true后ZKFC 才会介入自动切换。还需要在core-site.xml里加上 ZooKeeper 集群地址让两个 NameNode 都能找到仲裁者。property nameha.zookeeper.quorum/name valuenode1:2181,node2:2181,node3:2181/value /propertyha.zookeeper.quorum的值必须是奇数个节点这是 ZooKeeper 选举的基础要求。如果你只在单机上模拟我建议不要硬上完整 HA因为单机跑两个 NameNode 的 RPC 端口和存储目录都会打架排查起来比收益大得多想体验完整流程三台虚拟机或者容器是性价比最高的做法。4.3 验证自动切换从 zkCli 到手动 kill 主节点配置完成后启动顺序有讲究。先启动 ZooKeeper然后执行一次hdfs zkfc -formatZK初始化 ZK 上的 HA 路径最后再调start-dfs.sh。# 在三台节点各自启动 ZooKeeper /path/to/zookeeper/bin/zkServer.sh start # 初始化 ZK 中的 HA 状态只在第一次执行 hdfs zkfc -formatZK # 启动 HDFS 相关进程 start-dfs.sh # 查看当前 Active 节点 hdfs haadmin -getServiceState nn1 # 模拟主节点故障观察是否自动切换到 nn2 kill -9 nn1_pid hdfs haadmin -getServiceState nn2hdfs zkfc -formatZK会在 ZooKeeper 里创建/hadoop-ha/mycluster路径如果重复执行会看到节点已存在的异常这时候不要慌用zkCli.sh -server 127.0.0.1:2181进去删掉旧路径再重新格式化即可。haadmin -getServiceState nn2的输出从standby变成active就说明自动故障转移生效了。5. 搭建避坑我踩过的五个 2.6.5 高频故障5.1 二次格式化后 DataNode 拒连Incompatible clusterIDs现象第一次搭建一切正常后来为了清理数据又执行了一次hdfs namenode -format结果 NameNode 正常启动DataNode 反复退出日志里报Incompatible clusterIDs。原因format会重新生成 NameNode 的集群 ID而 DataNode 的数据目录里还存着旧 ID两边对不上DataNode 会被直接拒绝注册。解决最省事的办法是把数据和元数据目录一起清掉再重新格式化。如果你的数据很重要也有一剂后悔药打开 NameNode 的current/VERSION文件把clusterID那一行复制到 DataNode 的current/VERSION里然后重启 HDFS。这个操作本质是手动统一两边的集群标识我建议记下来关键时刻能避免重跑数据导入流程。5.2 start-dfs.sh 反复要 ssh 密码伪分布式最常见的卡点现象执行start-dfs.sh后终端要求输入localhost的密码而且每次启动都要输一次输完密码后进程才一个个被拉起来。原因HDFS 的管理脚本是靠 ssh 连接到各节点执行远端命令的即使目标是本机也需要免密登录。没有配置 SSH 公钥脚本就只能停下来等密码。解决生成一对密钥并把公钥放进本机的authorized_keys。ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys这条命令里-P 表示空口令免去每次输 passphrase 的麻烦。如果你用的是主机名而不是 localhost记得先把主机名写进/etc/hosts否则 ssh 会去找 DNS 解析不到地址。配置完可以先执行ssh localhost验证一下不再提示密码再启动集群。5.3 50070 打不开NameNode 日志报 bind 失败现象jps里能看到 NameNode 进程但浏览器访问http://localhost:50070一直转圈或者直接拒绝连接日志里出现Address already in use或bind failed。原因NameNode 的 HTTP 端口默认是 50070经常被其他进程占用另外云服务器或安装了防火墙的 Linux 发行版会对入站端口做限制。解决先用ss -lntp | grep 50070看看端口是不是被别的进程占了如果占用就换端口在hdfs-site.xml里加dfs.namenode.http-address指定新端口。如果端口没人占用检查防火墙CentOS 7 上用systemctl stop firewalld临时验证。改完配置记得重启start-dfs.sh端口类问题百分之九十是这两类原因。5.4 UnsupportedClassVersionErrorJDK 用了个寂寞现象格式化或启动时直接抛UnsupportedClassVersionError提示class file has wrong version 52.0之类的错误。原因2.6.5 的代码是按 JDK 7/8 编译的如果你的机器默认 JDK 是 9 或更高版本字节码版本对不上。很多发行版自带 OpenJDK 11装上 Hadoop 启动就会碰到这个问题。解决装一个 JDK 8并在hadoop-env.sh里显式指定JAVA_HOME。export JAVA_HOME/opt/jdk1.8.0_xxx export PATH$JAVA_HOME/bin:$PATH这里有个细节不要只改 shell 环境的JAVA_HOMEhadoop-env.sh里那行导出的注释也要去掉并改成实际路径因为start-dfs.sh启动的守护进程是从那个文件读取的。改完可以通过hadoop version确认输出里的 Java 版本。5.5 hadoop.tmp.dir 落在 /tmp重启一次元数据全没现象第一次启动正常能上传文件能跑任务但机器重启或者过了几天后NameNode 直接起不来日志提示 namenode 目录找不到或者元数据缺失。原因很多教程为了让用户少配一个参数把hadoop.tmp.dir留在默认的/tmp/hadoop-${user.name}。而/tmp目录在系统重启时会被清理即使不清理某些发行版的 tmpwatch 也会定期删除旧文件。元数据一丢相当于整个 HDFS 内容归零。解决把hadoop.tmp.dir以及dfs.namenode.name.dir、dfs.datanode.data.dir全部指向/opt/hadoop/data下自己创建的目录。这样即使系统重启只要磁盘还在元数据就在。我还习惯把数据目录定期做一个 tar 备份毕竟元数据丢了分布式文件系统就成了空壳。6. 跑完还要验证fsck、haadmin、distcp 三个日常检查手段6.1 用 50070 页面和 fsck 做体检伪分布式跑起来之后先不要急着提交大作业。我一般会打开http://localhost:50070的 Overview 页重点看三个指标Live Nodes、Dead Nodes、Under Replicated Blocks。伪分布式下 Live Nodes 应该是 1Dead Nodes 为 0Under Replicated Blocks 是 0。如果出现多个损坏块再用命令行深入排查。hdfs fsck / -files -blocks -locationshdfs fsck会从根目录开始检查文件块的完整性-files列出文件-blocks显示块信息-locations加上每个块的存储位置。这条命令的输出里CORRUPT字样会标明损坏文件路径是定位坏块的首选工具。6.2 distcp 的常用参数跨集群复制的默认写法如果你同时维护测试和生产环境或者想给 HDFS 目录做备份distcp是最合适的工具。它是一个 MapReduce 作业我常用的写法是这样hadoop distcp -m 4 -update -skipCRC -bandwidth 20 hdfs://node2:8020/user/app /user/app-m 4表示最多起 4 个 map 任务这个值不要超过源目录下的文件数否则会启动一堆空 map 空转-update只复制源端新增或修改过的文件适合增量同步-skipCRC跳过校验和比对在两端文件系统一致时能明显提速但首次同步不建议加-bandwidth 20限制每个 map 的带宽为 20MB/s避免复制任务挤占业务流量。我通常先跑一次不加-skipCRC的完整复制确认源和目标一致后后续增量才用这个参数。这个方向上我给新手的建议是把默认值背下来等踩过坑再改参数。我第一次做十几万小文件的迁移时把-m设成了 32结果集群的资源被一堆空 map 拖住了这是实实在在的血泪经验。先把fs.defaultFS指向源集群跑通一次小目录复制再逐步放开并发比直接上生产要省心得多。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑