ARTICLE DETAIL

资讯详情

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

Hadoop 2.6.5 离线部署实战:伪分布式与完全分布式配置避坑指南

Hadoop 2.6.5 离线部署实战:伪分布式与完全分布式配置避坑指南 简介本资源为Apache Hadoop 2.6.5的官方发行压缩包面向大数据入门学习者、运维工程师及需要搭建分布式计算环境的高校师生用于解决HDFS存储、MapReduce计算与YARN资源调度等核心组件的部署与实验需求。压缩包共900个文件约175.09MB以477个jar核心库、129个class字节码、51个xml配置文件及50个sh启动脚本为主另含html、properties、so动态库等覆盖HDFS、MapReduce、YARN三大模块及完整配置模板。已有1266人学习下载适合对照core-site.xml、hdfs-site.xml等配置项理解集群角色划分与参数含义。资源保留原生目录结构便于按模块检索可帮助读者完成单机与多节点环境搭建、服务启动验证及Kerberos安全机制与Web UI监控的初步实践是掌握Hadoop生态基础组件的实用参考包。1. hadoop-2.6.5.tar.gz 这个包到底还能不能用在生产环境手里拿到一个hadoop-2.6.5.tar.gz第一反应往往是这版本是不是太老了确实2.6.5 是 2015 年前后发布的稳定版距今已经很多年。但现实是大量高校实验环境、企业内部老旧的离线数仓、课程设计项目仍然在跑这个包。它解决的核心问题很朴素在没有外网、没有包管理器的机器上靠一个压缩包把 HDFS 和 YARN 跑起来。这篇文章面向三类人一是要在虚拟机或内网服务器上从零搭建 Hadoop 伪分布式或完全分布式的人二是被课程设计、实验平台要求用 2.6.5 这个特定版本的人三是想搞明白老版本 Hadoop 的配置逻辑以便迁移到新版本的人。我不会假装这个版本有多先进而是把它的安装、配置、启动、排错讲透让你拿到这个 tar.gz 之后能真正跑起来而不是卡在某个Connection refused上。2. 解压之前先想清楚JDK、用户与目录规划2.1 为什么 JDK 版本是第一个翻车点Hadoop 2.6.5 编译时依赖的是 Java 7但实际运行在 Java 8 上最稳。如果你用 Java 11 或更高版本会遇到UnsupportedClassVersionError或者一些反射相关的警告虽然部分场景能跑但 YARN 的某些 RPC 调用会出玄学问题。我一般会明确锁定 JDK 8比如jdk-8u202-linux-x64.tar.gz这类离线包。安装 JDK 的步骤不复杂关键是环境变量要写对。很多人只配了JAVA_HOME忘了PATH里加$JAVA_HOME/bin结果hadoop脚本调用java时找到的是系统自带的 OpenJDK 或者干脆找不到。# 解压 JDK 到 /usr/local 下 tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/ # 重命名方便管理 mv /usr/local/jdk1.8.0_202 /usr/local/java # 编辑 /etc/profile追加以下内容 export JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # 使配置生效 source /etc/profile # 验证 java -version逻辑说明JAVA_HOME是 Hadoop 脚本里用来定位 Java 安装路径的必须指向 JDK 根目录而不是bin目录。CLASSPATH在 Hadoop 2.6.5 里其实不是必须的但加上能避免一些工具类加载不到的问题。参数上-C /usr/local/指定解压目标目录避免解压到当前目录造成混乱。2.2 专用用户和目录结构别用 root 跑 HDFS用 root 用户跑 Hadoop 不是绝对不行但会带来两个麻烦一是 HDFS 的dfs.permissions检查容易因为 root 权限过大而掩盖权限配置错误二是后续如果要用其他用户提交作业文件属主会乱。常见做法是创建一个hadoop用户把安装目录和数据目录都放在这个用户下。# 创建 hadoop 用户并设置密码 useradd hadoop passwd hadoop # 创建安装目录和数据目录 mkdir -p /opt/hadoop mkdir -p /data/hadoop/tmp mkdir -p /data/hadoop/dfs/name mkdir -p /data/hadoop/dfs/data # 把目录属主改为 hadoop chown -R hadoop:hadoop /opt/hadoop chown -R hadoop:hadoop /data/hadoop目录规划上/opt/hadoop放解压后的 Hadoop 程序/data/hadoop/tmp是hadoop.tmp.dir的默认位置dfs/name和dfs/data分别对应 NameNode 和 DataNode 的数据目录。把数据目录和安装目录分开是为了后续升级或重装时不动数据。2.3 解压 hadoop-2.6.5.tar.gz 并设置环境变量切换到 hadoop 用户把 tar 包解压到/opt/hadoop然后配置HADOOP_HOME和PATH。su - hadoop tar -zxvf hadoop-2.6.5.tar.gz -C /opt/hadoop/ # 解压后目录是 /opt/hadoop/hadoop-2.6.5 mv /opt/hadoop/hadoop-2.6.5 /opt/hadoop/current # 编辑 ~/.bashrc追加 export HADOOP_HOME/opt/hadoop/current export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop source ~/.bashrc hadoop versionhadoop version能输出版本号说明环境变量和 JDK 都通了。如果报JAVA_HOME is not set回头检查/etc/profile里的JAVA_HOME是否对 hadoop 用户可见——su - hadoop会重新加载登录 shell但如果你是用su hadoop不带减号环境变量可能没继承。3. 伪分布式配置五个 XML 文件改哪些项3.1 core-site.xmlfs.defaultFS 和 tmp 目录伪分布式和完全分布式的第一个区别就在core-site.xml。伪分布式下fs.defaultFS指向hdfs://localhost:9000完全分布式则指向主节点的主机名。configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/data/hadoop/tmp/value /property /configurationfs.defaultFS告诉客户端 NameNode 的 RPC 地址端口 9000 是 2.x 的默认值3.x 改成了 8020但 2.6.5 用 9000 没问题。hadoop.tmp.dir如果不显式配置默认落在/tmp下机器重启后/tmp可能被清理导致 NameNode 元数据丢失集群起不来。这是血泪经验务必改到持久化目录。3.2 hdfs-site.xml副本数设为 1伪分布式只有一个 DataNode所以dfs.replication必须设为 1否则 HDFS 会一直报副本不足的警告。configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///data/hadoop/dfs/name/value /property property namedfs.datanode.data.dir/name valuefile:///data/hadoop/dfs/data/value /property /configurationdfs.namenode.name.dir和dfs.datanode.data.dir用file://前缀表示本地文件系统路径。如果你不配这两项它们会默认落在hadoop.tmp.dir下的dfs/name和dfs/data也能跑但分开配置更清晰。3.3 mapred-site.xml 和 yarn-site.xml让 MR 跑在 YARN 上mapred-site.xml默认不存在需要从模板复制。cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template \ $HADOOP_HOME/etc/hadoop/mapred-site.xml然后编辑configuration property namemapreduce.framework.name/name valueyarn/value /property /configurationyarn-site.xml里最关键的是yarn.nodemanager.aux-services必须设为mapreduce_shuffle否则 MapReduce 作业的 shuffle 阶段会失败。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 /configuration3.4 配置 SSH 免密登录和 slaves 文件伪分布式也需要 SSH 到 localhost 免密因为启动脚本会通过 SSH 拉起 DataNode 和 NodeManager。ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 验证 ssh localhostslaves文件在伪分布式下写localhost即可。完全分布式则写所有从节点的主机名每行一个。3.5 格式化与启动一次成功的命令序列第一次启动前必须格式化 NameNode且只能执行一次。重复格式化会导致 DataNode 的 clusterID 和 NameNode 不一致DataNode 拒绝启动。# 格式化 NameNode hdfs namenode -format # 启动 HDFS start-dfs.sh # 启动 YARN start-yarn.sh # 验证进程 jpsjps应该看到NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager五个进程。少任何一个就去对应的日志目录$HADOOP_HOME/logs下找.log文件看报错。4. 避坑与排查那些让你怀疑人生的报错4.1 NameNode 反复启动失败日志报 clusterID 不一致现象start-dfs.sh后jps只有 DataNode 没有 NameNode或者 NameNode 秒退。日志里出现Incompatible clusterIDs。原因多次执行hdfs namenode -formatNameNode 的 clusterID 变了但 DataNode 的VERSION文件里还是旧的。解决停掉所有进程删除dfs/name和dfs/data下的所有内容重新格式化一次再启动。注意格式化只能做一次之后启动用start-dfs.sh即可。4.2 9000 端口被占用或 Connection refused现象hdfs dfs -ls /报Call From ... to localhost:9000 failed on connection exception。原因NameNode 没起来或者fs.defaultFS里的主机名和实际监听地址不一致。比如配置里写localhost但/etc/hosts里localhost解析到了 IPv6 的::1而 NameNode 只监听了 IPv4。解决检查/etc/hosts确保127.0.0.1 localhost在::1之前。或者直接在core-site.xml里写hdfs://127.0.0.1:9000。另外用netstat -tlnp | grep 9000确认端口确实在监听。4.3 Windows 下用 IDEA 连不上 HDFS现象在 Windows 的 IDEA 里写 Java 程序操作 HDFS报Could not locate executable null\bin\winutils.exe。原因Hadoop 的 Windows 客户端依赖winutils.exe和hadoop.dll而 tar.gz 包里没有 Windows 二进制。解决下载对应 Hadoop 2.6.5 版本的winutils.exe放到HADOOP_HOME\bin下并在 IDEA 的 Run Configuration 里设置环境变量HADOOP_HOME指向 Windows 上的 Hadoop 解压目录。同时把hadoop.dll放到C:\Windows\System32下。注意版本必须匹配用 3.x 的 winutils 配 2.6.5 会报别的错。4.4 start-dfs.sh 提示 “Permission denied (publickey)”现象脚本执行到启动 DataNode 时卡住提示 SSH 免密失败。原因authorized_keys权限不对或者当前用户不是 hadoop 用户或者~/.ssh目录权限太开放。解决chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys。确认ssh localhost能直接登录不需要密码。如果之前用 root 生成过密钥切到 hadoop 用户后要重新生成。4.5 YARN 作业一直卡在 ACCEPTED 状态现象yarn jar提交作业后状态一直是 ACCEPTED不变成 RUNNING。原因NodeManager 没起来或者yarn.nodemanager.aux-services配错或者内存资源不足。伪分布式下默认yarn.nodemanager.resource.memory-mb是 8192如果虚拟机内存只有 4GNodeManager 会启动失败。解决在yarn-site.xml里显式设置yarn.nodemanager.resource.memory-mb为 2048 或 4096同时把yarn.scheduler.maximum-allocation-mb也调小。然后重启 YARN。5. 从伪分布式到完全分布式改三个文件、加 slaves 列表5.1 完全分布式的核心差异伪分布式和完全分布式的配置差异其实很小主要是fs.defaultFS指向主节点主机名、slaves文件列出所有从节点、以及 SSH 免密要从主节点通到所有从节点。如果你已经跑通了伪分布式完全分布式就是复制配置加改主机名。假设三台机器master、slave1、slave2。在master上改core-site.xmlproperty namefs.defaultFS/name valuehdfs://master:9000/value /propertyslaves文件写slave1 slave2然后把整个/opt/hadoop/current目录和/data/hadoop目录同步到两台从节点。可以用scp -r或者rsync。5.2 主节点到从节点的 SSH 免密在 master 上生成密钥然后把公钥追加到 slave1 和 slave2 的authorized_keys。ssh-keygen -t rsa -P -f ~/.ssh/id_rsa ssh-copy-id slave1 ssh-copy-id slave2 # 验证 ssh slave1 ssh slave2注意从节点也要有相同的 hadoop 用户和目录权限。如果从节点没建 hadoop 用户SSH 过去之后路径不对启动脚本会报找不到目录。5.3 格式化与启动顺序完全分布式下格式化 NameNode 只在 master 上执行一次。然后启动 HDFS 和 YARN 也在 master 上执行脚本会自动 SSH 到 slaves 拉起 DataNode 和 NodeManager。# 在 master 上 hdfs namenode -format start-dfs.sh start-yarn.sh # 在 master 上 jps 应看到 NameNode、ResourceManager、SecondaryNameNode # 在 slave 上 jps 应看到 DataNode、NodeManager如果某个 slave 的 DataNode 没起来去 slave 上看日志大概率是dfs.datanode.data.dir目录不存在或者权限不对。5.4 验证 HDFS 和 YARN 是否正常跑一个最简单的 WordCount 或者直接用hdfs dfs命令验证。# 创建目录 hdfs dfs -mkdir -p /user/hadoop/input # 上传本地文件 hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /user/hadoop/input # 查看 hdfs dfs -ls /user/hadoop/input # 跑一个自带示例 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar \ wordcount /user/hadoop/input /user/hadoop/output # 查看结果 hdfs dfs -cat /user/hadoop/output/part-r-00000 | head如果 WordCount 能跑完并输出结果说明 HDFS 和 YARN 都通了。这一步也是课程设计里最常被要求截图的地方。5.5 关于 hadoop-2.6.5.tar.gz 的选型建议如果你是在做新项目没有历史包袱我建议直接用 Hadoop 3.x因为 2.6.5 的 YARN 调度器和 HDFS 纠删码都不完善。但如果你被课程设计、实验平台或者老旧内网环境锁死在 2.6.5那上面的配置就是最稳的路径。这个包本身没有好坏关键是知道它的边界在哪里单机伪分布式跑教学和开发足够小规模完全分布式也能撑住但别指望它上大规模生产。6. 用 Docker 跑 hadoop-2.6.5绕开环境差异的后悔药6.1 为什么用 Docker 跑老版本 Hadoop在 Ubuntu 22.04 或者 CentOS 8 上装 Hadoop 2.6.5经常会遇到 glibc 版本、OpenSSL 版本、Python 版本不兼容的问题。比如 2.6.5 自带的hadoop脚本里有些地方调用了python而新系统只有python3就会报python: command not found。Docker 能把整个运行环境冻结在某个基础镜像上绕开这些系统差异。我一般会用一个centos:7或者ubuntu:18.04作为基础镜像因为这两个系统自带的库和 Hadoop 2.6.5 兼容性最好。下面是一个最小可用的 Dockerfile 思路。FROM centos:7 # 安装 JDK 8 和 SSH RUN yum install -y java-1.8.0-openjdk-devel openssh-server openssh-clients which \ yum clean all # 配置 SSH 免密 RUN ssh-keygen -t rsa -P -f /root/.ssh/id_rsa \ cat /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys \ chmod 600 /root/.ssh/authorized_keys # 复制 hadoop-2.6.5.tar.gz 并解压 COPY hadoop-2.6.5.tar.gz /opt/ RUN tar -zxvf /opt/hadoop-2.6.5.tar.gz -C /opt/ \ mv /opt/hadoop-2.6.5 /opt/hadoop # 设置环境变量 ENV JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk ENV HADOOP_HOME/opt/hadoop ENV PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH # 复制配置文件 COPY core-site.xml $HADOOP_HOME/etc/hadoop/ COPY hdfs-site.xml $HADOOP_HOME/etc/hadoop/ COPY mapred-site.xml $HADOOP_HOME/etc/hadoop/ COPY yarn-site.xml $HADOOP_HOME/etc/hadoop/ COPY slaves $HADOOP_HOME/etc/hadoop/ # 格式化并启动 RUN $HADOOP_HOME/bin/hdfs namenode -format EXPOSE 9000 50070 8088 CMD [/opt/hadoop/sbin/start-dfs.sh]逻辑说明基础镜像选centos:7是因为它的 OpenSSL 和 glibc 版本能直接跑 2.6.5 的 native 库。ssh-keygen在镜像构建时就生成好密钥避免容器启动后再配。COPY的四个 XML 文件就是前面章节里配好的伪分布式配置slaves写localhost。CMD只启动 HDFS如果要 YARN 就写一个启动脚本同时拉起两个。参数上EXPOSE暴露 9000 是 NameNode RPC50070 是 HDFS Web UI8088 是 YARN Web UI。实际运行时用-p映射到宿主机。6.2 构建和运行# 构建镜像 docker build -t hadoop-2.6.5-pseudo . # 运行容器 docker run -d --name hadoop \ -p 9000:9000 -p 50070:50070 -p 8088:8088 \ hadoop-2.6.5-pseudo # 进入容器验证 docker exec -it hadoop bash jps如果jps看到 NameNode 和 DataNode说明容器内启动成功。然后在宿主机浏览器访问http://localhost:50070能看到 HDFS 的 Web 界面。6.3 Docker 方案的边界Docker 跑 Hadoop 2.6.5 适合开发测试和教学演示但不适合直接上生产。原因有三一是容器内数据默认不持久化重启容器数据就没了必须挂载 volume二是网络模式如果用 bridge跨容器的 DataNode 通信需要额外配端口和主机名解析三是资源隔离下 YARN 的内存计算可能不准。如果你只是想在本地快速验证一个 HDFS 操作或者跑一个 MapReduce 示例Docker 是最省事的后悔药。如果要长期跑还是老老实实在虚拟机上配。我自己现在的习惯是本地开发用 Docker 起一个伪分布式验证代码逻辑真正要模拟集群行为再开三台虚拟机配完全分布式。这样既不会被环境问题反复折腾也能在需要的时候看到真实的进程分布和日志。希望帮到你。本文还有配套的精品资源点击获取
返回列表