ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Hadoop 2.6.5伪分布式部署:从解压到跑通WordCount

Hadoop 2.6.5伪分布式部署:从解压到跑通WordCount 简介Apache Hadoop 的 2.6.5 版本是颇具代表性的稳定发行版。这份 Linux 安装压缩包面向需要部署大数据平台的开发者与运维人员能帮助解决 HDFS 分布式文件系统、MapReduce 计算框架和 YARN 资源调度器的安装与基础配置问题。压缩包内共有 900 个文件其中以 477 个 Jar 包、129 个 Class 文件、51 个 XML 配置和 50 个 Shell 脚本为主另外还包含运行所需的动态库、静态库、示例模板与 Web 展示资源整体压缩后大小约 175.09 MB解压后可见目录层次分明便于定位不同功能模块。目前已有 1267 人学习下载。解压后可直接获得一个完整的 Hadoop 运行环境涵盖 HDFS 的 NameNode、DataNode 相关可执行程序MapReduce 的作业提交与执行脚本以及 YARN 的资源管理配置。参考目录中的 XML 模板和 Shell 脚本用户可以快速搭建单机、伪分布式或小型集群环境并通过自带示例程序完成安装验证。对于想深入理解分布式系统原理、准备技术认证或搭建实验环境的学习者来说这个安装包是省时省力且非常可靠的基础资源。1. 一个 tar.gz 引发的血案为什么 Hadoop 2.6.5 至今还有人死磕如果你是 2025 年才碰 Hadoop看到hadoop-2.6.5.tar.gz这个文件名多半会愣一下——这都老古董了YARN 都出到 3.x 了还有人拿 2.6.5 当宝贝但现实是很多企业的老旧集群、课程设计、面试题里反复出现的恰恰是这个版本。它稳定、资料多、坑都被人踩平了尤其是伪分布式学习2.6.5 的配置流程跟 3.x 差别不小你照着新版教程配老版本十个有九个会翻车。这篇文章不打算给你贴一个下载地址然后解压完事的流水账。我要讲的是这个 tar.gz 里到底有什么、哪些配置改完才能真正跑起来、为什么你按网上的教程配完会起不来以及怎么用最少的内存把 NameNode、DataNode、ResourceManager、NodeManager 全拉起来。适合三类人被课程设计逼着装 Hadoop 的学生、要在老机器上复现历史环境的工程师、以及准备 Hadoop 面试想亲手验证原理的开发者。先把丑话说在前面2.6.5 的坑很多但每一个坑都有后悔药。2. 解压之前先搞明白2.6.5 这个版本到底老在哪又稳在哪2.1 从 tar.gz 看发行版结构bin、etc、sbin 各管什么拿到hadoop-2.6.5.tar.gz先别急着解压。这个包是 Apache 官方源码编译后的二进制发行版里面没有 .java 源码源码要另外下只有可直接运行的 class 和一堆脚本。解压后你会看到一个hadoop-2.6.5目录里面几个关键子目录bin/面向用户的客户端命令hadoop fs、hadoop jar、yarn都在这里。sbin/面向管理员的服务启停脚本start-dfs.sh、start-yarn.sh、hadoop-daemon.sh在这里。etc/hadoop/所有配置文件的家core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml全在这。lib/和share/hadoop/依赖的 jar 包注意不同组件分散在share/hadoop/common、hdfs、yarn、mapreduce下CLASSPATH 由脚本自动拼。需要特别提醒2.6.5 的etc/hadoop下默认没有mapred-site.xml只有一个mapred-site.xml.template。很多新手直接改模板却不重命名MapReduce 跑起来就报错找不到配置。这个细节在 3.x 已经改掉了但 2.6.5 就是这么设计的。2.2 为什么选 2.6.5 而不选 3.xJDK 版本和生态兼容是第一道坎2.6.5 官方要求 JDK 7实测 JDK 8 也能跑但 JDK 9 必挂。这里有个血泪经验如果你机器上默认是 JDK 11解压后执行hadoop version会直接抛UnsupportedClassVersionError这时候不是 Hadoop 的问题是你 JDK 太新。解决的办法有两个要么装一个 JDK 8 并配好JAVA_HOME要么干脆用 3.x。可很多老教程、老集群、老面试题都绑定 2.x所以为了复现老老实实装 JDK 8 是最省事的。还有一点2.6.5 的 HDFS 协议和 3.x 不兼容。你用 3.x 的客户端去连 2.6.5 的 NameNode大概率握手失败。所以如果你要在真实环境做迁移或跨版本读写别指望直接替换 tar.gz 就能无缝升级。这也是为什么很多公司宁可守着 2.6.5 也不敢乱动——数据在 HDFS 里躺着升级要迁移迁移要停机停机就要背锅。2.3 安装前的三项检查JAVA_HOME、SSH、hostname在解压之前先把环境理干净。我一般的检查顺序如下缺一个都会在后面某个环节让你抓狂。# 检查 JDK 版本必须是 7 或 8 java -version # 检查 JAVA_HOME 是否指向 JDK 而不是 JRE echo $JAVA_HOME # 检查 SSH 服务是否在跑 service ssh status # 检查 hostname 是否合理不要带下划线 hostname如果你发现JAVA_HOME没配或者指向了 JRE后面start-dfs.sh会提示JAVA_HOME is not set and could not be found。这里有个规律Hadoop 的脚本优先读HADOOP_HOME/etc/hadoop/hadoop-env.sh里的JAVA_HOME其次是系统环境变量。我习惯在hadoop-env.sh里显式写死避免多 JDK 切换时被坑。3. 从解压到伪分布式起来一步步配置四个 XML 和两个脚本3.1 解压与目录规划别把 Hadoop 放在带空格的路径里# 创建安装目录 sudo mkdir -p /opt/hadoop # 解压 sudo tar -xzf hadoop-2.6.5.tar.gz -C /opt/hadoop # 建软链方便后续升级和配置 sudo ln -s /opt/hadoop/hadoop-2.6.5 /opt/hadoop/current # 设置环境变量写入 ~/.bashrc export HADOOP_HOME/opt/hadoop/current export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin参数说明-C指定解压目标目录软链current是个好习惯以后想切版本只需换软链。注意路径里绝对不能有空格也不要有中文。我见过有人把 Hadoop 解压到C:\Program Files下Windows 环境结果一堆脚本因为空格被拆成多个参数而崩溃。Linux 下同样如此/home/my hadoop这种目录名会让你怀疑人生。3.2 配置 core-site.xmlNameNode 的地址和临时目录configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/hadoop-2.6.5/tmp/value /property /configurationfs.defaultFS决定了 HDFS 的入口伪分布式下必须写localhost别写成你的主机名否则后面 DataNode 注册时可能因为 IP 解析失败而连不上 NameNode。hadoop.tmp.dir是 Hadoop 存放临时文件的大本营NameNode 的元数据、DataNode 的数据块都会默认放在这里。这个目录一定要提前建好并且属主要求是当前用户用 sudo 解压的话目录所有者可能是 root后面启动会权限报错。我一般会先mkdir -p /opt/hadoop/hadoop-2.6.5/tmp并chown -R $(whoami)一下免得权限踩坑。另外这个目录千万别放/tmp系统一清空你的集群就等于重新格式化数据全没。3.3 配置 hdfs-site.xml副本系数和 NameNode 数据目录configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///opt/hadoop/hadoop-2.6.5/tmp/dfs/name/value /property property namedfs.datanode.data.dir/name valuefile:///opt/hadoop/hadoop-2.6.5/tmp/dfs/data/value /property /configuration伪分布式节点只有一个副本数必须设为 1否则 DataNode 会一直尝试往第二个副本上写然后报Excess replicas或者写入超时。dfs.namenode.name.dir和dfs.datanode.data.dir这两项不配置也能跑因为默认值就指向hadoop.tmp.dir下面。但我建议显式写出来一是为了让你知道元数据在哪二是在后面排查 NameNode 起不来但进程在 的问题时你能直接去看这些目录里的current/VERSION文件。3.4 mapred-site.xml 和 yarn-site.xmlMapReduce 跑在哪!-- mapred-site.xml -- configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration!-- yarn-site.xml -- 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 /configurationmapred-site.xml必须由mapred-site.xml.template复制而来否则 MapReduce 作业提交后会找不到框架。yarn-site.xml里的aux-services是 YARN NodeManager 提供给 MapReduce shuffle 的辅助服务不配的话作业会在 reduce 阶段卡住日志里会出现 Shuffle failed。3.5 格式化 NameNode 并启动第一次启动的正确姿势# 首次启动前必须格式化 hdfs namenode -format # 启动 HDFS 和 YARN start-dfs.sh start-yarn.sh # 查看进程 jpshdfs namenode -format会在 NameNode 数据目录生成初始元数据。这一步只做一次以后如果改了dfs.namenode.name.dir需要重新格式化否则会报目录已存在且 clusterID 不匹配。start-dfs.sh会启动 NameNode 和 DataNodestart-yarn.sh启动 ResourceManager 和 NodeManager。jps是 JDK 自带的 JVM 进程查看工具如果看到四个进程NameNode、DataNode、ResourceManager、NodeManager说明伪分布式已经起来了。如果只有NameNode没有DataNode多半是格式化后改了目录或者 IP 解析到了 IPv6后面专门讲。3.6 验证用 HDFS 命令和 Web UI 双重检查# 建目录并上传测试文件 hdfs dfs -mkdir -p /user/$(whoami) echo hello hadoop 2.6.5 test.txt hdfs dfs -put test.txt /user/$(whoami)/test.txt # 读取验证 hdfs dfs -cat /user/$(whoami)/test.txt如果你能看到内容输出说明 HDFS 的读写链路是通的。同时用浏览器访问http://localhost:50070查看 NameNode 的 Web UI注意 2.6.5 的默认端口是 50070不是 3.x 的 9870。这也是老版本和新版最大的感知差异之一很多人拿着新版教程去访问 9870一脸懵。4. 避坑特辑2.6.5 最常见的四个翻车现场4.1 翻车一NameNode 启动了DataNode 起不来现象jps只看到 NameNode没有 DataNode日志里报Incompatible clusterIDs或DataNode is denied communication with NameNode。原因这是最经典的格式化事故。你第一次格式化 NameNode 后DataNode 目录也生成了集群 ID。后来你改了配置又重新格式化 NameNode但 DataNode 的目录没清两边的 clusterID 就对不上了。解决停掉所有进程把 NameNode 和 DataNode 数据目录下的current全部删掉重新格式化 NameNode再启动。# 先停 stop-dfs.sh # 清掉 dfs 相关目录 rm -rf /opt/hadoop/hadoop-2.6.5/tmp/dfs/* # 重新格式化 hdfs namenode -format # 重启 start-dfs.sh4.2 翻车二SSH 需要密码start-dfs.sh 卡在 localhost现象执行start-dfs.sh时命令卡住提示localhost: Permission denied (publickey,password)最后报hostname: Connection refused。原因Hadoop 脚本通过 SSH 到 localhost 执行远程命令如果没有配置免密登录脚本会无限等待你输密码。伪分布式也要配 SSH 免密。解决# 生成密钥对一路回车 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa # 把公钥加到 authorized_keys cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # 验证 ssh localhost echo ok如果能输出ok说明免密配好了。注意权限.ssh目录要是 700authorized_keys要是 600否则 SSH 会拒绝使用密钥。4.3 翻车三Java 8 也会抛 UnsupportedClassVersionError现象明明装了 JDK 8但hadoop version报UnsupportedClassVersionError: org/apache/hadoop/hdfs/...或者启动时直接Error: Could not find or load main class。原因你虽然后装了 JDK 8但JAVA_HOME还指向旧版本或者PATH里旧 JDK 的java命令排在前面。Hadoop 脚本会用which java来定位而which java找到的可能不是你想用的那个。解决在hadoop-env.sh里强制指定。找到这个文件取消JAVA_HOME行的注释并改为你的 JDK 路径# 查看 JDK 实际路径 dirname $(dirname $(readlink -f $(which java))) # 在 hadoop-env.sh 中写死 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd644.4 翻车四Web UI 能打开但文件写入报空间不足现象hdfs dfs -put报Not enough storage space但你磁盘明明还有很多空闲。原因2.6.5 里 HDFS 块默认大小是 128MB而且 NameNode 默认限制磁盘使用率为 90% 左右。更常见的是你设置的数据目录所在分区本身有问题比如/和/home不是一个分区数据目录在/下而/已经快满。解决用df -h检查分区占用。如果确认空间没问题就看看 DataNode 日志$HADOOP_HOME/logs/hadoop-*-datanode-*.log里是否有Under replicas或磁盘错误信息。顺手用hdfs dfsadmin -report看各节点状态。# 查看 HDFS 整体状态 hdfs dfsadmin -report如果报告显示的容量远小于你的磁盘容量多半是数据目录的权限或挂载点问题。把dfs.datanode.data.dir换到一个干净的目录重新启动即可。5. 伪分布式跑通之后和 Zookeeper 整合、跑 WordCount 的实操路径5.1 先跑通 MapReduce 自带的示例 JAR很多教程让你把 WordCount 编译出来再跑但 2.6.5 自带了示例 JAR第一步验证用它最省事。# 示例 JAR 在 share/hadoop/mapreduce 下 $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /user/$(whoami)/test.txt /user/$(whoami)/out # 查看结果 hdfs dfs -cat /user/$(whoami)/out/part-r-00000如果这个能跑通说明 MapReduce 的提交、YARN 调度、shuffle、reduce 全链路正常。如果卡在Running job不动去 ResourceManager 的 Web UI默认 8088看任务状态多半是 NodeManager 没起来或者mapreduce.framework.name配错了成classic。5.2 整合 Zookeeper 的目的是什么Hadoop 2.6.5 本身的自带 HA 方案必须依赖 Zookeeper。如果你只有一台机器却想体验 HA 的流程可以在一台机器上跑三个 Zookeeper 节点伪集群再配合 Hadoop 的 JournalNode。这个组合是面试题 Hadoop HA 原理 最常考的实操场景。常见的 Zookeeper 整合步骤是先启动 Zookeeper 集群然后在core-site.xml里配置ha.zookeeper.quorum在hdfs-site.xml里配置dfs.nameservices、dfs.ha.namenodes.[nameservice]、dfs.namenode.rpc-address.[nameservice].[namenode]等一组参数。这里有一个关键点2.6.5 的 HA 需要手动执行zkfc -formatZK在 Zookeeper 里初始化命名空间漏了这一步Active/Standby 切换根本做不起来。# 在其中一个 NameNode 上执行 $HADOOP_HOME/bin/hdfs zkfc -formatZK5.3 用 Docker 镜像复现 2.6.5 环境一个偷懒但有效的方案如果你不想在物理机上折腾 JDK 和 SSH可以直接拉一个带 Hadoop 的 Docker 镜像。但要注意网上很多镜像用的是旧版本 Hadoop而且内部的 SSH 配置可能已经弄好。我建议不要拉那种大而全的镜像自己从 Ubuntu 16.04 开始装一遍反而更可控因为老版本 Hadoop 在 18.04 以上的系统里会出现 glibc 兼容问题。一个稳妥的 Dockerfile 思路是这样的FROM ubuntu:16.04 RUN apt-get update apt-get install -y ssh openjdk-8-jdk COPY hadoop-2.6.5.tar.gz /opt/ RUN tar -xzf /opt/hadoop-2.6.5.tar.gz -C /opt \ mv /opt/hadoop-2.6.5 /opt/hadoop ENV HADOOP_HOME/opt/hadoop ENV PATH$PATH:/opt/hadoop/bin:/opt/hadoop/sbin构建之后进入容器配好免密启动服务即可。这里最坑的一点是Ubuntu 16.04 的 SSH 默认不允许 root 直接登录你要么用普通用户要么在 Dockerfile 里改sshd_config。别为省事跳过否则start-dfs.sh又会给你一个 Permission denied。6. 最后一手用 distcp 做老版本集群迁移前的自检如果你正因为老集群要迁移而研究hadoop-2.6.5.tar.gz我建议你花半天时间把distcp跑熟。它是 Hadoop 自带的数据迁移工具但 2.6.5 的 distcp 默认跑在 MapReduce 上意味着如果你 YARN 没起来distcp 是跑不了的。很多人在迁移时直接执行hadoop distcp hdfs://oldcluster:9000/user/data hdfs://newcluster:9000/user/data然后发现任务提交了却一直卡在INFO mapreduce.Job: Running job。这时候先别查 distcp 参数先检查 YARN 的 ResourceManager Web UI 是否能看到 Application。老版本 distcp 的另一个坑是它默认会启动 20 个 map 任务但每个 map 会拉取一个文件列表切片如果你源目录里有上百万个小文件NameNode 会被 RPC 请求压垮。这时候必须加参数hadoop distcp -m 10 -bandwidth 50 hdfs://oldcluster:9000/user/data hdfs://newcluster:9000/user/data-m指定 map 数-bandwidth限制每个 map 的带宽MB/s。对于 2.6.5我还会加-update -skipcrccheck否则源端和目标端哪怕同一个文件因为块大小不同校验不一致就会反复拷贝。这三个参数是我踩过无数坑之后沉淀下来的固定搭配。另外记得先在小目录上试跑一次用以下命令验证迁移结果hadoop distcp -update -skipcrccheck -m 1 hdfs://oldcluster:9000/user/batch_test hdfs://newcluster:9000/user/batch_test # 对比两端文件数和字节数 hadoop fs -ls hdfs://oldcluster:9000/user/batch_test | wc -l hadoop fs -ls hdfs://newcluster:9000/user/batch_test | wc -l我见过太多人直接拿生产目录跑 distcp跑到一半发现源集群磁盘满、目标集群权限不对一堆错误堆叠在一起没法排查。先小规模试跑看日志里ERR和SKIP的类型再放开做全量这是做迁移最后一道保险。说回hadoop-2.6.5.tar.gz本身我始终觉得它不是一个过时的玩具而是理解 Hadoop 运行机制的绝佳标本。新版把很多坑都填平了但也把原理藏得更深。你在这个老版本上受过 DataNode 起不来的折磨才能真正理解 NameNode 和 DataNode 之间的心跳和 clusterID 机制你配置过mapred-site.xml的重命名才会把配置文件的加载顺序刻进脑子。如果你是被课程设计逼着用 Hadoop我建议你老老实实从 2.6.5 开始踩完这些坑再去看 3.x你会发现一切都顺理成章。希望帮到你。本文还有配套的精品资源点击获取
返回列表