多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Windows系统下Hadoop 2.10.1单机伪分布式环境搭建与避坑指南

Windows系统下Hadoop 2.10.1单机伪分布式环境搭建与避坑指南 1. 为什么要在Windows上折腾Hadoop如果你是一个数据开发或者大数据方向的学生大概率会听到一个“业界共识”Hadoop是为Linux环境设计的生产环境几乎都跑在Linux服务器上。这话没错但这就意味着我们只能在Windows上望而却步吗恰恰相反对于绝大多数学习者、个人开发者或者需要在本地快速验证某些数据处理逻辑的场景Windows恰恰是最方便、最触手可及的开发环境。在虚拟机里装个Linux当然可以但那会消耗额外的系统资源对于配置不那么高的电脑来说开个虚拟机再跑Hadoop集群体验可能并不友好。所以在Windows上直接安装配置一个单机版的Hadoop其核心价值在于搭建一个轻量、便捷的学习与原型验证环境。你可以在这里练习HDFS的基本命令跑通MapReduce的WordCount示例甚至学习YARN的基本调度而无需操心虚拟机的网络配置、资源分配等问题。整个过程就是把那个看似属于“服务器”的庞然大物请到你的个人电脑桌面上来。我经历过无数次在Windows上配置Hadoop从早期的Cygwin到后来的官方支持踩过的坑数不胜数。今天我就把这些经验整合成一条清晰、稳定、可复现的路径手把手带你走通目标很明确一次成功避免那些令人抓狂的“灵异”错误。2. 安装前的核心准备工具选型与环境清理在Windows上安装Hadoop成功与否八成取决于准备工作是否到位。这里有几个关键选择直接决定了后续流程的顺畅度。2.1 Java环境认准JDK 8Hadoop与Java版本有较强的耦合性。虽然新版Hadoop开始支持更高版本的JDK但为了最大限度地保证兼容性和稳定性避免各种奇怪的类冲突或运行时错误强烈建议使用JDK 8。这是经过最广泛测试的版本。你可以从Oracle官网或AdoptOpenJDK等渠道下载。安装时注意两点一是安装路径不要包含中文或空格比如C:\Java\jdk1.8.0_381就是一个好选择二是要牢记这个路径我们马上就会用到。安装完成后需要配置系统环境变量新建系统变量JAVA_HOME值就是你的JDK安装路径例如C:\Java\jdk1.8.0_381。在系统变量Path中添加%JAVA_HOME%\bin。打开命令提示符CMD或 PowerShell输入java -version和javac -version能正确显示版本信息即表示配置成功。这一步是基石务必先验证好。2.2 Hadoop版本选择与下载对于Windows环境Hadoop 2.x系列如2.7.x, 2.10.x的兼容性支持相对较好。Hadoop 3.x虽然功能更强但在Windows上可能需要额外的补丁或面临更多未知问题。作为“包成功”教程我们选择一条更稳妥的路Hadoop 2.10.1。你可以从Apache官网或国内镜像站下载二进制包文件名为hadoop-2.10.1.tar.gz。下载完成后找一个合适的目录解压。同样路径不要有中文和空格。例如解压到D:\BigData\hadoop-2.10.1。这个目录我们称之为HADOOP_HOME。2.3 安装Windows原生支持库winutils这是整个流程中最关键、也最容易出错的一步。Hadoop的某些核心组件特别是HDFS依赖于一些Linux原生系统调用。为了让它在Windows上运行我们需要一个名为winutils的二进制工具集来模拟这些调用。你需要做的是去GitHub上搜索winutils找到一个维护较新的仓库例如一个包含hadoop-2.10.1目录的仓库。在该仓库中找到对应你Hadoop版本2.10.1的文件夹。下载文件夹内的所有文件通常包括winutils.exe,hadoop.dll,libwinutils.lib等。将这些文件覆盖复制到你的HADOOP_HOME\bin目录下。注意这一步的版本匹配至关重要。用错了版本的winutils会导致后续hdfs namenode -format或其他命令执行时报出“找不到入口点”或“0xc000007b”等应用程序错误。2.4 配置系统环境变量现在我们来配置Hadoop自己的环境变量。新建系统变量HADOOP_HOME值为你的Hadoop解压目录例如D:\BigData\hadoop-2.10.1。在系统变量Path中添加%HADOOP_HOME%\bin。配置完成后重新打开一个命令提示符窗口输入hadoop version。如果配置正确你应该能看到Hadoop的版本信息输出。如果提示“不是内部或外部命令”请检查HADOOP_HOME和Path的设置是否正确以及是否重启了命令行窗口。3. Hadoop核心配置文件详解与修改Hadoop的行为完全由一系列XML配置文件控制。对于单机伪分布式部署这是我们本地学习最常用的模式主要需要修改HADOOP_HOME\etc\hadoop目录下的四个文件。3.1 core-site.xml定义全局核心参数这个文件配置Hadoop最核心的属性主要是定义HDFS的默认访问地址。configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value descriptionHDFS的默认文件系统URI。localhost表示本地9000是默认RPC端口。/description /property property namehadoop.tmp.dir/name value/D:/BigData/hadoop_data/tmp/value descriptionHadoop临时文件目录。请确保该路径存在且使用正斜杠(/)或双反斜杠(\\\\)。/description /property /configuration这里有个关键点hadoop.tmp.dir。Hadoop的许多数据如NameNode、DataNode的存储默认会放在这个目录下。务必将其设置到一个有足够空间、路径简单的磁盘位置并手动创建该目录例如D:\BigData\hadoop_data\tmp。使用正斜杠/可以避免转义字符问题。3.2 hdfs-site.xml配置HDFS相关参数这里我们配置HDFS的副本因子和NameNode、DataNode的数据存储目录。configuration property namedfs.replication/name value1/value description因为我们是单机模式所以数据副本数设为1。/description /property property namedfs.namenode.name.dir/name value/D:/BigData/hadoop_data/namenode/value descriptionNameNode元数据存储目录。需要提前创建。/description /property property namedfs.datanode.data.dir/name value/D:/BigData/hadoop_data/datanode/value descriptionDataNode实际数据块存储目录。需要提前创建。/description /property /configuration同样你需要手动创建D:\BigData\hadoop_data\namenode和D:\BigData\hadoop_data\datanode这两个目录。将存储目录从默认的/tmp移出来是个好习惯因为/tmp目录下的文件在系统重启后可能会被清除导致Hadoop集群无法启动。3.3 mapred-site.xml配置MapReduce框架首先你需要将模板文件mapred-site.xml.template复制一份并重命名为mapred-site.xml。然后修改其内容configuration property namemapreduce.framework.name/name valueyarn/value description指定MapReduce作业运行在YARN框架上。/description /property property namemapreduce.application.classpath/name value%HADOOP_HOME%/share/hadoop/mapreduce/*,%HADOOP_HOME%/share/hadoop/mapreduce/lib/*/value description设置MapReduce应用的类路径对于Windows环境此配置有时能解决找不到类的问题。/description /property /configuration将框架指定为yarn意味着我们将使用YARN来管理MapReduce作业的资源调度这是现代Hadoop的标准方式。3.4 yarn-site.xml配置YARN资源管理器configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value descriptionNodeManager上运行的附属服务MapReduce需要它来混洗shuffle数据。/description /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 description定义从NodeManager容器继承的环境变量白名单。确保JAVA_HOME在其中。/description /property /configurationmapreduce_shuffle这个服务是YARN运行MapReduce作业所必需的。环境变量白名单的配置是为了确保在YARN启动的容器内也能正确找到Java等执行环境。4. 格式化HDFS与启动集群配置文件修改完毕后我们来到了激动人心的启动环节。但在启动之前有一个一次性且极其重要的步骤。4.1 格式化NameNode这是初始化HDFS文件系统元数据的过程相当于为HDFS创建一个全新的“空白磁盘”。注意这个操作会清空之前NameNode目录dfs.namenode.name.dir下的所有数据仅在第一次安装时执行切勿在已有数据的集群上重复执行以管理员身份打开命令提示符CMD切换到HADOOP_HOME的bin目录下或者确保你的Path已配置好直接执行hdfs namenode -format你会看到大量日志输出。如果一切顺利最终会看到类似 “Storage directory ... has been successfully formatted” 的成功信息。如果遇到错误最常见的原因是winutils版本不匹配或缺失。请返回检查2.3步骤。配置文件中的路径不存在或权限不足。请手动创建所有配置中提到的目录如hadoop_data下的tmp,namenode,datanode并确保当前用户有读写权限。JAVA_HOME环境变量未正确设置。再次用java -version确认。4.2 启动HDFS和YARN守护进程Hadoop的各个组件是作为独立的守护进程运行的。我们需要分别启动HDFS和YARN。首先启动HDFS。在HADOOP_HOME的sbin目录下执行start-dfs.cmd你会看到几个新的命令行窗口弹出并运行分别是NameNode、DataNode和SecondaryNameNode。不要关闭这些窗口它们就是正在运行的进程。然后启动YARN。在同一个sbin目录下执行start-yarn.cmd同样会弹出两个新窗口分别是ResourceManager和NodeManager。至此一个完整的Hadoop单机伪分布式集群就启动起来了。4.3 验证集群状态如何确认一切正常呢我们有几种方法使用JPS命令在任意命令行窗口输入jpsJava Virtual Machine Process Status Tool。你应该能看到至少包含以下进程1234 NameNode 5678 DataNode 9012 SecondaryNameNode 3456 ResourceManager 7890 NodeManager数字是进程ID每次启动都会变关键是进程名称要对。访问Web管理界面HDFS NameNode状态在浏览器中打开http://localhost:50070。这是一个经典的界面Hadoop 2.x你可以在这里浏览文件系统、查看集群概况。YARN ResourceManager状态在浏览器中打开http://localhost:8088。在这里你可以提交、监控和管理YARN上运行的所有应用如MapReduce作业。如果这两个页面都能正常打开并且显示集群节点是“活”的那么恭喜你Hadoop集群已经成功在Windows上跑起来了5. 初体验从HDFS操作到运行MapReduce作业集群跑起来了不试试怎么行我们来完成两个经典操作操作HDFS文件系统以及运行一个MapReduce示例程序。5.1 HDFS基础命令实操打开一个新的命令提示符窗口不是刚才启动守护进程的那些我们可以使用hdfs dfs命令来操作分布式文件系统它的语法很像Linux的hadoop fs命令。在HDFS上创建目录hdfs dfs -mkdir -p /user/your_username/input这里-p参数表示如果父目录不存在则一并创建。/user/your_username是一个常见的用于存放用户数据的目录结构。从本地文件系统上传文件到HDFS 先在本地D:\根目录创建一个简单的文本文件test.txt里面写几行英文句子。hdfs dfs -put D:\test.txt /user/your_username/input/查看HDFS上的文件列表hdfs dfs -ls /user/your_username/input你应该能看到刚上传的test.txt文件。查看HDFS上文件的内容hdfs dfs -cat /user/your_username/input/test.txt这些命令让你感觉像是在操作一个本地的文件系统但实际上所有数据都存储在你之前配置的datanode目录下并且由NameNode统一管理元数据。5.2 运行经典的WordCount示例Hadoop安装包自带了许多示例JAR包其中最著名的就是hadoop-mapreduce-examples-*.jar里面包含了词频统计WordCount。准备输入数据我们已经上传了test.txt到HDFS的输入目录。在HDFS上创建输出目录注意输出目录必须不存在hdfs dfs -mkdir -p /user/your_username/output hdfs dfs -rm -r /user/your_username/output/wordcount_result先创建父目录然后确保待会儿的输出路径是空的。运行WordCount作业hadoop jar %HADOOP_HOME%/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /user/your_username/input /user/your_username/output/wordcount_result这个命令的意思是使用hadoop jar命令运行指定的JAR包执行其中的wordcount类输入路径是HDFS上的/user/your_username/input输出结果保存到HDFS上的/user/your_username/output/wordcount_result。你会看到控制台开始刷屏显示MapReduce作业的提交、Map进度、Reduce进度等信息。整个过程可能会持续几十秒。查看结果 作业完成后使用命令查看结果hdfs dfs -cat /user/your_username/output/wordcount_result/part-r-00000你会看到test.txt中每个单词及其出现的次数。此时你可以打开YARN的Web界面 (http://localhost:8088)应该能看到一个已经完成的MapReduce应用记录点击进去可以看到这个作业执行的详细信息包括用了多少个容器、运行时间等。这标志着你的Hadoop单机环境已经完全具备了数据处理能力。6. 避坑指南Windows环境下的典型问题与解决即便按照上述步骤操作在Windows这个“非原生”环境里你仍可能遇到一些特有的问题。这里我总结几个最常见的坑及其解决方案。6.1 启动脚本闪退或报错“找不到JAVA_HOME”现象双击start-dfs.cmd或start-yarn.cmd后命令行窗口一闪而过或者在日志中明确报错 “JAVA_HOME is not set”。根因与解决Hadoop的启动脚本是通过环境变量来寻找Java的。在Windows上有时脚本无法正确读取到系统级的环境变量。方案一推荐直接修改Hadoop的配置文件来指定Java路径。编辑HADOOP_HOME\etc\hadoop\hadoop-env.cmd注意是.cmd文件找到set JAVA_HOME这一行取消注释并将其值设置为你的JDK绝对路径例如set JAVA_HOMEC:\Java\jdk1.8.0_381。这样Hadoop就会使用这里指定的路径无视系统环境变量。方案二确保系统环境变量JAVA_HOME设置的是短路径而不是像Program Files这样的包含空格的路径。如果路径必须有空格需要用引号包裹并在hadoop-env.cmd中同样用引号设置如set JAVA_HOMEC:\Program Files\Java\jdk1.8.0但这可能引入其他解析问题因此首选无空格路径。6.2 DataNode或NodeManager进程自动关闭现象启动时进程起来了但过一会儿DataNode或NodeManager的窗口自动关闭查看HADOOP_HOME\logs目录下的对应日志如hadoop-xxx-datanode-.log可能会看到错误。根因与解决端口冲突Hadoop默认使用多个端口如50010, 50020, 8042等。可能是这些端口被其他程序占用。解决方法是修改hdfs-site.xml和yarn-site.xml中相关的端口配置或者关闭占用端口的程序用netstat -ano | findstr :端口号查找。存储目录权限或磁盘空间不足检查dfs.datanode.data.dir和yarn.nodemanager.local-dirs如果配置了对应的目录确保运行Hadoop的用户有完全的读写权限并且磁盘有足够空间。winutils不兼容这是最可能的原因。再次确认你下载的winutils二进制文件是否与你的Hadoop版本2.10.1严格匹配并且已完整覆盖bin目录下的文件。可以尝试从其他来源重新下载一份。6.3 运行MapReduce作业报错“权限被拒绝”现象运行hadoop jar命令时报错包含 “Permission denied” 或 “无法创建目录”。根因与解决这通常是HDFS文件系统的权限问题。Hadoop模拟了Linux的POSIX文件权限模型。临时解决方案在测试环境可以放宽权限。使用命令hdfs dfs -chmod -R 777 /user/your_username这将给你在HDFS上的个人目录赋予全部读写执行权限。注意在生产环境中这是极不安全的做法仅用于本地学习测试。根本解决理解HDFS的权限体系。你的作业是以当前系统用户身份提交的需要确保该用户在HDFS上有对应目录的读写权。可以通过hdfs dfs -ls -d /user查看目录所属用户和组。6.4 Web界面无法访问localhost:50070/8088现象浏览器无法打开50070或8088端口。根因与解决防火墙阻止Windows防火墙可能阻止了这些端口的入站连接。可以在Windows Defender防火墙中添加入站规则允许50070和8088端口的TCP连接或者仅限测试环境暂时关闭防火墙。进程未成功启动用jps命令检查NameNode和ResourceManager进程是否存在。如果不存在去logs目录下查看对应的.log日志文件根据错误信息排查。绑定地址问题极少数情况下服务可能绑定到了127.0.0.1以外的地址。可以检查core-site.xml中的fs.defaultFS和yarn-site.xml中yarn.resourcemanager.webapp.address等配置确保其主机名部分为localhost或0.0.0.0。7. 日常使用、停止与资源清理当你完成学习或实验后需要正确地停止集群以释放资源并避免数据损坏。7.1 停止Hadoop集群在HADOOP_HOME\sbin目录下按启动的逆序执行停止命令停止YARN运行stop-yarn.cmd。停止HDFS运行stop-dfs.cmd。执行后之前弹出的各个守护进程窗口会依次关闭。再次运行jps命令应该只剩下jps命令本身这个进程。7.2 数据持久化与清理你的HDFS数据即上传的文件、WordCount的结果都物理存储在你配置的dfs.datanode.data.dir目录下。NameNode的元数据存储在dfs.namenode.name.dir目录下。只要你不删除这些目录里的内容下次启动集群后数据依然存在。如果你想彻底重置集群比如想重新练习格式化流程需要停止所有Hadoop进程。删除你配置的Hadoop数据目录如D:\BigData\hadoop_data下的所有子目录。重新执行hdfs namenode -format。7.3 作为开发环境集成这个本地Hadoop环境可以很好地与你的开发工具集成。例如在IntelliJ IDEA或Eclipse中开发MapReduce程序时你可以将作业直接提交到这台本地伪分布式集群上运行方便调试。只需要在代码中配置fs.defaultFS为hdfs://localhost:9000并将mapreduce.framework.name设置为yarn即可。这比使用本地模式LocalJobRunner更能模拟真实分布式环境的行为。整个流程走下来你会发现在Windows上搭建一个可用的Hadoop学习环境核心就是解决“兼容性”和“配置”两大问题。一旦打通它就是一个随时待命、零成本的大数据沙箱。无论是为了通过Hadoop认证考试做准备还是为了快速验证某个数据处理想法这个本地环境都能提供极大的便利。我个人的体会是把配置过程中的每一步、每一个参数都理解清楚其价值远大于仅仅按照教程点击下一步因为这些问题和思路在你未来接触真正的生产集群时会再次相遇。
返回列表