新闻详情

新闻详情

首页 / 资讯中心 / 详情

Linux下Hadoop伪分布式安装实战:从JDK到YARN一步步搭好环境

发布时间:2026/9/7 20:54:25来源:尧图网络
Linux下Hadoop伪分布式安装实战:从JDK到YARN一步步搭好环境
很多学大数据的朋友第一个拦路虎往往不是MapReduce编程也不是HDFS读写而是连Hadoop环境都装不起来。网上教程一搜一大把但要么版本老得跑不动要么关键步骤一笔带过照着敲完一启动就是一堆英文报错心态直接崩。这篇我基于自己多台机器上的实操经历把Linux下Hadoop伪分布式安装从头到尾捋一遍版本怎么选、参数怎么写、报错怎么查全给你交代清楚。适合刚接触大数据的在校学生、转行做数仓或数据开发的朋友也适合想在自己电脑上快速搭一套HDFSYARN环境用来练手的人。1. 伪分布式是什么装之前先搞懂这几个概念1.1 从伪字说起一台机器模拟整个集群Hadoop本身是为集群设计的一个标准的分布式环境需要多台服务器分别承担NameNode、DataNode、ResourceManager、NodeManager这些角色。但学习阶段没有那么多机器于是伪分布式模式就出现了——在一台Linux机器上用多个Java进程分别模拟这些节点NameNode是一个进程DataNode是一个进程ResourceManager又是另一个进程。它们各自独立运行通过本机网络端口通信整个过程和真实集群的原理是一样的只是所有角色挤在同一台机器上。这个伪字伪的是物理资源不伪的是机制。你在伪分布式上跑通的MapReduce程序、HDFS文件读写操作拿到真实集群上几乎不用改代码这也是为什么所有Hadoop入门教程都会先带大家搭伪分布式——它是学习成本最低、又能完整体验Hadoop核心机制的方案。1.2 版本选型JDK、Hadoop、Linux发行版怎么搭才省心版本选型是伪分布式安装里最容易被忽略、但后患最大的一步。很多人随便下载一个最新版Hadoop再装个最新版JDK结果启动时各种兼容性报错折腾半天也不知道问题出在哪。我强烈建议的组合是CentOS 7系列或Ubuntu 20.04/22.04 LTSJDK 1.88u202或OpenJDK 1.8.0Hadoop 3.3.6。这个组合有几个理由。Hadoop 3.3.x对JDK 8的支持非常成熟官方文档明确列了JDK 8在支持范围内而Hadoop 3.4以上版本开始提升了对JDK 11/17的依赖要求没必要刚入门就给自己增加版本兼容性的不确定性。JDK 8虽然老但它依然是当前生产环境里大数据组件兼容性最好的版本Hive、Spark、Flink这些生态组件对JDK 8的支持也都最稳。至于Linux发行版Debian系的Ubuntu和RedHat系的CentOS都行本教程中的命令在两类系统上基本通用个别差异我会单独标注。另外提醒一句Oracle JDK 8u202之后Oracle对商业用途开始收费自己学习用没关系但如果以后在公司搭环境建议直接用OpenJDK功能和兼容性没有任何区别。2. Linux基础环境准备用户、SSH、防火墙三件事一次搞定2.1 新建hadoop用户不要让root直接跑集群很多人图省事直接在root用户下装Hadoop。我建议你新建一个专用用户比如就叫hadoop。原因有两个一是Hadoop的脚本在检测到root用户时会提示不建议用root运行某些组件甚至直接报错退出二是学习和工作中都应该养成用普通用户跑服务的习惯权限隔离能避免很多误操作。# 创建hadoop用户并设置密码 useradd hadoop passwd hadoop然后用hadoop用户登录或者用root执行su - hadoop切换过去。后续所有操作都在hadoop用户下进行你会发现排错的时候权限路径清晰很多。2.2 配置SSH免密登录Hadoop启动脚本的硬性要求这一步骤很多教程会漏掉但偏偏不可跳过。Hadoop的start-dfs.sh脚本在启动时会通过SSH远程登录到workers文件中列出的每一台主机去执行命令即使伪分布式模式下远程就是本机它也依然会走一遍SSH流程。如果你不配置免密脚本会卡在密码输入那里或者直接因为无法连接而启动失败。# 生成密钥对一路回车即可 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa # 将公钥写入本机的authorized_keys cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 验证免密登录是否生效 ssh localhost如果执行ssh localhost后不需要输入密码直接进入终端说明配置成功。这里有个小细节-P 参数是生成空密码密钥免去后续输入密码的麻烦有些教程用-P 效果一样但注意不要漏了这个参数否则生成的密钥带密码免密依然不生效。2.3 关闭防火墙与SELinux省去端口不通的烦恼防火墙不关经常出现进程都启动了但访问不了Web界面的诡异问题。Hadoop各组件之间使用大量随机端口通信新手没必要逐个端口放行直接把防火墙关掉最省事。如果是自己学习用的虚拟机或者云主机这一步没什么负担如果公司环境有安全规范那就需要按规则放行端口。CentOS 7系列执行systemctl stop firewalld systemctl disable firewalldUbuntu执行sudo ufw disable另外CentOS上SELinux也建议临时关闭否则它有可能会拦截Hadoop写数据文件的权限。修改/etc/selinux/config把SELINUXenforcing改成SELINUXdisabled然后重启机器。如果你不想重启也可以执行setenforce 0临时生效但下次开机还是会变回去建议两种方式配合确保真正关闭。3. JDK安装与配置Hadoop的地基要稳3.1 下载JDK版本号里的门道JDK安装本身不难难的是版本选择。前面已经说了建议JDK 1.8具体到安装包我推荐用jdk-8u202-linux-x64.tar.gz这是Oracle JDK 8的最后一个免费版本网上资源很好找。如果你所在地区访问Oracle官网慢也可以用OpenJDK命令用yum install java-1.8.0-openjdk java-1.8.0-openjdk-develCentOS或apt install openjdk-8-jdkUbuntu效果一样。3.2 解压与环境变量配置手把手步骤# 创建JDK安装目录 mkdir -p /usr/local/java # 解压注意把文件名换成你下载的实际版本 tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/java # 进入目录确认解压结果 ls /usr/local/java解压完成后配置环境变量。编辑/etc/profile建议用sudo vim /etc/profile在文件末尾追加export JAVA_HOME/usr/local/java/jdk1.8.0_202 export PATH$PATH:$JAVA_HOME/bin export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar然后执行source /etc/profile让配置生效再用java -version验证。如果输出类似下面这样说明JDK配置成功java version 1.8.0_202 Java(TM) SE Runtime Environment (build 1.8.0_202-b08) Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)3.3 环境变量常见坑隔一个终端就没了很多新手遇到过明明配好了java -version能用但换个窗口或重启后又提示找不到java。这是因为你只改了/etc/profile而某些终端的登录Shell并不会重新加载它。验证方法是新开一个SSH窗口直接执行java -version如果报错就检查是不是source /etc/profile没有持久生效。另一个常见问题是多JDK共存时JAVA_HOME指向了旧路径导致Hadoop启动时报错。可以用which java和echo $JAVA_HOME核对确保实际生效的JDK路径与JAVA_HOME一致。4. Hadoop下载与核心配置五个XML文件的背后逻辑4.1 下载并解压HadoopHadoop官方下载页面在国外速度不稳定建议直接使用清华镜像或阿里云镜像。以清华镜像为例下载3.3.6版本# 进入安装目录 cd /usr/local # 用wget下载清华镜像源速度快 wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz # 解压并重命名方便后续操作 tar -zxvf hadoop-3.3.6.tar.gz mv hadoop-3.3.6 hadoop # 修改属主确保hadoop用户有权限操作 chown -R hadoop:hadoop /usr/local/hadoop注意最后一步chown很重要。如果你是用root解压的/usr/local/hadoop目录的属主是root之后切换到hadoop用户操作时就会遇到Permission denied。4.2 配置hadoop-env.sh让Hadoop找到JDKHadoop启动脚本需要知道JDK装在哪里这个配置在/usr/local/hadoop/etc/hadoop/hadoop-env.sh里。默认情况下JAVA_HOME是空的必须手动指定# 用vim打开hadoop-env.sh找到JAVA_HOME这一行并修改 vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh # 将原来的export JAVA_HOME 替换为 export JAVA_HOME/usr/local/java/jdk1.8.0_2024.3 四个核心XML文件逐项解读Hadoop的所有关键参数都集中在etc/hadoop目录下的XML文件中理解这几个文件是入门Hadoop的重中之重。第一个是core-site.xml它定义Hadoop集群的全局属性最核心的是默认文件系统地址和临时目录。configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configurationfs.defaultFS告诉Hadoop客户端默认的HDFS入口是hdfs://localhost:9000这是NameNode的RPC通信地址。hadoop.tmp.dir是Hadoop运行时存放临时数据和元数据的根目录这个路径最好手动指定否则默认会放在/tmp下系统一清理你的集群数据就全没了。接下来是hdfs-site.xml它管理HDFS的存储参数。伪分布式模式下副本数必须设为1因为只有一台DataNode。configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///usr/local/hadoop/tmp/dfs/name/value /property property namedfs.datanode.data.dir/name valuefile:///usr/local/hadoop/tmp/dfs/data/value /property /configurationdfs.namenode.name.dir是NameNode的元数据存放目录dfs.datanode.data.dir是DataNode的数据块存放目录。手动指定这两个路径一是为了结构清晰二是避免某些发行版默认路径权限过低导致启动失败。然后是mapred-site.xml。Hadoop 3.x中这个文件默认不存在只有mapred-site.xml.template需要先复制一份cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml编辑内容configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration这个参数指定MapReduce作业的运行框架是YARN。如果不配置MapReduce作业会尝试在本地运行而不会提交到YARN集群这在学习阶段容易造成困惑。最后是yarn-site.xml它是YARN资源调度器的配置。伪分布式至少要配置一个辅助服务configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configurationmapreduce_shuffle是MapReduce在Shuffle阶段需要用的辅助服务没有它Map任务和Reduce任务之间的中间数据就无法正确传递作业会一直卡住或直接失败。4.4 配置workers文件告诉Hadoop从节点是谁Hadoop 3.x使用workers文件以前叫slaves3.x改名了列出所有DataNode和NodeManager所在的主机名。伪分布式只有一个节点写入localhost即可echo localhost /usr/local/hadoop/etc/hadoop/workers这个文件极其重要很多人启动HDFS后发现只有NameNode启动、DataNode没启动八成是workers文件忘了配或者配错了主机名。NameNode启动后扫描workers文件决定去哪台机器启动DataNode如果文件是空的或主机名错误DataNode自然起不来。4.5 配置Hadoop环境变量让命令全局可用编辑/etc/profile在JDK配置后面追加export HADOOP_HOME/usr/local/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin然后source /etc/profile。验证hadoop version能输出版本信息就说明Hadoop环境变量配置成功。5. 首次启动全流程格式化、启动、验证5.1 格式化NameNode只能执行一次的操作这个操作可以说是新手踩坑重灾区。执行前一定理解它的含义格式化NameNode会初始化HDFS的元数据存储目录在dfs.namenode.name.dir指定的路径下生成一个current/VERSION文件相当于给文件系统刻录了一个全新的身份标识。hdfs namenode -format看到输出末尾有successfully formatted这样的字样说明格式化成功。这里必须强调格式化一定要在首次启动前执行而且只能执行一次。很多人遇到DataNode起不来搜了一圈说重新格式化一下就好了结果执行完更乱了。原因在于格式化会重新生成NameNode的clusterId而DataNode的数据目录里还保留着之前格式化产生的clusterId两边的ID对不上DataNode启动后会被NameNode拒绝。所以正确的做法是需要重新格式化之前先把hadoop.tmp.dir目录下的旧数据完全删掉比如rm -rf /usr/local/hadoop/tmp再执行格式化保证两边同步。5.2 启动HDFS与YARN一条命令和它的整个流程启动HDFSstart-dfs.sh这个过程会依次拉起NameNode、DataNode和SecondaryNameNode三个进程。脚本通过SSH免密登录到本机执行启动命令所以前面配置的SSH免密在这一刻就派上用场了。启动YARNstart-yarn.sh同样会拉起ResourceManager和NodeManager。启动完成后执行jps命令验证进程状态。jps是JDK自带的一个工具专门查看Java进程。伪分布式正常时应该能看到以下5个进程12345 NameNode 12346 DataNode 12347 SecondaryNameNode 12348 ResourceManager 12349 NodeManager如果缺了哪个对照着检查缺DataNode优先检查workers文件、SSH免密、hadoop.tmp.dir是否被清理干净缺ResourceManager检查yarn-site.xml配置、是否先启动了HDFS再启动YARN全部都没起来检查JAVA_HOME是否正确、Hadoop目录属主是否为hadoop用户5.3 Web界面验证直观看到集群状态进程都起来了再用Web界面做双重确认。Hadoop 3.x的NameNode管理界面端口是98702.x是50070很多人还记着旧端口导致打不开YARN的ResourceManager界面是8088。浏览器访问http://你的IP:9870能看到HDFS的总容量、已用空间、DataNode节点列表。访问http://你的IP:8088可以看到集群的资源情况、正在运行的任务列表。如果浏览器打不开先检查防火墙是否关闭再确认进程是否真的在监听端口netstat -tlnp | grep 9870 netstat -tlnp | grep 8088没有输出就说明端口没监听进程没起来或者起来了又崩了去查看日志/usr/local/hadoop/logs目录下的hadoop-hadoop-namenode-*.log和hadoop-hadoop-datanode-*.log。6. 高频报错排查从jar does not exist说起6.1 jar does not exist or is not a normal file的根源在热词里看到这个报错说明中招的人不少。这个错误长这样Error: Could not find or load main class ... jar does not exist or is not a normal file: /usr/local/hadoop/share/hadoop/m...这个报错常见的触发场景是运行MapReduce示例程序时命令敲成了类似这样hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output但报错提示jar does not exist or is not a normal file而那个路径明明存在那么问题大概率出在以下三个方面第一命令的jar路径被截断了。如果你是在输入命令时手动敲的路径可能漏了一半或者撞到了特殊字符Linux命令行会把不完整的路径传给Java就报这个错。解决办法是尽量用Tab补全路径或者用ls /usr/local/hadoop/share/hadoop/mapreduce/先看下文件实际存在与否以及完整名称。第二环境变量HADOOP_CLASSPATH被污染了。某些教程会让你在hadoop-env.sh里手动设置HADOOP_CLASSPATH以指向各个lib目录如果设置不当就会干扰hadoop jar命令解析jar包。我的建议是入门阶段不要手动设置这个变量让Hadoop自己的脚本去计算。第三hadoop命令本身指向了错误的安装目录。如果你机器上装了多个Hadoop版本或者通过alias做了指向which hadoop查到的路径和HADOOP_HOME不一致就会出现文件明明存在但命令说找不到的诡异现象。用which hadoop、echo $HADOOP_HOME检查一下确保两边一致。6.2 其他经典报错NodeManager启动失败与权限问题还有一个高频问题是NodeManager或DataNode启动后立刻消失。查看日志常见错误是Permission denied。这是典型的目录属主问题——你用了root解压Hadoop然后切换成hadoop用户启动Hadoop在写临时目录时没有权限。解决办法就是我之前强调的chown -R hadoop:hadoop /usr/local/hadoop如果你是严格按照本教程在hadoop用户下操作的这个坑基本不会踩到。另一个问题是格式化时的警告WARN ... NativeIO ... Unable to initialize NativeIO。这个警告一般不影响使用是Hadoop没找到本机的native库功能上会退化一些但学习阶段完全够用。如果想消掉可以安装libsnappy等依赖库但没必要专门折腾。还有人在启动时遇到Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured。这个是因为core-site.xml里的fs.defaultFS没有配置或者配置错了。检查一下你编辑的是不是/etc/hadoop/core-site.xml以及有没有保存成功。6.3 第一个MapReduce程序跑通它才算真正完成安装环境搭好之后建议跑一个官方的wordcount示例程序验证全链路是否正常。先准备输入数据# 在HDFS上创建输入目录 hdfs dfs -mkdir -p /input hdfs dfs -mkdir -p /output # 创建一个本地测试文件并上传 echo hello hadoop hello world test.txt hdfs dfs -put test.txt /input/上传后通过hdfs dfs -ls /input确认文件在HDFS上。然后执行MapReduce任务hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output任务执行过程中会打印一堆Map和Reduce的进度信息看到类似Map 100% Reduce 100%的输出后查看结果hdfs dfs -cat /output/part-r-00000如果输出hello 2 hadoop 1 world 1恭喜你说明从HDFS到MapReduce到YARN的整条链路全部跑通了。这个时候你的Hadoop伪分布式环境才是真正意义上的装好了。7. 伪分布式日常使用技巧与踩坑经验7.1 常用命令速查每天都要用到的那些装好环境只是开始日常使用中这几个命令的频率最高建议收藏# 格式化NameNode仅首次或彻底重来 hdfs namenode -format # 启动/停止HDFS start-dfs.sh stop-dfs.sh # 启动/停止YARN start-yarn.sh stop-yarn.sh # HDFS文件操作 hdfs dfs -mkdir -p /test hdfs dfs -ls /test hdfs dfs -put local.txt /test/ hdfs dfs -get /test/local.txt ./ hdfs dfs -cat /test/part-r-00000 hdfs dfs -rm -r /test/output # 查看进程 jps注意hdfs dfs -rm -r是删除HDFS上目录的常用命令不加-r只能删空目录或文件。7.2 停止服务的正确顺序防止数据块损坏不少人是直接关虚拟机来结束Hadoop的这样大概率会导致下次启动时DataNode报错、NameNode进入安全模式。正确操作是# 先停YARN再停HDFS stop-yarn.sh stop-dfs.sh这个顺序和启动时相反。启动时先起HDFSNameNode、DataNode就绪再起YARNResourceManager、NodeManager停止时先停YARN让正在跑的任务有机会收尾再停HDFS避免数据块还在写入时被强制中断。如果已经出现了进程异常下次启动老是进入安全模式可以通过hdfs dfsadmin -safemode leave手动退出安全模式但根本解法还是规范启动和停止。7.3 我踩过的坑留给后来人的话最后分享几个我在带新人过程中反复遇到的实际教训。一是不要用root跑集群。Hadoop的很多启动脚本对root用户有特殊检查即便能跑文件权限也会变得一团糟。养成用专用用户操作的习惯后面不管学Hive还是Spark都能少踩一半坑。二是日志是排错的第一依据。不要凭着报错信息去网上瞎搜先翻日志。比如DataNode起不来/usr/local/hadoop/logs/hadoop-hadoop-datanode-localhost.log里通常直接写着失败原因照着原因去搜解决方案效率高得多。三是如果连示例程序都跑不起来先检查环境别急着怀疑代码。很多人wordcount跑不通就去看代码逻辑我建议先用hdfs dfs -put确认HDFS读写正常再用jps确认5个核心进程齐全最后再跑程序。链路一层层筛问题很快就能定位。四是虚拟机快照是后悔药。如果在VMware或VirtualBox里搭环境配置好一套能跑的环境后拍一个快照。后面练手把环境搞坏了一分钟恢复比重新走一遍安装流程快太多了。这套伪分布式环境跑通之后你可以继续在上面做很多事情把Hive装上去练SQL把ZooKeeper整合进来模拟高可用甚至多克隆几台虚拟机改成完全分布式。到那时候你会发现当初踏踏实实理解的那些XML配置一个都没白学。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

TVA具身智能“原生大脑”:TVA具身架构中的物理可微分建模 2026/9/7 21:30:32

TVA具身智能“原生大脑”:TVA具身架构中的物理可微分建模

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术体系。它有机融合深度强化学习(DRL)、卷积…

阅读更多 →
TVA具身智能“原生大脑”:哈密顿流指导的模型压缩新范式 2026/9/7 21:30:32

TVA具身智能“原生大脑”:哈密顿流指导的模型压缩新范式

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术体系。它有机融合深度强化学习(DRL)、卷积…

阅读更多 →
多场耦合优化:工程计算与科学仿真的前沿技术 2026/9/7 21:30:32

多场耦合优化:工程计算与科学仿真的前沿技术

1. 多场耦合优化概述多场耦合优化是当前工程计算与科学仿真领域的前沿方向,它突破了传统单物理场分析的局限性,通过建立不同物理场之间的相互作用模型,实现对复杂系统的整体性能优化。我在参与某型航空发动机叶片冷却设计项目时,曾…

阅读更多 →
AI Agent评估实战:LLM-as-Judge、人工标注与A/B测试 2026/9/7 21:30:32

AI Agent评估实战:LLM-as-Judge、人工标注与A/B测试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
TVA具身智能“原生大脑”:力-位-耗散三维参数化语义解析框架 2026/9/7 21:30:32

TVA具身智能“原生大脑”:力-位-耗散三维参数化语义解析框架

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术体系。它有机融合深度强化学习(DRL)、卷积…

阅读更多 →
python的多线程编程之锁 2026/9/7 21:27:32

python的多线程编程之锁

1、 背景概述上篇文章里, 着重叙说了编程的某些基本方面, 然而其中欠缺有关锁的相关概念, 所以在这篇文章里予以补充。因为存有GIL, 即全局解释器锁, 所以每次获取CPU时, 仅有一个线程能够获取CPU运行权, 并在这方面被视作线程安全。然而在线程运行期间, 它可共享内存, 并具备一…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞