ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从零搭建Hadoop 3.3.6集群:超详细步骤与核心配置解析

从零搭建Hadoop 3.3.6集群:超详细步骤与核心配置解析 1. 项目概述与核心价值最近几年大数据这个词的热度虽然有所回落但数据驱动的决策和分析已经渗透到各行各业成为基础设施的一部分。无论是电商平台的推荐系统、金融领域的风控模型还是物联网设备的日志分析背后往往都离不开一个稳定、可扩展的数据处理平台。而Hadoop作为大数据生态的基石其核心的分布式存储HDFS和分布式计算MapReduce/YARN思想至今仍是许多企业数据仓库和数据处理流水线的首选方案。很多人觉得现在云服务发达直接购买EMR、Dataproc这类托管服务就行了为什么还要自己动手搭集群我的体会是亲手从零搭建一个Hadoop集群就像学开车不能只学自动挡一样。这个过程能让你彻底搞明白各个组件NameNode, DataNode, ResourceManager, NodeManager之间是怎么通信的配置文件里每一个参数到底影响了什么以及当集群出问题时应该从哪个环节开始排查。这对于后续的运维、性能调优乃至架构设计都是无可替代的经验。网上教程很多但要么过于简略跳过了关键坑点要么环境差异太大导致无法复现。我这次分享的是我在多次生产环境和实验环境搭建后总结出的一套全面且超详细的流程目标是让你跟着做一遍就能得到一个真正可用的、理解其运作原理的Hadoop集群。2. 前期规划与系统准备搭建一个集群最忌讳的就是拿到机器就开始敲命令。前期的规划直接决定了后续的稳定性和可维护性。我们需要在纸上或文档里先明确几件事。2.1 集群架构设计一个典型的Hadoop集群主要由两类节点组成管理节点Master Nodes和工作节点Worker Nodes。对于学习和中小规模场景我推荐以下最小化架构主节点 (Master Node-1):承担核心管理职责。建议配置稍高如4核8G内存。它上面将运行NameNode (NN):HDFS的“目录管理器”负责管理文件系统的命名空间目录树结构和客户端对文件的访问。它是单点至关重要。ResourceManager (RM):YARN的“资源调度器”负责整个集群的资源CPU、内存管理和分配。备用主节点/从节点 (Master/Worker Node-2):在伪分布式或小集群中它可以同时作为备用管理节点和工作者。建议配置与主节点一致或稍低。它上面将运行SecondaryNameNode (SNN):注意它不是NameNode的热备它的主要工作是定期合并NameNode的编辑日志Edits Log到镜像文件FsImage减少NameNode启动时间并在NameNode失效时提供元数据备份。DataNode (DN):HDFS的数据存储单元真正存放数据块的地方。NodeManager (NM):YARN在每个节点上的“代理”负责启动和管理容器Container来执行具体的计算任务。工作节点 (Worker Node-3, Node-4...):纯工作节点配置可侧重于磁盘和内存。运行DataNode和NodeManager。对于本次详细搭建我们将使用3台虚拟机来模拟一个具有高可用雏形的集群1台主节点Master2台工作节点Slave1, Slave2。这样既能理解分布式协作又不会因机器过多而复杂化。2.2 系统与环境要求操作系统选择CentOS 7.x 或 Ubuntu 20.04 LTS等稳定的Linux发行版。我习惯用CentOS 7.9社区资料丰富。确保系统干净最好是最小化安装。机器配置Master:建议2核CPU4GB内存20GB磁盘。Slave:建议1-2核CPU2-4GB内存磁盘尽可能大如30GB因为DataNode存数据。软件版本Java:Hadoop是Java写的必须安装JDK。Hadoop 3.x 需要 JDK 8 或更高版本。我们选择JDK 8u381这是一个长期支持的稳定版本。Hadoop:我们选择Hadoop 3.3.6这是目前截至我知识截止日期的稳定版本。避免使用过新的版本以免遇到未知Bug。网络规划固定IP:为三台虚拟机设置静态IP地址例如Master: 192.168.10.10,Slave1: 192.168.10.11,Slave2: 192.168.10.12。主机名映射:在每台机器的/etc/hosts文件中添加所有节点的IP和主机名映射。这是集群内部通信的基础。防火墙与SELinux:在实验环境可以先关闭防火墙和SELinux以排除网络干扰。生产环境则需要精细配置规则。# 关闭防火墙 (CentOS 7) systemctl stop firewalld systemctl disable firewalld # 关闭SELinux (需重启生效或临时setenforce 0) sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config # 建议重启 reboot2.3 基础环境搭建实操假设你现在有三台刚安装好的CentOS 7虚拟机主机名分别为master, slave1, slave2。第一步配置静态IP和主机名每台机器编辑网络配置文件CentOS 7是/etc/sysconfig/network-scripts/ifcfg-ens33Ubuntu是/etc/netplan/*.yaml设置静态IP、网关、DNS。然后修改/etc/hostname文件为永久主机名如master。第二步配置主机映射每台机器编辑/etc/hosts加入以下内容192.168.10.10 master 192.168.10.11 slave1 192.168.10.12 slave2完成后互相ping一下主机名如ping slave1确保能解析并通迅。第三步创建专用用户每台机器不建议直接使用root运行Hadoop。我们创建一个hadoop用户。useradd hadoop passwd hadoop # 设置密码例如 hadoop为了方便我们将hadoop用户加入sudoers并配置SSH免密登录。第四步配置SSH免密登录关键步骤集群管理需要主节点能无密码登录到所有节点包括自己。在master节点上操作su - hadoop # 切换到hadoop用户 ssh-keygen -t rsa # 一路回车生成密钥对 ssh-copy-id master # 将公钥拷贝到自己 ssh-copy-id slave1 # 拷贝到slave1 ssh-copy-id slave2 # 拷贝到slave2执行后尝试ssh slave1应该可以直接登录无需密码。第五步安装JDK每台机器在/opt目录下创建software和module目录分别存放安装包和解压后的软件。# 以root身份操作 mkdir -p /opt/software /opt/module chown -R hadoop:hadoop /opt/software /opt/module将下载好的jdk-8u381-linux-x64.tar.gz上传到master节点的/opt/software。 在master上解压并配置环境变量su - hadoop tar -zxvf /opt/software/jdk-8u381-linux-x64.tar.gz -C /opt/module/编辑~/.bashrc文件添加export JAVA_HOME/opt/module/jdk1.8.0_381 export PATH$PATH:$JAVA_HOME/bin使环境变量生效source ~/.bashrc。检查安装java -version。将配置好的JDK目录和环境变量配置同步到slave1和slave2。你可以用scp命令拷贝/opt/module/jdk1.8.0_381目录和.bashrc文件或者在从节点上重复安装步骤。注意环境变量配置是新手常踩的坑。一定要确保JAVA_HOME的路径是绝对路径并且没有多余的空格或换行。可以用echo $JAVA_HOME命令来检查。3. Hadoop安装与核心配置详解基础环境就绪后我们进入Hadoop本身的安装与配置环节。这是整个搭建过程的核心配置文件的理解程度决定了你对集群的掌控力。3.1 Hadoop软件包分发与解压将下载的hadoop-3.3.6.tar.gz上传到master节点的/opt/software目录。 在master上解压tar -zxvf /opt/software/hadoop-3.3.6.tar.gz -C /opt/module/为了方便可以重命名并配置环境变量cd /opt/module mv hadoop-3.3.6/ hadoop # 编辑 ~/.bashrc在JDK配置后面追加 export HADOOP_HOME/opt/module/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin使环境变量生效source ~/.bashrc。检查hadoop version。现在将master上配置好的整个/opt/module/hadoop目录同步到两个从节点scp -r /opt/module/hadoop slave1:/opt/module/ scp -r /opt/module/hadoop slave2:/opt/module/同样也需要将master上hadoop用户的.bashrc文件同步过去或者手动在从节点上添加HADOOP_HOME环境变量。3.2 Hadoop配置文件深度解析Hadoop的配置文件位于$HADOOP_HOME/etc/hadoop/目录下。我们需要修改以下几个核心文件。所有操作在master节点的hadoop用户下进行。1.core-site.xml- 核心全局配置这个文件定义了Hadoop最基础的属性最重要的是指定HDFS的访问地址NameNode的位置。configuration !-- 指定HDFS中NameNode的地址协议、主机名、端口 -- property namefs.defaultFS/name valuehdfs://master:9000/value /property !-- 指定Hadoop运行时产生文件的存储目录如日志、临时文件等 -- property namehadoop.tmp.dir/name value/opt/module/hadoop/data/tmp/value /property /configurationfs.defaultFS: 这是客户端连接HDFS的默认入口。hdfs://是协议master是我们配置的主机名9000是NameNode默认的RPC端口。hadoop.tmp.dir: 非常重要很多组件如DataNode的存储基础路径会基于此目录派生。务必确保该目录存在且hadoop用户有读写权限。我们将它放在Hadoop安装目录下便于管理。2.hdfs-site.xml- HDFS相关配置这个文件专门配置HDFS相关的参数。configuration !-- 指定HDFS副本的数量默认是3。我们只有3个节点设为2或3均可 -- property namedfs.replication/name value2/value /property !-- SecondaryNameNode的HTTP服务器地址和端口 -- property namedfs.namenode.secondary.http-address/name valueslave1:9868/value /property !-- NameNode本地存储元数据的目录路径需要提前创建 -- property namedfs.namenode.name.dir/name valuefile://${hadoop.tmp.dir}/dfs/name/value /property !-- DataNode本地存储数据块的目录路径需要提前创建 -- property namedfs.datanode.data.dir/name valuefile://${hadoop.tmp.dir}/dfs/data/value /property /configurationdfs.replication: 数据块的副本数。这是HDFS可靠性的关键。在生产环境通常设为3。我们集群只有3个节点设为2可以在可靠性和存储开销间取得平衡。dfs.namenode.secondary.http-address: 指定SecondaryNameNode运行在哪台机器。我们让它运行在slave1上。dfs.namenode.name.dir和dfs.datanode.data.dir: 这里使用了${hadoop.tmp.dir}变量它们最终会指向/opt/module/hadoop/data/tmp/dfs/name和/opt/module/hadoop/data/tmp/dfs/data。务必在每台节点上手动创建这些目录。3.yarn-site.xml- YARN资源调度配置这个文件配置YARN框架。configuration !-- 指定ResourceManager的主机名 -- property nameyarn.resourcemanager.hostname/name valuemaster/value /property !-- NodeManager上运行的附属服务。需配置为mapreduce_shuffleMapReduce才能运行 -- property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property !-- 是否启用日志聚合将Container日志收集到HDFS建议开启 -- property nameyarn.log-aggregation-enable/name valuetrue/value /property !-- 日志在HDFS上保留的时间秒7天 -- property nameyarn.log-aggregation.retain-seconds/name value604800/value /property /configurationyarn.resourcemanager.hostname: 明确告诉集群ResourceManager在哪里。yarn.nodemanager.aux-services: 这是关键配置。MapReduce任务在YARN上运行时需要Shuffle洗牌阶段这个服务就是处理这个的。不配置或配错MapReduce作业会失败。4.mapred-site.xml- MapReduce应用配置这个文件告诉HadoopMapReduce程序应该运行在YARN框架上。configuration !-- 指定MapReduce作业运行在YARN上 -- property namemapreduce.framework.name/name valueyarn/value /property !-- MapReduce作业历史服务器地址 -- property namemapreduce.jobhistory.address/name valuemaster:10020/value /property !-- MapReduce作业历史服务器Web UI地址 -- property namemapreduce.jobhistory.webapp.address/name valuemaster:19888/value /property /configuration在Hadoop 3中这个文件可能默认不存在需要从模板复制cp mapred-site.xml.template mapred-site.xml。5.workers- 指定DataNode和NodeManager节点这个文件旧版本叫slaves列出了所有工作节点的主机名。编辑它slave1 slave2注意文件里不要有空格、空行或localhost。每行一个主机名。3.3 配置文件分发与目录创建在master上配置完所有文件后需要将它们同步到所有从节点cd $HADOOP_HOME/etc scp -r hadoop/ slave1:$HADOOP_HOME/etc/ scp -r hadoop/ slave2:$HADOOP_HOME/etc/然后在每台机器上master, slave1, slave2以hadoop用户身份创建必要的目录mkdir -p $HADOOP_HOME/data/tmp/dfs/name mkdir -p $HADOOP_HOME/data/tmp/dfs/data # 检查目录权限 chmod -R 755 $HADOOP_HOME/data4. 集群启动、验证与基础操作配置全部完成后激动人心的启动时刻到了。Hadoop的启动有严格的顺序。4.1 格式化HDFS与启动集群第一步格式化NameNode仅在第一次启动前在master执行一次hdfs namenode -format这个命令会初始化NameNode的元数据存储目录就是我们之前配置的dfs.namenode.name.dir。如果看到“successfully formatted”或类似提示并且目录下生成了current文件夹说明成功。警告格式化操作会清空所有HDFS数据只能在首次搭建或决定彻底重置集群时使用。重复格式化会导致DataNode的存储ID与NameNode不匹配导致DataNode无法注册。第二步启动HDFS在master执行start-dfs.sh这个脚本会读取workers文件依次登录到slave1和slave2启动DataNode并在master启动NameNode在slave1启动SecondaryNameNode。 用jps命令在每台机器上检查进程master:应有NameNode和DataNode如果master也在workers列表中。slave1:应有DataNode,NodeManager如果启动了YARN以及SecondaryNameNode。slave2:应有DataNode。第三步启动YARN在master执行start-yarn.sh这个脚本会在master启动ResourceManager并根据workers文件在所有节点启动NodeManager。 再次用jps检查master:新增ResourceManager。slave1/slave2:新增NodeManager。第四步可选启动历史日志服务器在master执行mapred --daemon start historyserverjps检查master上应有JobHistoryServer。这方便我们查看已完成的MapReduce作业日志。4.2 集群健康状态验证启动后如何确认集群是健康的1. 通过Web UI查看HDFS NameNode UI:http://master:9870(Hadoop 3.x端口是98702.x是50070)。在这里可以看到集群概况、DataNode存活情况、存储空间使用率等。YARN ResourceManager UI:http://master:8088。在这里可以提交作业、查看集群资源使用、监控运行中的应用。打开浏览器输入上述地址。如果能正常访问并看到Live Nodes数量为2或3如果master也作为DataNode说明HDFS启动正常。在8088端口看到所有NodeManager都连接上说明YARN正常。2. 通过命令行验证在master上执行hdfs dfsadmin -report这个命令会打印出详细的HDFS集群报告包括每个DataNode的状态、容量、使用情况。检查是否有Dead节点。yarn node -list这个命令会列出所有向ResourceManager注册的NodeManager节点及其状态。4.3 HDFS基础文件操作现在让我们像使用本地文件系统一样使用HDFS。# 1. 在HDFS上创建一个目录 hdfs dfs -mkdir -p /user/hadoop/input # 2. 将本地文件上传到HDFS # 假设本地有一个测试文件 test.txt echo Hello Hadoop World test.txt hdfs dfs -put test.txt /user/hadoop/input/ # 3. 列出HDFS目录内容 hdfs dfs -ls /user/hadoop/input # 4. 查看HDFS文件内容 hdfs dfs -cat /user/hadoop/input/test.txt # 5. 从HDFS下载文件到本地 hdfs dfs -get /user/hadoop/input/test.txt ./test_download.txt # 6. 删除HDFS上的文件 hdfs dfs -rm /user/hadoop/input/test.txt # 7. 删除HDFS目录 hdfs dfs -rm -r /user/hadoop/input4.4 运行一个MapReduce示例作业Hadoop自带了一些示例JAR包我们可以运行经典的WordCount来测试整个计算框架是否正常。# 1. 准备输入数据。在HDFS上创建输入目录并上传多个文本文件。 hdfs dfs -mkdir -p /wordcount/input # 可以上传一些本地文本文件或者直接创建 echo Hello World Bye World file1.txt echo Hello Hadoop Goodbye Hadoop file2.txt hdfs dfs -put file*.txt /wordcount/input/ # 2. 运行WordCount示例程序。 # hadoop-mapreduce-examples-3.3.6.jar 包含了各种示例 # 语法hadoop jar jar包路径 主类名 输入路径 输出路径 # 注意输出路径必须不存在程序会自动创建。 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /wordcount/input /wordcount/output # 3. 观察输出。作业会提交到YARN可以在8088端口Web UI看到作业运行状态。 # 等待作业完成SUCCEEDED。 # 4. 查看结果。 hdfs dfs -cat /wordcount/output/part-r-00000你应该能看到每个单词及其出现的次数例如Bye 1 Goodbye 1 Hadoop 2 Hello 2 World 2如果这个作业能成功运行并输出正确结果那么恭喜你一个功能完整的Hadoop集群已经搭建成功了5. 集群管理、问题排查与进阶思考集群跑起来只是第一步日常管理和问题排查才是真正的挑战。5.1 日常管理命令启动/停止所有服务# 在master执行 start-all.sh # 启动所有 (HDFSYARN不推荐已废弃建议分开启) stop-all.sh # 停止所有 # 推荐分开管理 start-dfs.sh # 启动HDFS stop-dfs.sh # 停止HDFS start-yarn.sh # 启动YARN stop-yarn.sh # 停止YARN mapred --daemon stop historyserver # 停止历史服务器单独启动/停止某个服务# 在对应节点执行 hdfs --daemon start|stop namenode|datanode|secondarynamenode yarn --daemon start|stop resourcemanager|nodemanager查看日志日志是排查问题的生命线。Hadoop日志通常位于$HADOOP_HOME/logs/目录下按用户和进程分文件。hadoop-hadoop-namenode-master.log(NameNode日志)hadoop-hadoop-datanode-slave1.log(DataNode日志)yarn-hadoop-resourcemanager-master.log(ResourceManager日志) 使用tail -f 日志文件可以实时查看日志输出。5.2 常见问题与排查实录根据我踩过的坑这里列出几个最常见的问题及其解决思路。问题1DataNode启动失败日志显示“Incompatible clusterIDs”或“NamespaceID”不匹配。原因最常见的原因是多次格式化NameNode。每次格式化都会生成新的集群IDclusterID而DataNode还保存着旧的ID导致无法注册。解决停止所有服务stop-all.sh。删除所有节点上Hadoop数据目录${hadoop.tmp.dir}例如/opt/module/hadoop/data/tmp下的所有内容。注意这会清空所有HDFS数据重新格式化NameNodehdfs namenode -format。重新启动集群。问题2从节点Slave的DataNode或NodeManager进程没有启动。排查步骤在master执行start-dfs.sh或start-yarn.sh时观察终端输出看是否有连接被拒绝Connection refused或权限被拒绝Permission denied的错误。登录到出问题的从节点用jps查看是否有进程。如果没有去$HADOOP_HOME/logs/查看对应日志如hadoop-hadoop-datanode-slave1.log。常见原因SSH免密登录未配置成功在master上尝试ssh slave1看是否需要密码。防火墙未关闭在从节点执行systemctl status firewalld检查。主机名映射错误在从节点ping master看是否能解析为正确的IP。目录权限问题确保hadoop用户对Hadoop安装目录和数据目录有读写权限。Java环境问题在从节点执行java -version和echo $JAVA_HOME确保与master一致。问题3Web UI9870或8088无法访问。排查步骤检查进程是否存活jps。检查端口是否监听netstat -tlnp | grep 9870(或8088)。如果端口未监听检查对应进程的日志。如果端口监听但无法访问检查master节点的防火墙规则或者是否在虚拟机网络配置中做了端口转发。问题4运行MapReduce作业失败YARN Web UI显示作业状态为FAILED。排查步骤在8088 UI上点击失败的作业查看日志。特别是“Diagnostics”信息和Container日志。常见原因yarn.nodemanager.aux-services未配置或配置错误必须是mapreduce_shuffle。资源不足NodeManager可用内存或CPU不足。需要调整yarn-site.xml和mapred-site.xml中的资源相关参数如yarn.nodemanager.resource.memory-mb,yarn.scheduler.maximum-allocation-mb,mapreduce.map.memory.mb等。类路径问题作业依赖的库找不到。可以考虑将依赖JAR包上传到HDFS并通过-libjars参数指定。5.3 性能调优与安全初步对于生产环境我们还需要考虑更多。基础性能调优JVM堆内存设置在hadoop-env.sh和yarn-env.sh中调整HADOOP_HEAPSIZE和YARN_HEAPSIZE。对于NameNode和ResourceManager建议设置2-4GB以上。DataNode磁盘选择dfs.datanode.data.dir可以配置多个用逗号分隔的目录这些目录应该对应不同的物理磁盘以提高IO吞吐量。YARN资源配置根据机器物理资源合理设置yarn.nodemanager.resource.memory-mbNodeManager总内存和yarn.nodemanager.resource.cpu-vcores总虚拟CPU核数。容器内存设置mapreduce.map.memory.mb,mapreduce.reduce.memory.mb应小于NodeManager单个容器可分配的最大内存。安全配置启用HDFS权限检查在hdfs-site.xml中确保dfs.permissions.enabled为true。HDFS有类似Linux的文件权限模式rwx。使用Kerberos进行认证这是生产集群的标配用于防止未授权访问。配置过程较为复杂涉及KDC服务器、生成keytab文件等。配置网络加密使用SSL/TLS对RPC和HTTP传输进行加密。5.4 集群停止与维护当需要关机维护时务必按顺序停止服务# 在master上执行 stop-yarn.sh stop-dfs.sh mapred --daemon stop historyserver粗暴地直接关机可能导致元数据损坏。定期检查磁盘空间清理过期日志$HADOOP_HOME/logs/和YARN聚合日志目录。对于NameNode元数据dfs.namenode.name.dir建议定期通过hdfs dfsadmin -fetchImage命令备份到远程。搭建只是起点理解其运行机制并能稳定运维和性能调优才是掌握Hadoop的关键。这套超详细的流程几乎涵盖了从零开始的所有环节希望你能通过亲手实践真正吃透每个步骤背后的原理。遇到问题多查日志善用Web UI和社区资源大数据之路就从这里开始了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进