尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Hadoop伪分布式安装配置全流程详解与排错指南

Hadoop伪分布式安装配置全流程详解与排错指南 1. 从零到一为什么你的Hadoop安装总是不对劲搞大数据Hadoop是绕不开的第一座山。但说实话我见过太多人包括一些工作两三年的朋友在安装配置Hadoop这一步就栽了跟头。网上的教程五花八门从单机伪分布式到多节点集群命令一复制一粘贴表面上看服务是跑起来了可一到跑任务就各种报错什么Connection refused、Permission denied、DataNode启动不了问题层出不穷。最后只能推倒重来浪费大量时间。问题的根源往往不在于Hadoop本身有多复杂而在于我们是否真正理解了安装配置过程中的每一个步骤背后的“为什么”。安装Hadoop绝不仅仅是把几个压缩包解压、改几个配置文件那么简单。它本质上是在你的服务器无论是物理机、虚拟机还是云主机上搭建一个分布式文件系统HDFS和一个分布式计算框架MapReduce/YARN的运行环境。这个环境涉及到操作系统用户、文件权限、网络通信、端口开放、服务启动顺序等一系列环环相扣的细节。今天我就以一个踩过无数坑的“过来人”身份带你从头到尾、由浅入深地走一遍Hadoop的安装与配置流程。我们不追求最快但求最稳、最清晰。我会重点解释每个配置项的含义每个操作的目的以及那些教程里通常不会写但实际工作中一定会遇到的“坑”。我们的目标很明确搭建一个可以稳定运行、方便后续学习和开发的Hadoop环境。为了方便演示和绝大多数学习场景我们将以单机伪分布式模式作为切入点这是理解Hadoop架构和配置的最佳起点。在开始之前我们需要明确几个前提这也是很多新手容易忽略的起点错误操作系统强烈推荐使用LinuxUbuntu或CentOS均可。本文以Ubuntu 20.04 LTS为例。在生产环境CentOS/RHEL系列更为常见但原理完全相通。Java环境Hadoop是Java写的所以必须先安装JDK。版本选择很重要Hadoop 3.x通常需要JDK 8或更高版本。我们将安装OpenJDK 8。用户规划绝对不要使用root用户来安装和运行Hadoop。最佳实践是创建一个专门的系统用户例如hadoop来管理所有相关进程和文件这关乎系统安全和服务隔离。网络与主机名确保机器的主机名可以正确解析能ping通自己。在伪分布式模式下我们通常使用localhost但配置一个清晰的主机名如hadoop-master是更好的习惯为将来扩展成集群做准备。如果你准备好了我们就从最基础的环境准备开始。2. 基石铺设系统环境与JDK的精细配置万事开头难而一个干净、规范的基础环境是成功的一半。这一步做扎实了后面能避免80%的诡异问题。2.1 创建专属用户与权限隔离首先以root身份或使用sudo创建一个名为hadoop的用户组和用户。sudo addgroup hadoop sudo adduser --ingroup hadoop hadoop系统会提示你设置hadoop用户的密码和其他信息按需填写即可。创建完成后我们需要为这个用户赋予一些必要的sudo权限以便后续安装软件和修改系统配置。使用visudo命令编辑sudoers文件是一种安全的方式sudo visudo在文件末尾添加一行hadoop ALL(ALL) NOPASSWD: ALL这一行的意思是hadoop用户可以在任何主机上以任何用户的身份执行所有命令且无需输入密码。注意这仅在学习和测试环境中使用。在生产环境中应严格限制权限。接下来切换到我们新创建的hadoop用户后续所有操作都将在此用户下进行su - hadoop你会发现命令行提示符前的用户名已经变成了hadoop。2.2 安装并锚定Java环境JDKHadoop对JDK的依赖是强绑定版本不匹配或环境变量设置错误是导致启动失败的常见原因。更新软件包列表并安装OpenJDK 8sudo apt update sudo apt install openjdk-8-jdk -y安装完成后验证安装java -version如果看到类似openjdk version 1.8.0_392的输出说明JDK安装成功。关键步骤配置JAVA_HOME环境变量。这是重中之重Hadoop的启动脚本会主动寻找JAVA_HOME变量来定位Java安装路径。首先找到JDK的确切安装路径update-alternatives --config java命令会输出Java可执行文件的路径例如/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java。我们需要的是其上级的上级目录即/usr/lib/jvm/java-8-openjdk-amd64。这个路径就是你的JAVA_HOME。接下来编辑hadoop用户的shell配置文件。如果你用的是bash默认则编辑~/.bashrcnano ~/.bashrc在文件末尾添加以下三行export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar请务必将/usr/lib/jvm/java-8-openjdk-amd64替换为你自己查到的实际路径。保存退出后使配置立即生效source ~/.bashrc最后进行验证echo $JAVA_HOME应该正确输出你设置的路径。再执行java -version确认无误。注意很多教程会教你修改/etc/profile或/etc/environment来设置全局环境变量。但对于Hadoop服务我更推荐在运行Hadoop的用户本例是hadoop的私有配置文件~/.bashrc中设置。这样做的好处是环境变量作用域清晰只影响该用户避免与其他用户或系统服务产生冲突。2.3 配置SSH免密登录分布式协作的信任基石即使是单机伪分布式模式Hadoop的各个守护进程如NameNode和DataNode也需要通过SSH协议来启动和管理。配置本地到本机的SSH免密登录是为了让hadoop用户能无密码通过SSH连接到localhost自己。首先确保安装了SSH客户端和服务器sudo apt install openssh-client openssh-server -y然后生成SSH密钥对ssh-keygen -t rsa -P -f ~/.ssh/id_rsa-t rsa指定密钥类型为RSA。-P 设置空密码实现免密。-f ~/.ssh/id_rsa指定密钥文件存放路径。生成的公钥在~/.ssh/id_rsa.pub私钥在~/.ssh/id_rsa。接下来将公钥追加到授权密钥文件中以允许自己访问自己cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys修改authorized_keys文件的权限这是SSH协议的一个安全要求chmod 600 ~/.ssh/authorized_keys现在尝试用SSH连接本地主机ssh localhost如果配置成功你应该能直接登录而不会被要求输入密码。首次连接可能会提示是否信任主机指纹输入yes即可。登录后执行exit命令退出。踩坑记录权限问题~/.ssh目录的权限应为700authorized_keys文件的权限应为600。如果权限过大如755或777SSH出于安全考虑会拒绝使用密钥登录导致Hadoop启动时失败。务必用ls -la ~/.ssh检查一下。至此一个坚实、干净的基础环境已经搭建完毕。我们有了专属用户、正确的Java环境以及建立好的SSH信任关系。接下来主角Hadoop终于要登场了。3. Hadoop本体部署版本选择、安装与核心配置解剖基础打牢后我们就可以开始安装Hadoop本身了。这个过程就像给新房子接上水电和网络每一根管线都要接到正确的位置。3.1 获取与解压稳定版优于最新版访问 Apache Hadoop 官方发布页面 。对于学习和测试我推荐选择一个稳定的3.x版本比如hadoop-3.3.6。通常下载binary版本即可即编译好的可直接运行的版本。我们使用wget在终端中直接下载并解压到合适目录。通常我会将其放在/opt或用户家目录下。这里我们选择放到hadoop用户的家目录下方便管理cd ~ wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz tar -xzvf hadoop-3.3.6.tar.gz解压后会得到一个hadoop-3.3.6目录。为了后续配置方便我们可以创建一个软链接或者直接重命名mv hadoop-3.3.6 hadoop现在~/hadoop就是我们的Hadoop安装根目录了。3.2 环境变量配置让系统认识Hadoop和配置JAVA_HOME一样我们需要将Hadoop的可执行文件路径加入到系统的PATH中并设置HADOOP_HOME变量。再次编辑~/.bashrc文件nano ~/.bashrc在之前添加的Java环境变量后面继续追加以下内容export HADOOP_HOME/home/hadoop/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop export HADOOP_MAPRED_HOME$HADOOP_HOME export HADOOP_COMMON_HOME$HADOOP_HOME export HADOOP_HDFS_HOME$HADOOP_HOME export YARN_HOME$HADOOP_HOMEHADOOP_HOME指向Hadoop的安装根目录。PATH添加bin和sbin目录这样我们就可以在任意位置直接运行hdfs、yarn、start-dfs.sh等命令。HADOOP_CONF_DIR指定配置文件目录这是一个非常重要的变量Hadoop脚本会从这里读取配置。其他*_HOME变量为了兼容一些老的脚本或应用而设置通常都指向$HADOOP_HOME。保存并退出然后使配置生效source ~/.bashrc现在可以测试一下Hadoop命令是否可用hadoop version如果成功输出Hadoop的版本信息如Hadoop 3.3.6恭喜你Hadoop的基本安装已经成功。3.3 核心配置文件详解Hadoop的大脑Hadoop的所有行为都由配置文件控制它们位于$HADOOP_HOME/etc/hadoop/目录下。伪分布式模式需要修改以下四个核心文件。在修改前强烈建议先备份原文件。1.hadoop-env.shHadoop运行环境变量这个文件主要设置Hadoop守护进程JVM运行时所需的环境变量。我们最需要关注的是JAVA_HOME。cd $HADOOP_HOME/etc/hadoop nano hadoop-env.sh找到export JAVA_HOME这一行通常在文件靠前位置取消注释并将其值设置为我们之前确定的JDK路径export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64注意这里必须使用绝对路径。虽然我们在~/.bashrc里设置了但Hadoop的守护进程是在独立的Shell环境中启动的不会读取用户的bashrc所以必须在这里显式指定。2.core-site.xml核心全局配置这个文件定义了Hadoop最基础的属性比如文件系统FS的默认名称即HDFS的访问地址。nano core-site.xml在configuration标签内添加以下内容configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/home/hadoop/hadoop-data/tmp/value /property /configurationfs.defaultFS这是最重要的配置之一。它指定了默认的文件系统URI。hdfs://localhost:9000表示HDFS运行在本机的9000端口。客户端包括Hadoop命令和其他工具将通过这个URI来访问HDFS。hadoop.tmp.dirHadoop临时文件目录。Hadoop的许多组件如NameNode、DataNode会使用这个目录存放临时数据。务必将其设置到一个有足够空间且非临时性的位置不要使用/tmp因为系统重启可能会清空它。3.hdfs-site.xmlHDFS分布式文件系统配置这个文件专门配置HDFS相关的参数比如数据块副本数伪分布式只能是1、NameNode和DataNode的数据存储路径。nano hdfs-site.xml添加以下配置configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///home/hadoop/hadoop-data/namenode/value /property property namedfs.datanode.data.dir/name valuefile:///home/hadoop/hadoop-data/datanode/value /property /configurationdfs.replication数据块副本数量。在真正的分布式集群中通常设置为3一份数据存三份保证高可用。在单机伪分布式下只能设置为1。dfs.namenode.name.dirNameNode持久化存储命名空间镜像fsimage和编辑日志edits的本地目录。这是HDFS的“元数据”仓库极其重要必须确保目录存在且该用户有读写权限。dfs.datanode.data.dirDataNode存储实际数据块的本地目录。这是HDFS的“数据”仓库。4.mapred-site.xml与yarn-site.xml计算框架配置伪分布式模式下MapReduce作业可以运行在YARN框架上。首先配置mapred-site.xml如果目录下没有这个文件通常有mapred-site.xml.template模板复制一份即可cp mapred-site.xml.template mapred-site.xml nano mapred-site.xml添加configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration这个配置告诉MapReduce使用YARN作为其资源管理和作业调度框架。然后配置yarn-site.xmlnano yarn-site.xml添加configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/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-servicesNodeManager的辅助服务。mapreduce_shuffle是MapReduce作业运行所必需的Shuffle服务。yarn.nodemanager.env-whitelist指定从NodeManager容器中继承的环境变量白名单。确保容器内能获取到必要的Hadoop环境变量。至此所有核心配置文件修改完毕。请再次检查所有配置的路径如JAVA_HOME、hadoop.tmp.dir、dfs.namenode.name.dir是否正确无误尤其是路径中的用户名hadoop是否与你实际创建的用户名一致。一个字符的错误都可能导致后续启动失败。4. 首次启动、验证与排错实战配置完成后最激动人心也最容易出错的环节来了——首次启动。这个过程就像给一台复杂的机器通电我们需要按顺序启动各个部件并仔细观察日志。4.1 格式化HDFS初始化“硬盘”在首次启动HDFS之前必须格式化NameNode。这个操作会清空dfs.namenode.name.dir目录创建全新的、空的文件系统元数据。注意格式化操作是一次性的仅在第一次启动前执行。如果HDFS中已有数据格式化将导致所有数据丢失执行格式化命令hdfs namenode -format你会看到大量输出信息。请仔细阅读寻找关键的成功提示通常包含“successfully formatted”或“Storage directory ... has been successfully formatted”字样。如果看到“Exiting with status 0”通常也表示成功。重要警告如果启动失败需要重新格式化务必先手动删除之前配置的hadoop-data目录本例中是/home/hadoop/hadoop-data下的所有内容特别是namenode和datanode子目录然后再执行格式化命令。否则可能因残留的集群ID不一致导致DataNode无法注册到NameNode。4.2 按顺序启动HDFS守护进程Hadoop的启动脚本位于$HADOOP_HOME/sbin/目录下。我们先启动HDFS。启动NameNodestart-dfs.sh这个脚本会依次启动NameNode、DataNode和SecondaryNameNode如果配置了。执行后它会尝试通过SSH连接到localhost来启动这些进程。如果之前SSH免密登录配置正确你应该能看到类似这样的输出Starting namenodes on [localhost] localhost: starting namenode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-namenode-xxx.out localhost: starting datanode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-datanode-xxx.out Starting secondary namenodes [0.0.0.0] 0.0.0.0: starting secondarynamenode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-secondarynamenode-xxx.out验证进程是否启动使用jps命令Java Virtual Machine Process Status Tool查看当前用户下的Java进程jps如果一切正常你应该能看到至少包含以下三个进程XXXXX NameNode XXXXX DataNode XXXXX SecondaryNameNode XXXXX JpsJps是jps命令本身的进程可以忽略。看到NameNode和DataNode就说明HDFS启动成功了。4.3 启动YARN资源管理器接下来启动YARN框架以便运行MapReduce作业。start-yarn.sh这个脚本会启动ResourceManager和NodeManager。再次使用jps命令查看jps现在进程列表应该更丰富了XXXXX NameNode XXXXX DataNode XXXXX SecondaryNameNode XXXXX ResourceManager XXXXX NodeManager XXXXX Jps看到ResourceManager和NodeManager说明YARN也启动成功。4.4 通过Web UI与命令行双重验证Hadoop提供了非常友好的Web管理界面这是验证服务是否健康运行的最直观方式。HDFS NameNode Web UI打开浏览器访问http://你的服务器IP:9870。如果你在本地虚拟机可以直接访问http://localhost:9870。你应该能看到一个Overview页面显示集群的概况如“Live Nodes”为1说明有一个活动的DataNode。你还可以通过Utilities-Browse the file system来浏览HDFS文件系统目前是空的。YARN ResourceManager Web UI访问http://你的服务器IP:8088。这里展示了YARN集群的资源使用情况、运行的应用程序列表等。除了Web UI我们再用Hadoop命令行工具做一个简单的端到端测试这能验证整个读写链路是否通畅。1. 在HDFS上创建用户目录HDFS类似于一个独立的文件系统我们需要先创建一个目录比如以当前用户名命名的目录。hdfs dfs -mkdir -p /user/hadoophdfs dfs是HDFS文件系统的shell命令前缀-mkdir创建目录-p表示如果父目录不存在则一并创建。2. 从本地文件系统上传一个文件到HDFS首先在本地创建一个测试文件。echo Hello, Hadoop! This is a test file. ~/test.txt然后将其上传到HDFS的/user/hadoop/input目录下。hdfs dfs -mkdir /user/hadoop/input hdfs dfs -put ~/test.txt /user/hadoop/input/3. 查看HDFS上的文件hdfs dfs -ls /user/hadoop/input应该能看到刚上传的test.txt文件。4. 查看文件内容hdfs dfs -cat /user/hadoop/input/test.txt应该能输出“Hello, Hadoop! This is a test file.”。5. 从HDFS下载文件到本地hdfs dfs -get /user/hadoop/input/test.txt ~/test_download.txt cat ~/test_download.txt如果本地文件内容与HDFS上的一致那么恭喜你一个完整的Hadoop伪分布式环境已经成功搭建并验证通过4.5 常见启动失败问题与排查思路即使按照步骤操作第一次启动也难免遇到问题。别慌Hadoop的日志系统非常详细。绝大多数问题都能在日志中找到答案。1. 进程启动后立刻退出jps看不到对应进程。这是最典型的问题。首要排查点查看日志Hadoop的日志默认存放在$HADOOP_HOME/logs/目录下以hadoop-用户名-守护进程名-主机名.log的格式命名。例如NameNode的日志可能是hadoop-hadoop-namenode-ubuntu.log。# 查看NameNode的最新日志 tail -f $HADOOP_HOME/logs/hadoop-hadoop-namenode-*.log # 查看DataNode的最新日志 tail -f $HADOOP_HOME/logs/hadoop-hadoop-datanode-*.log使用tail -f可以实时滚动查看日志输出。启动脚本时如果看到进程启动失败立刻去查看对应的日志文件末尾错误信息通常非常明确。常见错误1JAVA_HOME is not set现象日志中明确报错找不到JAVA_HOME。原因hadoop-env.sh文件中的export JAVA_HOME没有正确配置或者配置的路径不存在。解决检查hadoop-env.sh中的JAVA_HOME是否为绝对路径并用ls命令确认该路径存在。常见错误2Permission denied(SSH相关)现象运行start-dfs.sh时提示需要输入密码或者直接失败。原因SSH免密登录配置失败。可能是~/.ssh/authorized_keys文件权限不对或者密钥生成、添加步骤有误。解决确认已切换到hadoop用户执行所有操作。执行ssh localhost看是否能无密码登录。如果不能按2.3节重新配置。检查权限chmod 700 ~/.ssh和chmod 600 ~/.ssh/authorized_keys。常见错误3Incompatible clusterIDs或Datanode denied communication现象DataNode启动失败日志显示与NameNode的集群ID不兼容。原因这是最令人头疼的问题之一。通常是因为多次执行hdfs namenode -format但旧的DataNode存储目录dfs.datanode.data.dir没有被清理导致新旧集群ID不一致。解决彻底停止所有Hadoop进程(stop-dfs.sh和stop-yarn.sh)然后手动删除你在hdfs-site.xml中配置的dfs.namenode.name.dir和dfs.datanode.data.dir目录下的所有内容本例中是/home/hadoop/hadoop-data下的所有文件夹。最后重新执行格式化 (hdfs namenode -format) 和启动。常见错误4端口被占用现象NameNode或DataNode启动失败日志显示BindException: Address already in use。原因Hadoop需要的端口如9000, 9870, 8088等被其他程序占用。可能是你之前启动过Hadoop没有正确停止或者其他服务占用了。解决使用netstat -tlnp | grep 端口号查找占用端口的进程。用jps确认旧的Hadoop进程是否还在用stop-all.sh或分别执行stop-dfs.sh和stop-yarn.sh来停止。如果确认不是自己的进程可以考虑更换端口修改配置文件或者停止占用端口的无关服务。2. Web UI无法访问。检查防火墙如果是云服务器或虚拟机确保安全组或防火墙规则放行了相关端口9870, 8088, 9864等。检查绑定地址Hadoop默认将Web UI绑定到0.0.0.0所有接口。如果绑定到了127.0.0.1则只能从本机访问。相关配置可以在etc/hadoop下的hdfs-site.xml(dfs.namenode.http-address) 和yarn-site.xml(yarn.resourcemanager.webapp.address) 中修改。检查进程是否真的在运行再次用jps确认。当你能顺利通过Web UI查看集群状态并能用命令行完成HDFS文件的上传下载操作时你的Hadoop伪分布式环境就已经完全就绪可以开始进行MapReduce编程、Hive安装等更深入的探索了。记住遇到问题先看日志日志是定位问题最直接的线索。
返回列表