
搞大数据这一行绕不开的第一道坎就是Hadoop环境搭建。不管你是学生做课程设计、刚入职需要跑通离线任务还是要在云主机上验证一个数据方案最终都会回到那几行启动命令和一堆xml配置上。我见过太多人卡在“明明照着教程敲了进程就是起不来”的阶段也见过不少人在伪分布式和集群切换之间被目录权限、clusterID不一致这类问题反复折磨。这篇就把Hadoop环境搭建这件事从头到尾拆开讲清楚覆盖单机伪分布式、集群扩展、Zookeeper整合思路以及Windows下用IDEA对接HDFS开发环境的完整流程适合刚接触Hadoop的初学者也适合准备把学习环境升级成多节点集群的开发者参考。先说清楚一个基本事实Hadoop环境搭建本身没那么玄乎真正容易出事的地方集中在版本匹配、配置参数、目录权限、免密登录这几个点上。只要你能理解每一步配置到底在解决什么问题而不是机械地复制粘贴这套环境一次跑通的概率会非常高。我自己从第一次用虚拟机敲到后来在物理机上搭三节点集群踩过的坑基本都能归到这几类里所以这篇会花不少篇幅讲原理和排查思路而不只是给你一套“能跑就行”的脚本。1. 动手前先想清楚你的Hadoop要装成什么样1.1 三种部署形态别一上来就选错很多人第一次接触Hadoop看到“伪分布式”、“完全分布式”、“单机模式”这几个词就直接懵了。简单说单机模式Local Mode所有进程跑在同一个JVM里不启动HDFS和YARN主要用于跑MR任务的本地调试。这个模式基本不需要安装配置解压Hadoop就能跑。伪分布式Pseudo-Distributed一个节点上同时跑NameNode、DataNode、ResourceManager、NodeManager每个进程是独立的Java进程。这是学习Hadoop最常用的形态也是很多入门教程默认讲的“Hadoop环境搭建”。完全分布式Fully Distributed至少两个以上节点NameNode和ResourceManager在单独节点上DataNode和NodeManager分布在其余节点。这是生产环境或实验集群的选择。我的建议是如果你是第一次搭从伪分布式开始不要直接上集群。原因很简单伪分布式能让你一个个搞清楚每个组件的进程、端口和日志文件这时候出了问题你排查起来范围小、变量少。等你把伪分布式从启动到跑通MR任务都摸熟了再往集群扩展难度会降低很多因为集群本质上就是把伪分布式里的角色拆到不同机器上再多加一个免密登录和主机名解析而已。还有一个容易忽略的点所谓“单机模式”其实不需要真正安装很多教程讲“从零安装hadoop”的时候会把解压之后的默认运行也算作安装成功这会给新手造成误解。我建议你的目标至少定在伪分布式因为只有启动了HDFS和YARN你才能真正体验hdfs dfs命令、上传文件、跑WordCount这一整套流程这也是后续所有大数据技术Hive、Spark、Flink依赖的基础环境。1.2 版本选型JDK和Hadoop怎么搭配才不会翻车版本问题是我见过最多的翻车现场。很多人下载了最新版JDK 17或者JDK 21然后配Hadoop 3.3.x结果启动的时候各种ClassNotFoundException或者NameNode直接起不来。这里先给出一套我实际验证过很多次的稳定组合组件推荐版本说明操作系统Ubuntu 20.04 / 22.04 LTS或CentOS 7.9生产环境最常见网上资料最多遇到问题容易搜到方案JDKOpenJDK 8 或 OpenJDK 11Hadoop 3.3.x官方支持JDK 8和11不要用太高版本Hadoop3.3.6或3.3.53.x系列稳定同时支持HDFS联邦、YARN时间线服务等特性Zookeeper可选3.7.x做HA或整合测试时使用伪分布式单机可以不装为什么很多教程会让你用JDK 8因为Hadoop这个项目太庞大了组件升级节奏慢很多依赖库在高版本JDK下会有兼容性问题。虽然我实测过JDK 11跑Hadoop 3.3.6没问题但如果你是新手建议直接用JDK 8网上随便一搜都是对应教程不用跟编译错误死磕。还有一个特别容易被忽略的版本坑Hadoop发行包里有自带的native本地库用于压缩、CRC32校验等如果你的机器架构是ARM比如苹果M系列或部分云主机某些native操作会走纯Java回退实现功能上没影响但性能会差。这个不用太纠结先保证跑通。1.3 环境准备用户、目录、主机名、SSH免密一次搞定在开始安装之前我强烈建议先把基础环境整理干净否则后面每启动一个进程都会遇到权限问题。我的习惯操作如下创建一个专门用户我用的是hduser不要用root直接跑Hadoop。虽然root也能跑但Hadoop的大多数线上文档和脚本默认配置都假设你用的是普通用户而且在root下跑DataNode经常会有奇怪的目录权限问题。规划统一的软件安装目录比如/opt/module下面再分jdk、hadoop、zookeeper等子目录。改好主机名hostnamectl set-hostname hadoop101之类的并把所有节点IP和主机名的映射写进/etc/hosts。配置SSH免密登录这样你在启动集群的时候不用每台机器输密码也方便后续用脚本统一管理。这里有一条经验很多人在伪分布式阶段会跳过免密登录配置因为单节点确实不需要。但从伪分布式升级到集群的时候免密配置早晚要做不如一开始就配好。而且伪分布式里DataNode和NameNode如果不在同一台机器比如你后面扩容了免密是硬性要求别等到集群起不来了才回头补。2. 核心配置从JDK到HDFS全程实操2.1 JDK安装与环境变量配置首先确认Java已经装上并且版本符合要求。我在Ubuntu上通常直接用apt安装也可以用tar包手动解压到/opt/module/jdk目录。不管是哪种方式最后都要把JAVA_HOME写进环境变量# 编辑 /etc/profile 或者 ~/.bashrc二选一保持一致 export JAVA_HOME/opt/module/jdk export PATH$JAVA_HOME/bin:$PATH source ~/.bashrc java -version很多人在这一步就埋下了一个隐患只在当前终端生效新开的窗口或者通过SSH连接过去环境变量就没有了。所以你要检查一下/etc/profile里是否真的写成功了而不是只在命令行敲一下临时生效。Hadoop的启动脚本会去读JAVA_HOME如果找不到NameNode进程会直接退出日志里会报“JAVA_HOME is not set”之类的问题。如果你用的是Oracle JDK的tar包还会有一个特别注意的点Hadoop脚本在检测JAVA_HOME的时候会尝试执行$JAVA_HOME/bin/java如果你的目录路径里带了空格比如装在带空格的Windows共享目录上就会解析失败。Linux下通常没这个问题但Windows下的开发环境要注意后面第4节写到的路径问题。2.2 Hadoop下载与安装目录约定去官网下载Hadoop 3.3.6的tar.gz包后解压到/opt/module/目录下然后建议建一个软链接方便升级版本时不用改一堆配置tar -zxvf hadoop-3.3.6.tar.gz -C /opt/module/ ln -s /opt/module/hadoop-3.3.6 /opt/module/hadoop为什么用软链接因为很多配置文件里会写绝对路径比如日志目录、PID目录如果你直接改版本号这些路径全部要跟着改。用软链接稳定指向当前版本升级时只需要把新版本解压后替换软链接即可省心很多。Hadoop的目录结构里有几个你马上会用到的地方etc/hadoop/所有配置文件core-site.xml、hdfs-site.xml等sbin/启动脚本start-dfs.sh、start-yarn.shlogs/运行日志排查问题的第一现场bin/hdfs、yarn、mapred等命令行工具我个人的习惯是每次安装完先跑一下hadoop version确认脚本能正常执行再看配置文件。这一步能帮你把PATH和环境变量的问题提前暴露出来而不是等到启动集群的时候才面对一堆报错。2.3 四个核心配置文件逐个拆解伪分布式的核心配置全部集中在etc/hadoop目录下你需要修改的文件主要是core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml以及新版Hadoop里的workers文件3.x版本用这个替代了旧的slaves文件。core-site.xml配置的是Hadoop集群的通用属性最核心的fs.defaultFS决定了HDFS的访问入口configuration property namefs.defaultFS/name valuehdfs://hadoop101:8020/value /property property namehadoop.tmp.dir/name value/opt/module/hadoop/tmp/value /property /configurationfs.defaultFS里的hadoop101要替换成你自己的主机名端口8020是NameNode的RPC通信端口。hadoop.tmp.dir是HDFS元数据和数据块的根目录这里必须要注意这个目录在NameNode格式化的时候会被写入关键的元数据信息如果后续你修改了这个路径一定要重新格式化否则NameNode会起不来。hdfs-site.xml控制的是HDFS的存储行为伪分布式最关键的是把副本数设成1configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///opt/module/hadoop/name/value /property property namedfs.datanode.data.dir/name valuefile:///opt/module/hadoop/data/value /property /configurationdfs.replication这个参数我在这个坑里栽过伪分布式如果按默认3副本配置DataNode只有1个写入文件的时候永远报“Not replicated to 0 nodes”之类的错误很多人会以为是网络问题其实只是副本数设置不合理。生产环境数据量大的时候副本数一般还是3但学习环境必须改成1。yarn-site.xml配置的是YARN的资源管理框架configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuehadoop101/value /property /configuration这里最核心的是aux-servicesMR任务跑在YARN上的时候NodeManager需要依赖这个shuffle服务来做数据混洗。还有个容易被忽视的配置是内存参数如果你的机器内存比较小比如2GYARN默认的nodemanager内存检查可能会把任务杀掉后面常见问题部分会详细说。mapred-site.xml配置MapReduce的运行框架configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration这个配置就把MR任务的运行模式从本地跑切到了YARN模式如果不配或者配置成local你的WordCount任务会在本机直接跑而不是提交到集群行为完全不同。2.4 SSH免密、环境变量与NameNode格式化在启动HDFS之前先把SSH免密配好。即使伪分布式只有一台机器你也需要让自己能通过SSH登录到本机这样start-dfs.sh脚本才能顺利远程执行启动命令ssh-keygen -t rsa ssh-copy-id hadoop101如果ssh-copy-id执行失败可以手动把~/.ssh/id_rsa.pub的内容追加到对应用户的~/.ssh/authorized_keys文件里。注意权限~/.ssh目录建议700authorized_keys文件建议600权限太开放SSH会拒绝使用这个文件。接下来把Hadoop相关环境变量写入 /etc/profileexport HADOOP_HOME/opt/module/hadoop export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop然后是整个搭建过程中最容易操作失误的一步格式化NameNode。hdfs namenode -format格式化操作会向hadoop.tmp.dir指定的目录以及fs.defaultFS对应NameNode的name dir写入初始化的元数据同时生成clusterID。这个clusterID在后面DataNode注册的时候会被校验如果NameNode和DataNode的clusterID不一致DataNode进程会拒绝启动日志里会报版本不匹配的错误。你只需要记住一条铁律不要随随便便格式化NameNode。每次格式化相当于把HDFS清空重来如果数据目录里有之前上传的数据格式化后全部不可恢复。更关键的是如果DataNode的数据目录里还有旧数据格式化NameNode后DataNode会启动失败你得手动把DataNode目录清空。这也是为什么很多教程里都会说“先确保data目录是空的再格式化”。2.5 启动HDFS和YARN并验证进程状态配置全部就绪后就可以启动集群了start-dfs.sh start-yarn.sh如果你配好了mapred-site.xml并且想用历史服务器查看跑过的MR任务情况还可以启动mr-jobhistory-daemon.sh start historyserver启动完成后用jps命令查看进程NameNodeHDFS的元数据节点DataNode存储数据块的实际节点SecondaryNameNode辅助NameNode不是热备只是定期合并edits日志ResourceManagerYARN的资源调度中心NodeManager单机上的任务执行容器管理器jps如果能看到这5个进程说明HDFS和YARN都起来了。这时候不要急着跑任务先用Web UI确认一下状态NameNode Web UIhttp://hadoop101:98703.x版本2.x是50070ResourceManager Web UIhttp://hadoop101:8088然后创建测试目录并上传几个文件验证HDFS读写hdfs dfs -mkdir -p /user/hduser/input hdfs dfs -put /opt/module/hadoop/NOTICE.txt /user/hduser/input/ hdfs dfs -ls /user/hduser/input能正常列出文件说明HDFS读写链路已经通了。之后我建议立刻跑一个最简单的MR示例任务验证整个数据处理流程hadoop jar /opt/module/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/hduser/input /user/hduser/output跑通这个任务你的伪分布式环境基本就可以正式投入使用了。我第一次跑通的时候特别激动回头复盘发现整个过程里最耗时间的其实是排查各种“小问题”比如防火墙没关、端口被占用、/etc/hosts写错这些在后面的常见问题部分我会一一列出来。3. 从单机学习到集群实战扩展与Zookeeper整合思路3.1 单机伪分布式升级为集群需要改什么伪分布式跑通之后很多人会想升级成一个真正的多节点集群比如“hadoop101、hadoop102、hadoop103”三台机器。这个过程并没有想象的那么复杂但需要改动的点比较零散我把关键步骤整理出来每台机器都装好JDK和Hadoop目录保持一致比如统一放在/opt/module/。修改所有机器的/etc/hosts加入全部节点的IP和主机名映射。配置从主节点到所有DataNode节点的SSH免密登录包括主节点自己。在主节点的workers文件里填上所有DataNode的主机名每行一个这决定了启动HDFS时会拉起哪些节点的DataNode。把配置好的core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml分发到所有节点覆盖原文件。最关键的注意点是集群模式下NameNode的format只需要在主节点上执行一次其余DataNode节点不要格式化也不要手动创建NameNode相关目录。因为DataNode启动时会在首次注册时自动生成数据目录结构如果你手动凑巧生成了错误的数据目录或者格式化了反而会造成clusterID混乱。启动集群后不要只盯主节点的进程还要在每台DataNode上分别执行jps。我遇到过一种情况主节点start-dfs.sh执行成功但某台DataNode的进程根本不存在原因是该机器的hostname解析不对或者SSH免密没生效导致脚本无法远程启动。3.2 为什么要把Zookeeper引入Hadoop环境注意看热搜词里有“hadoop和zookeeper整合实战”这说明很多人在搭完基础Hadoop之后紧接着的需求就是高可用HA。Hadoop集群里NameNode是单点如果它挂了整个HDFS就不可用了。要解决这个问题Hadoop从2.x版本开始引入了NameNode HA而HA的实现高度依赖Zookeeper来做自动故障切换Automatic Failover。Zookeeper在这里扮演的角色有点像“协调中枢”的角色它维护NameNode Active/Standby的选举状态当Active节点宕机时通过ZKFCZookeeper Failover Controller及时感知并完成切换。如果你只是想在一个学习环境里体验整合流程可以在一台机器上加装Zookeeper然后在Hadoop的配置文件里开启自动故障转移。先装Zookeeper配置其实很简单。解压后复制一份zoo_sample.cfg为zoo.cfg关键配置是tickTime2000 dataDir/opt/module/zookeeper/data clientPort2181 server.1hadoop101:2888:3888 server.2hadoop102:2888:3888 server.3hadoop103:2888:3888每台机器的data目录里还要创建一个myid文件内容分别是1、2、3对应上面server列表的编号。然后逐台启动zkServer.sh start验证状态用zkServer.sh status能正常显示leader或follower角色就说明Zookeeper集群本身没有问题了。3.3 配置Hadoop NameNode HA的关键步骤Hadoop HA需要在原来的配置基础上做大量改动最核心的是让NameNode的元数据存到JournalNode集群同时引入ZKFC来做自动切换。下面是我在实战中验证过的配置要点在hdfs-site.xml里设置nameservice逻辑名称比如mycluster并把两个NameNode以namenode.1和namenode.2区分开。配置journalnode的地址列表至少3个节点NameNode会把edits日志发给这些节点。开启自动故障转移dfs.ha.automatic-failover.enabled设为true这个开关会激活ZKFC。在core-site.xml里注册Zookeeper地址ha.zookeeper.quorum配置成所有Zookeeper节点的clientPort。配置完成后启动顺序非常重要先启动Zookeeper再启动JournalNodehdfs --daemon start journalnode然后格式化Zookeeper状态hdfs zkfc -formatZK最后再启动整体集群。验证HA是否生效的方法很多我常用的一种比较粗暴也直观直接kill掉Active NameNode进程等十几秒然后用hdfs haadmin -getServiceState namenode2看是否变成了active。但我要提醒一点这套流程在伪分布式单机环境里配置起来比较绕因为JournalNode、ZKFC、两个NameNode都要挤在一台机器上如果你只是为了学习Hadoop基础功能不需要上HA等真正有多台机器的时候再按文档来做成功率会高很多。4. 与开发环境对接Windows下用IDEA访问HDFS4.1 Windows下Hadoop开发环境的核心难点很多人的Hadoop集群跑在Linux上但日常写代码用Windows这就带来了一个经典问题Windows本地没有Hadoop环境IDEA里写好的HDFS客户端代码怎么连到远程集群特别是“windows下使用idea搭建hadoop开发环境”这个热搜词说明这是初学者的一个集中痛点。先说清楚一个非常重要的概念如果你只是写客户端代码访问远程HDFS你的Windows机器并不需要完整安装Hadoop只需要引入Maven依赖hadoop-client就行。但你本地跑Java代码时Hadoop的NativeIO等底层库会尝试加载winutils.exe等Windows本地工具没有这些动态库代码运行时大概率会报“Failed to locate the winutils binary in the Hadoop distribution”之类的错误。我的解决方案是用Hadoop官方源码在Windows下编译生成一个winutils.exe和hadoop.dll然后放到一个本地目录配置好HADOOP_HOME环境变量指向这个目录。但说实话这个过程对新手比较痛苦编译环境要求高、耗时长而且网上流传的编译版本跟你的Hadoop版本经常对不上。一个更省事的替代方案是直接下载与集群Hadoop版本匹配的第三方winutils包放到自定义目录然后设置系统环境变量HADOOP_HOME指向winutils所在目录目录结构最好模拟成bin/winutils.exe的形式。把该目录的bin路径加入PATH或者使用Java代码启动时通过System.setProperty(“hadoop.home.dir”, “...”)来指定。我实战下来后者更靠谱。因为如果你把HADOOP_HOME全局指向了winutils目录而IDEA里又加载了Hadoop源码依赖可能触发不必要的本地库校验。4.2 Maven依赖与HDFS客户端代码示例创建一个标准的Maven工程在pom.xml里添加如下依赖dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-client/artifactId version3.3.6/version /dependency如果只是要连HDFShadoop-client是够用的它会帮你传入HDFS、Common、YARN常用API。然后写一个最基础的客户端代码连接远程HDFS并列出目录import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class HdfsClientDemo { public static void main(String[] args) throws Exception { Configuration conf new Configuration(); conf.set(fs.defaultFS, hdfs://hadoop101:8020); FileSystem fs FileSystem.get(URI.create(hdfs://hadoop101:8020), conf, hduser); FileStatus[] statuses fs.listStatus(new Path(/user/hduser/input)); for (FileStatus status : statuses) { System.out.println(status.getPath().getName()); } fs.close(); } }代码里指定的hadoop101必须在Windows的hosts文件里做好映射否则域名解析失败。FileSystem.get的第三个参数是用户名这直接影响你在HDFS里的权限身份。如果你的代码在Linux集群上是以hduser身份跑的在Windows本地调试时默认会取Windows当前用户大概率不是你HDFS里的那个用户导致Permission denied。这时候有两个方案在本机环境变量里设置HADOOP_USER_NAMEhduser让Hadoop客户端统一使用这个用户身份。在代码里显式传第三个参数。我推荐第二种因为环境变量全局设置会影响所有HDFS相关操作有时候反而不灵活。4.3 本地调试HDFS的权限与Hosts常见坑Windows下访问远程HDFS还有一个高频坑发生在防火墙和集群配置权限上。很多时候你本地代码报“Connection refused”或“OperationCategory READ is not supported in state standby”未必是网络不通而是访问的端口不对或连到了standby节点上。HDFS的RPC端口是8020fs.defaultFS里配置的那个Web UI是9870这两个端口都要在Linux集群防火墙上放行。同时Windows下的hosts映射里的主机名必须和Linux集群里hadoop101一致否则代码会尝试解析错误IP。权限问题的常见报错是这样的org.apache.hadoop.security.AccessControlException: Permission denied: userAdministrator, accessREAD, inode/user/hduser/input:hduser:supergroup:drwxr-xr-x如果你只是本地测试最直接的临时办法是在HDFS上放宽目录权限hdfs dfs -chmod -R 777 /user/hduser/input但生产环境不建议这么做我更推荐用HADOOP_USER_NAME环境变量统一身份。我在本地调试时还喜欢额外加一个System.setProperty(HADOOP_USER_NAME, hduser)放在代码静态块里这样即使换了机器也能用。5. 常见问题与排查技巧实录5.1 启动阶段的经典报错对照表下面这张表是我从自己以及帮别人排查过程中整理的高频问题大部分情况下按照对应思路去查就能解决报错现象可能原因排查/解决思路jps里只有Jps和其他进程没有NameNode格式化未执行或JAVA_HOME不对查看logs/hadoop-hduser-namenode-*.log确认报错内容后再动手DataNode进程反复退出clusterID不一致或数据目录权限错误检查logs里datanode日志清空data目录后重新初始化访问9870端口不通防火墙没放行或NameNode没起先curl localhost:9870再检查systemctl status firewalld上传文件报“Not replicated to 0 nodes”dfs.replication大于实际DataNode数量伪分布式设dfs.replication1集群模式设为2或3跑MR任务时Container启动失败或卡在ACCEPTEDYARN内存参数不合适调整yarn.nodemanager.resource.memory-mb和yarn.scheduler.maximum-allocation-mb本地IDEA连接集群报Connection refusedhosts映射错误或端口不通先在Windows里ping hadoop101再telnet hadoop101 8020ssh远程启动失败免密登录没配好或known_hosts问题手动ssh hadoop101验证一次确认无需密码5.2 日志才是最好的排查老师我必须强调一个习惯遇到Hadoop相关问题第一时间去logs目录看日志而不是凭感觉改配置或者重启。Hadoop的日志文件命名规律很清晰比如hadoop-hduser-namenode-hadoop101.log就记录NameNode的详细运行日志。第一次启动失败时里面往往已经把根因写得清清楚楚只是很多人一看到Java堆栈就慌直接拉到最下面反而忽略了关键的Caused by那行。我通常的建议是tail -100 /opt/module/hadoop/logs/hadoop-hduser-namenode-hadoop101.log如果你看到的是类似“Directory ... is in an inconsistent state”的信息说明目录残留了旧数据如果看到“Cannot lock storage”说明权限不对或者另一个进程还在占用如果看到“UnknownHostException”协调网络就是hosts的问题。这些定位思路比盲目重启有效得多。5.3 运维层面容易忽略的三个细节第一是防火墙问题。很多人在本地学习时不开防火墙一切正常部署到云主机或公司服务器时防火墙默认开着结果9870、8088、8020全不通。我习惯在配置阶段先明确放行端口而不是直接关防火墙。至少在三个端口上放行8020HDFS RPC、9870NameNode Web UI、8088ResourceManager Web UI。第二是内存配置。伪分布式在一台2G内存的机器上跑得很吃力因为HDFS、YARN、MR任务总共可能需要好几个G的内存。我的经验是至少给NodeManager预留1G以上并调整YARN内存参数。如果发现任务一直处于ACCEPTED状态而不运行把yarn.nodemanager.resource.memory-mb调小比如4096左右容器就不会因为默认8G上限而申请不到资源。另外建议关闭swap或者至少提示警告否则内存紧张时Hadoop会非常慢。第三是HDFS目录设计。很多新手会把namenode的name dir和datanode的data dir都留在默认的/tmp目录下。Linux重启后/tmp可能被清理你的HDFS元数据就没了下次启动NameNode直接报错。我吃过这个大亏现在我都会把这两个目录明确指向/opt/module/hadoop/name和/opt/module/hadoop/data并在hdfs-site.xml里显式配置。5.4 伪分布式跑通后还能扩展哪些内容如果你已经完成了“Hadoop环境搭建”的全部流程接下来可以尝试加装Hive或者Spark把它们跑在已有的YARN资源上。我自己就是从Hadoop伪分布式开始逐步加入Hive做SQL化查询再加入Spark做内存计算这样一条链路下来对大数据组件的理解会比单纯看文档深得多。另外一个值得做的扩展是把Hadoop和Zookeeper整合起来至少在单机或者多节点上把HA流程走一遍。“hadoop和zookeeper整合实战”搜索热度一直不低这个方向确实值得投入。我整理一个要点HA整合的本质是解决NameNode单点问题但比配置更重要的是理解ZKFC、JournalNode、NameNode三者之间的关系。如果你能清楚地说出“ZKFC负责监听NameNode状态并触发切换JournalNode负责存储共享的edits日志NameNode通过它们实现元数据同步”那这项技能就算真正掌握了。根据我个人习惯每次搭建完一套Hadoop环境后我都会把所有的配置文件备份一份到独立的目录并写一个简单的部署说明文档记录每台机器的主机名、IP、角色和关键参数。这样过了三个月再回来维护或者同事接手能省掉大量“这配置是谁改的”式的困惑。配置即文档这个习惯在运维大数据环境时特别重要推荐你从第一次搭建就开始养成。