尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Windows 10/11 本地搭建 Hadoop 3.1.0 伪分布式集群完整指南

Windows 10/11 本地搭建 Hadoop 3.1.0 伪分布式集群完整指南 1. 从零到一为什么要在Windows上折腾Hadoop如果你是一名数据方向的学生或者刚进入大数据领域的开发者大概率会面临一个尴尬的处境教程和书籍里讲的Hadoop生态几乎清一色地运行在Linux服务器上。但你的主力开发机很可能是一台Windows电脑。难道为了学个Hadoop非得装个双系统或者去折腾虚拟机、租云服务器吗其实完全不必。Hadoop本身是用Java写的理论上跨平台。在Windows上直接运行Hadoop虽然不被官方推荐用于生产环境但对于学习、开发、调试和本地测试来说是一条非常高效的路径。它能让你在熟悉的Windows桌面环境下快速搭建起一个包含HDFS和YARN的“伪分布式”集群亲手运行MapReduce任务直观地理解数据分片、计算调度这些核心概念而不用分心去学习另一套操作系统的命令。我最初学习时也走了弯路在虚拟机和双系统上浪费了不少时间。后来发现只要配置得当Windows下的Hadoop 3.1.0完全可以稳定运行。这篇记录就是把我踩过的坑、验证过的步骤以及那些官方文档里不会写的细节从头到尾梳理一遍。目标很简单让你在Windows 10/11系统上用最少的依赖和最清晰的步骤成功启动一个功能完整的Hadoop环境。我们会从Java环境配置开始一路讲到HDFS文件系统的初体验确保你每一步都知其然更知其所以然。2. 战前准备理清依赖与避坑指南在开始下载安装包之前我们必须把地基打牢。Windows上运行Hadoop 3.1.0核心依赖就两个合适的Java版本和必要的系统支持工具。这一步没做好后面会报各种千奇百怪的错误。2.1 Java环境版本锁定与路径纯净Hadoop 3.1.x官方兼容的是Java 8。虽然更高版本的Java如Java 11也可能运行但会引入不必要的兼容性风险尤其是对于初学者。我们的原则是求稳不求新。为什么必须是Java 8Hadoop的构建和运行时库是针对Java 8的字节码级别进行测试和优化的。使用Java 11或更高版本你可能会遇到诸如sun.misc.BASE64Encoder等内部API已被移除的类找不到错误或者某些依赖库行为不一致的问题。为了杜绝一切潜在麻烦直接安装Oracle JDK 8或者OpenJDK 8是最佳选择。安装与配置实操下载建议从AdoptOpenJDK或Amazon Corretto等提供长期支持的发行版下载OpenJDK 8。安装时注意安装路径不要包含空格或中文。例如C:\Java\jdk1.8.0_xxx就是一个好路径C:\Program Files\Java\...包含空格或D:\开发工具\Java\...包含中文则是潜在的雷区。环境变量这是关键。你需要设置两个系统环境变量JAVA_HOME指向你的JDK安装根目录例如C:\Java\jdk1.8.0_391。Hadoop的启动脚本会直接引用这个变量来找到Java。Path在Path变量中添加不是覆盖%JAVA_HOME%\bin。这让你能在任何命令行窗口直接使用java和javac命令。验证命令打开一个新的命令提示符CMD或PowerShell分别输入java -version javac -version如果两行命令都正确显示版本号为1.8.x说明配置成功。务必注意java和javac的版本必须一致且来自同一个JDK安装。2.2 Windows系统支持winutils与hadoop.dll这是Windows平台特有的环节也是90%失败案例的根源。Hadoop的某些底层文件操作尤其是HDFS依赖于原生库Native Library。在Linux上这些库会随源码编译生成而在Windows上我们需要额外提供两个文件winutils.exe和hadoop.dll。它们是什么你可以把winutils.exe理解为Hadoop在Windows上的“翻译官”和“工具集”它实现了chmod,chown,ls等Linux shell命令在Windows下的等效功能。hadoop.dll则是一个动态链接库提供了Hadoop运行时所需的本地代码支持。如何获取与放置来源最可靠的来源是Apache Hadoop官网的源码自行编译但这对于新手过于复杂。通常我们使用由社区预编译好的二进制文件。可以在Github上搜索关键词“hadoop-winutils”寻找对应Hadoop 3.1.0版本的发布包。版本匹配必须确保winutils和hadoop.dll的版本与你要安装的Hadoop主版本严格一致。使用3.1.0版本的Hadoop就必须找for hadoop-3.1.0的winutils。版本不匹配会导致启动时报错“Failed to locate the winutils binary”或更隐晦的本地库加载失败。放置位置下载后将这两个文件放入你的Hadoop安装目录的bin子目录下。例如如果你打算将Hadoop解压到D:\hadoop-3.1.0那么就把winutils.exe和hadoop.dll复制到D:\hadoop-3.1.0\bin\里面。注意有些教程会让你覆盖bin目录下原有的文件但Hadoop 3.1.0的Windows发行版bin目录下原本并没有这些文件所以直接放入即可。这一步是后续所有操作的基础务必确认文件已就位。3. Hadoop本体部署与核心配置解剖准备好弹药后我们开始部署Hadoop本身。这个过程不仅仅是解压和复制更重要的是理解几个核心配置文件的作用它们决定了Hadoop以何种模式运行、资源如何分配。3.1 软件获取与目录规划从Apache Hadoop官网的镜像站下载hadoop-3.1.0.tar.gz二进制发行版。解压到你喜欢的路径同样遵循无空格、无中文的原则例如D:\BigData\hadoop-3.1.0。这个路径我们称之为%HADOOP_HOME%。接下来设置环境变量HADOOP_HOME值为你的Hadoop安装路径如D:\BigData\hadoop-3.1.0。然后在系统Path变量中追加%HADOOP_HOME%\bin。这样你就可以在命令行中直接使用hdfs、yarn等命令了。3.2 配置文件详解从伪分布式模式说起Hadoop支持三种模式本地模式、伪分布式模式、完全分布式模式。对于学习而言伪分布式模式是最佳选择。它是在单台机器上模拟一个完整的集群所有守护进程NameNode, DataNode, ResourceManager, NodeManager都运行在同一台机器上但彼此以独立的Java进程存在通信机制与分布式集群完全一致。这让你能体验真正的集群工作流程。配置的核心在于%HADOOP_HOME%\etc\hadoop\目录下的几个XML文件。我们需要修改以下四个1. core-site.xml定义全局核心参数这个文件指定了Hadoop最核心的FS文件系统实现和默认的访问地址。configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/D:/BigData/hadoop-3.1.0/data/tmp/value /property /configurationfs.defaultFSHadoop文件系统的默认URI。hdfs://localhost:9000表示HDFS运行在本机监听9000端口。这是HDFS客户端包括后续的YARN与NameNode通信的地址。hadoop.tmp.dirHadoop临时文件目录。必须修改为一个绝对路径且确保该目录有读写权限。使用Windows路径时可以用/D:/...的形式。这个目录非常重要NameNode、DataNode的元数据和数据默认会存储在其子目录下。如果使用默认的/tmp系统重启后数据可能丢失。2. hdfs-site.xmlHDFS专属配置这里配置HDFS副本因子、NameNode和DataNode的数据存储路径。configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/D:/BigData/hadoop-3.1.0/data/namenode/value /property property namedfs.datanode.data.dir/name value/D:/BigData/hadoop-3.1.0/data/datanode/value /property /configurationdfs.replication数据块副本数量。在伪分布式模式下只有一台机器所以设置为1。在生产集群中通常为3。dfs.namenode.name.dirNameNode存储命名空间镜像和编辑日志的本地目录。格式化NameNode时会在此创建文件。dfs.datanode.data.dirDataNode存储实际数据块的本地目录。实操心得强烈建议将data目录包含tmp、namenode、datanode放在Hadoop安装目录之外例如D:\BigData\hadoop-data。这样在做Hadoop版本升级或重装时你的数据可以得以保留不会因为误删安装目录而丢失。3. mapred-site.xmlMapReduce框架配置这个文件告诉HadoopMapReduce作业应该运行在YARN框架上。configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration在Hadoop 2.x之后MapReduce不再有自己的作业调度器而是作为YARN上的一个应用来运行。这个配置就是启用这种模式。4. yarn-site.xmlYARN资源管理器配置配置YARN的资源调度和任务执行机制。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 property nameyarn.nodemanager.env-whitelist/name valueJAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME/value /property /configurationyarn.nodemanager.aux-services定义了NodeManager上的一个辅助服务。mapreduce_shuffle是MapReduce任务在Reduce阶段获取Map输出数据所必需的服务。yarn.nodemanager.env-whitelist指定了从NodeManager容器中继承的环境变量白名单。这里我们把Hadoop相关的环境变量都加进去确保在容器中启动的MapReduce任务能正确找到Hadoop的类库和配置。3.3 环境变量脚本hadoop-env.cmd的调整在etc\hadoop\目录下找到hadoop-env.cmdWindows环境。用文本编辑器打开找到设置JAVA_HOME的那一行通常是被注释掉的。取消注释并将其值设置为你的JDK安装绝对路径。set JAVA_HOMEC:\Java\jdk1.8.0_391重要这里必须使用Windows风格的反斜杠路径并且确保路径正确。如果这里设置错误所有Hadoop守护进程都将无法启动。这是除了系统环境变量外Hadoop脚本内部寻找Java的另一个关键位置。4. 初始化、启动与首次健康检查配置完成后我们进入激动人心的启动环节。这个过程需要按顺序执行并且每一步都要观察日志确认没有错误。4.1 格式化HDFS一次性的“硬盘分区”在首次启动HDFS之前必须格式化NameNode。这个操作会清空dfs.namenode.name.dir指定的目录创建新的存储命名空间和编辑日志的镜像文件。注意这是一个破坏性操作仅在第一次搭建时执行重复执行会丢失所有HDFS上的数据。以管理员身份打开命令提示符CMD。因为后续操作可能涉及创建符号链接或服务需要管理员权限。切换到%HADOOP_HOME%\bin目录或者确保%HADOOP_HOME%\bin已在Path中。执行格式化命令hdfs namenode -format观察输出。成功的标志是看到类似“Storage directory ... has been successfully formatted.”的信息并且整个过程没有“ERROR”级别的日志。如果看到关于winutils或权限的错误请返回检查第二章的内容。4.2 启动HDFS守护进程HDFS由两个主要守护进程组成NameNode管理者和DataNode工作者。我们使用Hadoop自带的脚本启动它们。在管理员CMD中执行start-dfs.cmd这个脚本会依次启动NameNode、DataNode以及一个SecondaryNameNode用于合并编辑日志提高恢复效率。如何验证启动成功方式一查看Java进程。打开任务管理器切换到“详细信息”标签页你应该能看到至少三个名为java.exe的进程其命令行参数中分别包含NameNode、DataNode和SecondaryNameNode。方式二使用jps命令。在CMD中输入jpsJava Virtual Machine Process Status Tool。你应该能看到类似下面的输出1234 NameNode 5678 DataNode 9012 SecondaryNameNode 3456 Jps方式三访问Web UI。这是最直观的方式。打开浏览器访问http://localhost:9870。这是Hadoop 3.x中NameNode的Web管理界面默认端口2.x是50070。如果能看到一个显示集群概况、存储使用情况等信息的页面说明HDFS启动成功。4.3 启动YARN守护进程YARN也由两个主要守护进程组成ResourceManager全局资源调度者和NodeManager单节点资源与任务管理者。在另一个管理员CMD窗口中避免日志混杂执行start-yarn.cmd验证YARN启动jps命令在新的CMD窗口执行jps应看到ResourceManager和NodeManager进程。Web UI访问http://localhost:8088。这是ResourceManager的Web UI你可以在这里提交、监控和管理YARN应用包括MapReduce作业。4.4 首次健康检查在HDFS上走两步集群启动后我们通过命令行与HDFS交互确保其工作正常。创建用户目录在HDFS上为当前Windows用户创建一个家目录这是一个好习惯。hdfs dfs -mkdir -p /user/%USERNAME%%USERNAME%是Windows环境变量代表当前登录用户名。-p参数表示如果父目录不存在则一并创建。上传本地文件到HDFS找一个小的文本文件比如一个README.txt将其上传。hdfs dfs -put D:\path\to\your\README.txt /user/%USERNAME%/列出HDFS文件hdfs dfs -ls /user/%USERNAME%你应该能看到刚才上传的文件。查看文件内容hdfs dfs -cat /user/%USERNAME%/README.txt如果能看到文件内容恭喜你你的Hadoop伪分布式集群已经成功运行并且完成了第一次数据读写5. 运行第一个MapReduce作业WordCount理论配置都通过了现在来点实际的——运行Hadoop的“Hello World”WordCount程序。这个程序统计输入文本中每个单词出现的次数。5.1 准备输入数据在HDFS上创建一个输入目录并放入一些文本文件。我们可以用Hadoop自带的LICENSE.txt文件作为示例。# 在HDFS上创建输入目录 hdfs dfs -mkdir /user/%USERNAME%/wordcount_input # 将Hadoop安装目录下的LICENSE.txt文件上传到HDFS输入目录 # 注意路径替换成你的实际Hadoop安装路径 hdfs dfs -put %HADOOP_HOME%\LICENSE.txt /user/%USERNAME%/wordcount_input/5.2 定位并运行示例Jar包Hadoop的发行版中自带了许多示例程序打包在share/hadoop/mapreduce/目录下的hadoop-mapreduce-examples-3.1.0.jar文件中。WordCount就是其中之一。# 运行WordCount程序 # 语法hadoop jar jar文件 主类名 输入路径 输出路径 hadoop jar %HADOOP_HOME%\share\hadoop\mapreduce\hadoop-mapreduce-examples-3.1.0.jar wordcount /user/%USERNAME%/wordcount_input /user/%USERNAME%/wordcount_output命令解析hadoop jar用于执行一个打包成JAR的MapReduce程序。wordcount是hadoop-mapreduce-examples-3.1.0.jar中WordCount程序的主类名org.apache.hadoop.examples.WordCount的简称该Jar包的manifest文件指定了简写。最后一个参数是HDFS上的输出目录。非常重要这个目录在运行前必须不存在否则作业会因防止数据覆盖而失败。5.3 观察作业执行与结果查看执行命令后你会在控制台看到大量的日志输出。作业会被提交到YARN上执行。你可以在控制台观察日志会显示Map和Reduce的进度最终以“Job completed successfully”结束。在Web UI观察刷新http://localhost:8088你会看到一个新的应用Application点击进去可以查看详细的Map、Reduce任务状态、计数器以及日志。查看结果作业成功后查看输出目录hdfs dfs -ls /user/%USERNAME%/wordcount_output你会看到两个文件_SUCCESS空标志文件和part-r-00000结果文件。查看结果hdfs dfs -cat /user/%USERNAME%/wordcount_output/part-r-00000 | more输出应该是按字母顺序排列的单词及其出现次数。至此你已经完成了从环境搭建、配置、启动到运行完整MapReduce作业的全流程。这个本地的伪分布式环境已经具备了Hadoop核心组件的所有功能足以支撑你进行大部分的学习和开发测试工作。6. 日常维护、问题排查与进阶配置集群跑起来了但日常使用中总会遇到各种小问题。这一章分享一些维护技巧和常见问题的排查思路。6.1 启动与停止脚本的封装每次都开两个CMD窗口分别启动和关闭很麻烦。我们可以创建简单的批处理脚本。启动脚本start-all.cmd(内容)echo off echo Starting HDFS... call %HADOOP_HOME%\sbin\start-dfs.cmd timeout /t 5 /nobreak nul echo Starting YARN... call %HADOOP_HOME%\sbin\start-yarn.cmd echo Hadoop cluster started. jps pause停止脚本stop-all.cmd(内容)echo off echo Stopping YARN... call %HADOOP_HOME%\sbin\stop-yarn.cmd timeout /t 5 /nobreak nul echo Stopping HDFS... call %HADOOP_HOME%\sbin\stop-dfs.cmd echo Hadoop cluster stopped. jps pause将这两个文件放在%HADOOP_HOME%\sbin\目录下或其他方便的位置以后就可以一键启动和停止了。timeout命令是为了等待前一组服务完全启动或停止避免依赖问题。6.2 常见问题与排查清单错误java.io.IOException: Could not locate executable null\bin\winutils.exe原因HADOOP_HOME环境变量未设置或者winutils.exe不在%HADOOP_HOME%\bin目录下。解决检查HADOOP_HOME环境变量并确认winutils.exe和hadoop.dll已正确放置。错误Failed to start DataNode或java.net.BindException: Address already in use原因端口被占用。Hadoop的多个服务需要监听特定端口如NameNode的9000/9870DataNode的9864等。解决使用netstat -ano | findstr :9000查找占用端口的进程ID。在任务管理器中结束该进程或者修改Hadoop配置文件中冲突的端口号不推荐初学者。更常见的是上次Hadoop未正常停止残留了Java进程。先执行stop-all.cmd如果无效就用jps查看到底有哪些Hadoop进程还在然后用taskkill /pid 进程号 /f强制结束。Web UI无法访问localhost:9870或8088打不开原因1对应的守护进程没有启动。用jps检查。原因2Windows防火墙阻止了连接。尝试暂时关闭防火墙测试或者在防火墙设置中为Java(TM) Platform SE binary添加入站规则。原因3Hadoop 3.x的NameNode Web UI端口默认是9870而不是老版本的50070确认URL是否正确。运行MapReduce作业卡住或者报错Application application_xxx failed 2 times due to AM Container for appattempt_xxx exited with exitCode: 1原因这通常是容器Container执行环境问题比如类路径错误、内存不足。排查查看日志在8088的Web UI上找到失败的应用点击“Logs”链接查看具体错误信息。这是最直接的排错手段。检查yarn-site.xml中的env-whitelist确保包含了JAVA_HOME和HADOOP_*_HOME等关键环境变量如我们在3.2节配置的那样。调整内存如果日志提示内存不足OOM可以尝试在mapred-site.xml中为Map和Reduce任务设置更小的内存对于本地测试机property namemapreduce.map.memory.mb/name value1024/value /property property namemapreduce.reduce.memory.mb/name value1024/value /property6.3 数据目录管理与重置在学习过程中你可能想清空HDFS从头开始。不要直接格式化NameNode那会丢失元数据定义。正确的步骤是停止所有Hadoop服务 (stop-all.cmd)。删除你在core-site.xml和hdfs-site.xml中配置的所有数据目录即hadoop.tmp.dir,dfs.namenode.name.dir,dfs.datanode.data.dir指向的文件夹。重新格式化NameNode (hdfs namenode -format)。重新启动服务 (start-all.cmd)。这样你就得到了一个全新的、空的HDFS集群。6.4 性能与资源调优浅谈对于本地学习环境性能不是首要目标。但如果你的机器内存较小比如8GB可能会遇到资源紧张。除了调整MapReduce任务内存外还可以限制YARN的资源使用在yarn-site.xml中property nameyarn.nodemanager.resource.memory-mb/name value4096/value /property property nameyarn.scheduler.maximum-allocation-mb/name value2048/value /propertyyarn.nodemanager.resource.memory-mb告诉NodeManager本节点有多少MB内存可供YARN容器使用。设置为物理内存的70-80%较为安全。yarn.scheduler.maximum-allocation-mb单个容器任务可申请的最大内存。这些调整可以防止YARN占用过多内存导致系统卡顿。配置完成后需要重启YARN服务 (stop-yarn.cmdstart-yarn.cmd) 才能生效。经过以上六个章节的拆解你应该已经拥有了一个在Windows上稳定运行的Hadoop 3.1.0学习环境。从依赖准备、核心配置解析到集群启动、作业运行再到日常维护和问题排查这套流程覆盖了单机伪分布式模式下的主要环节。这个环境就像你的个人大数据实验室接下来你可以放心地去探索HDFS的更多命令尝试编写自己的MapReduce程序或者继续向Hive、HBase等上层组件进军了。记住遇到问题多查日志Web UI和命令行输出那里面藏着绝大部分答案。
返回列表