news 2026/10/8 23:57:04

Hadoop2集群搭建实战:从规划配置到YARN与Spark衔接

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hadoop2集群搭建实战:从规划配置到YARN与Spark衔接

我第一次动手搭分布式环境的时候,用的就是Hadoop2。当时网上教程不少,但大多数是照着抄配置、敲命令,出了问题没人告诉你为什么。后来陆陆续续帮同事排过不少坑,自己也重装过好几遍,才慢慢把每个参数背后的逻辑理清楚。这篇文章就围绕Hadoop2集群搭建这件事,把从规划、安装、配置到跑通第一个MapReduce作业的完整过程写出来,重点关注那些文档里不写、但你真的会踩的坑。后面还会顺带聊一下Spark集群搭建时怎么直接复用这套Hadoop2底座,希望对正在入门大数据或者准备在公司内网搭一套测试集群的同学有点帮助。

1. 项目概述与整体思路

1.1 Hadoop2解决的是什么问题

Hadoop2本质上是一套分布式基础架构,核心由两大块组成:HDFS负责存储,YARN负责计算调度。HDFS把大文件切块分散到多台机器上,解决了单机磁盘装不下、文件大了读写慢的问题;YARN把CPU和内存资源统一管理起来,解决了多个计算框架抢占资源的问题。这两块加起来,就等于用一堆普通的服务器,拼出了一个既能存海量数据、又能跑大规模计算的“超级计算机”。

Hadoop2和Hadoop1最大的区别,就是引入了YARN。Hadoop1里的MapReduce既要做计算又要管资源,所有作业挤在一块儿,调度效率低,而且除了MapReduce之外别的计算框架根本没法用。Hadoop2把资源管理和计算框架解耦之后,MapReduce只是YARN上的一个客户端,Spark、Flink这些框架也都能跑在同一个集群上。这也是为什么很多公司即使现在不用MapReduce了,底层HDFS和YARN仍然留着,因为Spark集群搭建基本都是选择“on YARN”模式,直接复用这一套资源池。

1.2 为什么用三台机器而不是一台

学习阶段完全可以在单机上跑伪分布式,也就是一个进程模拟所有角色,但这样学不到集群的真实协作逻辑。我强烈建议至少准备三台虚拟机或物理机,一台做Master节点,两台做Worker节点。三台是最低配的真实集群,既能看清主节点是怎么调度、怎么存储元数据的,也能看到数据切块后是如何分布到多台机器上的。

生产环境里节点会更多,角色也会拆分得更细,比如NameNode和ResourceManager分到不同机器,SecondaryNameNode单独放一台,还会考虑机架感知、NameNode HA(高可用)这些。但初次搭建,所有Master侧的角色放一台机器完全够用,先跑通链路,再谈优化。

1.3 选择Hadoop2.x版本的原因

现在Hadoop3.x也出了几年了,但我仍然建议入门从Hadoop2开始,有三个原因:第一,Hadoop2的资料极其丰富,踩过坑的人多,遇到问题基本都能搜到答案;第二,很多公司的存量集群仍然是2.x,学会2.x可以直接上手维护;第三,Hadoop2到Hadoop3的核心原理没有本质变化,只是增加了一堆新特性,比如HDFS纠删码、多NameNode联邦,你先把2.x吃透,再去迁移3.x也不费劲。

我常用的是Apache Hadoop 2.10.2这个版本,2.x系列的最后一个版本,Bug修复比较全,兼容性也稳定。如果你手头有2.7.x或2.9.x的安装包也没问题,配置原理是一样的,版本号不同不影响本文阅读。

2. 集群规划与前置准备

2.1 节点规划与角色分配

以三台虚拟机为例,我习惯这样规划:Master节点同时承担NameNode、ResourceManager、SecondaryNameNode三个角色;两台Worker节点各承担DataNode和NodeManager。SecondaryNameNode在严格的生产环境里不该和NameNode放同一台机器,因为它的作用是定期合并NameNode的编辑日志,如果NameNode所在机器宕机,SecondaryNameNode也一起挂了就失去了备份意义。但学习环境资源有限,放一起能少占一台机器,等以后再拆开。

主机名IP示例角色用途
hadoop-master192.168.1.101NameNode、ResourceManager、SecondaryNameNode管理元数据、资源调度
hadoop-node01192.168.1.102DataNode、NodeManager数据存储、任务执行
hadoop-node02192.168.1.103DataNode、NodeManager数据存储、任务执行

主机名最好提前改成带语义的名字,比如hadoop-master、hadoop-node01,不要用默认的localhost或者一堆随机字符串。因为集群里所有节点互相通信是通过主机名映射IP的,后面配置里到处都要写主机名,名字起好了,排错时一眼就能看出来是哪台机器。

2.2 虚拟机的硬件与网络配置建议

这三台虚拟机建议每台至少2GB内存、2个CPU核,磁盘按需分配,系统盘之外最好单独挂一块数据盘。HDFS的目录可以专门放到数据盘上,避免系统日志、HDFS数据、临时文件挤在同一个根分区,把磁盘写满。网络方面,虚拟机采用桥接或仅主机模式都可以,关键是三台机器要能互通,而且IP要固定下来,不要用DHCP动态分配。你想象一下,NameNode记录的DataNode地址经常变化,那集群稳定性肯定就没法保证。

还有个很常见的坑:如果你用VMware克隆虚拟机,克隆出来的系统里网卡MAC地址、主机名可能还是会沿用原来的,一定要分别检查/etc/hostname、/etc/sysconfig/network-scripts/ifcfg-eth0这些文件,把MAC和IP改成正确的,否则配置了半天网络不通,全在做无用功。

2.3 系统初始化三板斧:JDK、免密、时间同步

安装Hadoop前,先把系统环境收拾利索。我总结为三板斧:装JDK、配SSH免密、开时间同步。

第一是JDK。Hadoop2对JDK8的支持最稳定,我用的是Oracle JDK 1.8或者OpenJDK 8都可以。注意Hadoop的启动脚本依赖JAVA_HOME环境变量,最好在/etc/profile里写死,并且所有节点保持一致。

cat >> /etc/profile <<EOF export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export PATH=\$JAVA_HOME/bin:\$PATH EOF source /etc/profile java -version

第二是SSH免密。Hadoop的Master节点要通过SSH登录到所有Worker节点去拉起或者停掉DataNode进程,所以需要配置SSH免密钥登录。建议从master上生成密钥,然后拷贝到所有节点(包括自己)。不要小看这一条,很多同学跑start-dfs.sh时明明看到脚本在执行,但DataNode起不来,日志里一堆Permission denied,就是这里没配好。

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa ssh-copy-id hadoop-master ssh-copy-id hadoop-node01 ssh-copy-id hadoop-node02

第三是时间同步。分布式系统里各个节点的时间不一致,会导致心跳判断异常、任务超时等莫名其妙的问题。内网环境没有NTP服务器的话,选一台机器做时间源,其他机器手动同步也行,简单点直接在Master上搭个ntpd服务,或者至少用crontab定时执行ntpdate和时间源对齐。这一步是很多人忽略的,但我觉得它比某些参数配置还关键,时间错乱了排查起来特别费劲。

3. Hadoop2安装与核心配置

3.1 安装目录与文件布局

把下载好的hadoop安装包解压到统一目录,我一般放在/usr/local/hadoop或者/opt/hadoop。为了便于升级和回滚,建议保留版本号目录,然后做一个软链接,比如把hadoop-2.10.2软链到/usr/local/hadoop。这样以后切换版本只改软链接,不用到处改配置。同时把Hadoop的bin和sbin目录加入PATH,这样不用每次敲全路径。

tar zxvf hadoop-2.10.2.tar.gz -C /usr/local/ ln -s /usr/local/hadoop-2.10.2 /usr/local/hadoop echo 'export HADOOP_HOME=/usr/local/hadoop' >> /etc/profile echo 'export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH' >> /etc/profile source /etc/profile

Hadoop2的配置文件都在$HADOOP_HOME/etc/hadoop/目录下。核心需要改的有5个文件:hadoop-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml,另外还要维护一个slaves文件(Hadoop3里改名叫workers),里面列出所有Worker节点的主机名。

3.2 逐文件拆解核心配置参数

先看hadoop-env.sh,这里面主要改JDK路径和JVM内存。Hadoop默认的JVM堆内存很小,NameNode管理元数据、ResourceManager管理调度都需要内存,不够用会导致频繁Full GC甚至进程直接退出。在文件里加上:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export HADOOP_HEAPSIZE=1024 export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

HADOOP_HEAPSIZE控制的是NameNode和ResourceManager这类Hadoop守护进程的默认堆大小,学习环境1024MB就够了,机器内存够大你改成2048也行。一定要改,否则默认只有几百MB,启动个几天日志一堆OOM。

然后是core-site.xml,它设置集群的默认文件系统地址和临时目录:

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop-master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> </property> </configuration>

fs.defaultFS是整个HDFS的入口地址,客户端读写文件全靠它找到NameNode。hadoop.tmp.dir是Hadoop运行时的基础临时目录,NameNode和DataNode的元数据默认都是放在它下面的子目录里。这个目录一定要提前建好并且配置到非根分区,否则默认放/tmp下,系统一清理作业数据就全没了,这是血的教训。

接着hdfs-site.xml,主要设置NameNode和DataNode的数据存储路径,以及副本数:

<configuration> <property> <name>dfs.namenode.name.dir</name> <value>/data/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/data/hadoop/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration>

dfs.replication三台机器我习惯设成2,因为如果设成3,三台机器各存一份,确实能保证任何一台挂了数据不丢,但对学习环境来说太浪费空间。生产环境至少3份起步,这是HDFS保证数据可靠性的基础。dfs.permissions.enabled我学习时一般关掉,省得权限问题阻碍你跑通流程,但生产环境必须打开,否则任何用户都能删数据,不设防的分布式文件系统太危险。

然后yarn-site.xml,这是Hadoop2里最关键也最容易配错的文件:

<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop-master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>1536</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>2</value> </property> </configuration>

yarn.resourcemanager.hostname不用多解释,就是指定ResourceManager跑在哪台机器上。aux-services这里是最容易忘的,很多同学MapReduce提交后卡在Shuffle阶段,就是因为没有配置mapreduce_shuffle服务。可以这么理解:MapTask处理完中间结果后,ReduceTask需要跨节点拉取数据,这个数据转移动作是由NodeManager上的辅助服务承担的,你不告诉它启用哪个辅助服务,Shuffle就根本跑不起来。yarn.nodemanager.resource.memory-mb决定每台Worker节点向YARN贡献多少内存,默认是8192MB,如果你的虚拟机只有2GB内存,不调小的话NodeManager会因为申请不到足够物理内存而启动失败。

mapred-site.xml默认不存在,需要从模板复制一份:

cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml

里面最核心的是告诉MapReduce框架用YARN来调度:

<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.map.memory.mb</name> <value>512</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>512</value> </property> </configuration>

如果不设置mapreduce.framework.name,MapReduce默认会在本地运行,作业提交到HDFS上不仅跑不出分布式效果,还会报各种找不到TaskTracker的错误。内存相关两个参数是给每个Map/Reduce任务分配的容器内存,要结合上面yarn.nodemanager.resource.memory-mb来规划,比如NodeManager总共贡献1536MB,那同时最多只能跑3个512MB的容器任务,超了就排队等资源。

最后是slaves文件,把Worker节点主机名写进去,一行一个,注意不要写Master自己:

hadoop-node01 hadoop-node02

配置全部改完后,用scp或者rsync把整个/usr/local/hadoop目录同步到另外两台节点,同时把/etc/profile里的环境变量也同步过去。配置文件、安装包、脚本必须三台机器保持完全一致,集群运行才能步调一致。

3.3 格式化NameNode启动集群

首次启动之前,必须执行一次格式化命令,给NameNode初始化元数据目录:

hdfs namenode -format

这一步会在/data/hadoop/dfs/name/current/下生成VERSION文件,里面保存了该文件系统的namespaceID和clusterID。格式化操作本身很简单,但很多人后续遇到DataNode起不来,都是因为重复执行了格式化。第一次格式化没问题,第二、第三次格式化之后,NameNode会生成一个新的clusterID,而DataNode的数据目录里还保留着老的clusterID,两边对不上就互相不认。所以格式化前一定要想清楚,到底是不是第一次部署。

启动顺序也有讲究。先启动HDFS,再启动YARN,我习惯分开执行:

start-dfs.sh start-yarn.sh

执行完start-dfs.sh后,Master会通过SSH自动连到slaves文件里的节点去启动DataNode,所以前面配置SSH免密才那么重要。启动过程中终端会滚动打印每台节点的启动日志,注意看有没有ERROR字样。如果一切顺利,jps命令能看到所有关键进程。

4. 验证集群与跑通第一个作业

4.1 通过jps和Web界面确认集群状态

集群启动后,先在所有节点上执行jps,这是最简单直观的进程检查方式。在Master节点上应该看到至少4个进程:NameNode、SecondaryNameNode、ResourceManager,以及因为Master自己也装了完整包而可能被启动的DataNode/NodeManager。Worker节点上应该看到DataNode和NodeManager两个进程。

登录Hadoop自带的Web界面验证集群状态更直观。Hadoop2的NameNode管理界面地址是http://hadoop-master:50070,这里能看到整个集群的存储容量、DataNode列表、文件目录树。YARN的资源管理界面是http://hadoop-master:8088/cluster,这里能看到集群总内存、活跃节点数量,以及正在运行和已经完成的任务列表。这两个地址是你后续排错最重要的入口,端口号要记牢,Hadoop2和Hadoop3不太一样,Hadoop3里NameNode默认端口变成了9870,别搞混了。

4.2 用命令行快速上手HDFS常用操作

HDFS的命令行操作和Linux命令几乎一一对应,上手很快。先建目录,再上传文件,然后看看数据被切成几块分布在哪些节点上:

hdfs dfs -mkdir -p /test/input hdfs dfs -put /etc/hosts /test/input/ hdfs dfs -ls /test/input/

如果你想更直观地看到数据块分布,可以执行hdfs fsck /test/input/hosts -files -blocks -locations命令,会列出文件块编号、块大小,以及每个块的副本被放在哪台DataNode上。我记得我第一次跑这个命令的时候才真正理解了什么叫“分布式存储”——一个只有几十KB的hosts文件也被切成一块,默认128MB的块大小对于小文件来说就是浪费,实际生产里文件数量和块大小这把尺子要平衡好,小文件场景就得考虑把块调小。

从HDFS下载文件到本地就是反着的操作:

hdfs dfs -get /test/input/hosts /tmp/hosts_from_hdfs

4.3 提交经典WordCount作业

Hadoop2自带MapReduce示例,不用自己写代码就能勺一遍完整流程。示例JAR包在$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.2.jar,里面包含WordCount、PI估算、排序等经典程序。

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.2.jar wordcount /test/input /test/output

作业提交后,YARN Web界面里就能看到一个新的Application,状态从ACCEPTED变成RUNNING,最后变成FINISHED。终端会打印整个作业的执行过程,包括Map输入输出记录数、Reduce输入输出记录数,以及每一步耗时。如果看到类似Map input records=xx和Reduce output records=xx这样的计数,就说明你的第一个分布式作业已经跑通了。

跑完以后查看输出结果:

hdfs dfs -cat /test/output/part-r-00000

你会在输出文件里看到按单词统计的次数。这里有个细节:MapReduce的输出目录必须预先不存在,否则作业直接报错Output directory hdfs://... already exists,这是框架防止覆盖结果的设计,如果你想重新跑,要么换个输出目录,要么用hdfs dfs -rm -r把老目录删掉。

5. 常见问题与排查实录

5.1 DataNode起不来,日志提示clusterID不匹配

这是新手搭建Hadoop2集群时遇到最多的问题。现象是start-dfs.sh执行完了,Master上NameNode正常,但Worker节点上的DataNode进程一直退出,去$HADOOP_HOME/logs/hadoop-hadoop-datanode-hadoop-node01.log里翻日志,会看到类似The clusterID ... doesn't match ...的报错。

原因我在前面格式化那一段已经说过,就是你重复执行了hdfs namenode -format,导致NameNode的clusterID变了,而DataNode数据目录里还是旧的clusterID。解决办法分两种情况:如果集群里没有重要数据,那就把DataNode的/data/hadoop/dfs/data目录清空,重启DataNode让它重新注册;如果集群里有数据,那就需要把NameNode的/data/hadoop/dfs/name/current/VERSION里的clusterID同步到DataNode的对应VERSION文件里,但这条路操作起来比较复杂,新手我不建议去改。

我个人的建议是:确认是测试环境就直接清DataNode目录,别心疼那点数据,把流程跑通比保留测试数据重要得多。

5.2 集群一直处于安全模式,上传文件失败

NameNode启动后默认会进入安全模式。安全模式本质上是HDFS的“只读保护模式”,启动期间NameNode需要接收所有DataNode的块上报,确认副本率达到了阈值,才会自动退出安全模式。如果你的集群刚启动就去上传文件,经常会看到Name node is in safe mode的报错,这是正常的,等个半分钟到一分钟再试就好。

但如果等了很久还在安全模式,那就说明可能有DataNode掉线、副本数不足,或者dfs.replication设的太高导致副本率达不到99.99%的阈值。排查优先级是:jps看DataNode进程在不在,hdfs dfsadmin -report看各节点状态,然后再看日志。学习环境下比较省事的操作是手动退出安全模式:

hdfs dfsadmin -safemode leave

但要注意这只是临时解决问题,如果底层原因(DataNode不健康)没排除,过段时间可能又自动进安全模式了。

5.3 作业提交后一直等待,不开始执行

有的同学跑WordCount,看到终端卡在INFO mapreduce.Job: Running job...好几分钟不动,Web界面里任务状态是ACCEPTED或RUNNING但没有任何Container启动,大概率就是资源问题。虚拟机总内存一共2GB,你给NodeManager分配了1536MB,还要给系统其他进程留内存,实际可用资源很小,作业虽然提交了,但YARN始终分配不出一个容器来执行任务,只能一直排队。

解决思路是降低单任务内存需求或者提高NodeManager资源配额,但这两者是矛盾的,核心是让规划符合物理机实际。我拿2GB内存的虚拟机举例:把yarn.nodemanager.resource.memory-mb设成1024MB,mapreduce.map.memory.mb和mapreduce.reduce.memory.mb各设成256MB,这样最多同时能跑4个容器任务,虽然每个任务内存小一点,但学习WordCount这种小数据量的场景完全够用。

5.4 Web界面打不开,防火墙和地址配置

Master节点的50070和8088端口在浏览器里访问不了,先查防火墙。有些系统默认开着firewalld,直接把进程拒之门外,简单粗暴的方法是:

systemctl stop firewalld systemctl disable firewalld

如果是云服务器,还需要在安全组里放行这两个端口。另外确认浏览器访问的地址到底是不是Master节点的IP,很多同学在Windows本机浏览器里访问的是虚拟机里那台机器的hostname,解析不到IP自然就白搭。

5.5 常见问题速查表

现象大概率原因处理建议
DataNode进程反复退出clusterID不一致或数据目录权限不对清空DataNode数据目录,确认目录owner
启动后临时目录找不到hadoop.tmp.dir未提前创建手动创建目录并设置权限
作业卡在Shuffleyarn-site.xml缺少mapreduce_shuffle服务补上aux-services配置并重启YARN
上传文件报端口9000拒绝fs.defaultFS主机名解析失败检查所有节点/etc/hosts配置
节点间SSH执行失败免密未配置成功重新ssh-copy-id,手动ssh验证
NameNode内存溢出HADOOP_HEAPSIZE太小调大JVM堆内存,重启NameNode

排错这件事,我的经验是永远先看日志。Hadoop日志文件分散在各节点$HADOOP_HOME/logs/下,日志文件命名规则是hadoop-用户名-进程名-主机名.log,用tail -200去看最新日志比瞎猜配置有效得多。另外hdfs dfsadmin -report、yarn node -list、hadoop job -status这几个命令堪称诊断三连,配合起来能快速定位大多数问题。

6. 从Hadoop2到Spark集群搭建的衔接

6.1 复用一个资源池的两种思路

Hadoop2集群的价值并不仅仅在于跑MapReduce,YARN把资源管控做好之后,Spark这类新一代计算框架可以直接跑来共享同一套HDFS存储和YARN资源池。搭建Spark集群有两种主流思路:第一种是Spark Standalone模式,Spark自己管资源,不依赖YARN,优点是部署简单,缺点是同一批机器如果同时跑MapReduce就各管各的,资源配置容易冲突;第二种是Spark on YARN,把Spark应用当作YARN上的一个Application提交,资源由YARN统一调度,这也是生产环境里最常见的部署方式。

如果你已经按照前面步骤把Hadoop2集群搭好了,做Spark on YARN就非常顺,本质上只需要准备Spark客户端,配置里面指向Hadoop的HDFS地址和YARN地址即可。

6.2 五步完成Spark on YARN的基础搭建

第一步,下载对应Hadoop2版本的Spark安装包,比如spark-2.4.8-bin-hadoop2.7.tgz,注意包名里带hadoop2.7就表示预编译时兼容Hadoop2.x,不要下错了版本。第二步,解压到/usr/local/spark,然后编辑conf/spark-env.sh,设置两个关键项:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop

第三步,把所有Spark的配置目录同步到集群所有节点,Spark的Worker进程会从Hadoop的配置里自动识别fs.defaultFS和yarn.resourcemanager.hostname,所以你不需要在Spark里重复配HDFS地址。第四步,直接提交一个Spark任务测试,比如跑Spark官方自带的Pi示例:

/usr/local/spark/bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ /usr/local/spark/examples/jars/spark-examples_2.11-2.4.8.jar 10

第五步,去YARN Web界面(8088端口)看这个Application的运行状态,如果状态是FINISHED,说明Spark已经完全跑在Hadoop2的资源池上了。

整个过程你会发现,Hadoop2集群搭建的扎实程度决定了一切后续框架的稳定性,Spark只是一个“租客”,租的是YARN提供的CPU和内存,存的是HDFS上的文件。Hadoop2集群如果数据目录权限、集群ID、资源配额这些基础没打好底子,Spark在上面跑出问题再回头排查就很被动。

6.3 我的一点调优体会

集群跑顺了之后,调优方面我有几个小的个人体会。HDFS的块大小默认128MB,如果你的文件都是几十MB的小文件,建议适当调小块到64MB甚至更低,否则NameNode内存里会塞满大量文件的元数据,大集群下NameNode内存就是瓶颈。数据目录尽量挂在多块磁盘上,DataNode的数据目录可以配置多个路径逗号分隔,让不同块分散到不同磁盘,提升读写并发能力。YARN的资源分配策略也很关键,注意观察作业的实际资源水位,别把yarn.nodemanager.resource.memory-mb配得太满,要给操作系统和其他进程留出至少四分之一的内存,否则节点会被系统自动杀掉进程。

这些经验都是我在一次次重装、一个个日志翻出来的。搭建Hadoop2集群这件事,看起来就是改几个XML文件、敲几条启动命令,真正值钱的地方在于理解每个配置项为什么存在、集群各角色之间怎么协作、出了问题从哪个角度切入去排查。这套思路打通了,后面无论是搭建Spark集群、Flink集群还是维护生产Hadoop集群,都会觉得顺手很多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 23:57:03

SYN Flood攻击防御实战:内核调优与流量清洗全攻略

凌晨一点&#xff0c;手机连环震动。打开运维群一看&#xff0c;某台线上业务服务器的告警已经刷屏&#xff1a;TCP连接数暴涨、CPU毛刺、业务接口响应超时。登录跳板机看了一眼&#xff0c;netstat -ant里SYN_RECV状态连接密密麻麻&#xff0c;从同一个或几个可疑IP段源源不断…

作者头像 李华
网站建设 2026/10/8 23:56:50

Gitee实战:从SSH密钥到开源协作的完整指南

先说个我的判断&#xff1a;Gitee这几年在国内开发者圈子里&#xff0c;已经从“备胎”变成了“日常”。2025年再看这个平台&#xff0c;它的价值早就不只是“国内能访问的Git托管”这么简单。围绕Gitee长出来的本土化协作习惯、开源合规玩法、Pages静态托管&#xff0c;甚至游…

作者头像 李华
网站建设 2026/10/8 23:55:59

连续失败后如何止损?重建容错率的工程化指南

看到“连跪两天&#xff0c;容错率变了”这句话时&#xff0c;我第一反应是想起自己上一次连续搞砸项目的经历。连输两天&#xff0c;最可怕的不是那两天的实际损失&#xff0c;而是第三天做决策时&#xff0c;你的整个判断系统已经悄悄换了版本。所谓容错率&#xff0c;原本是…

作者头像 李华
网站建设 2026/10/8 23:54:04

CentOS 7 下用 Shell 脚本 + Docker 一键部署 Redis 3主3从集群

简介&#xff1a;这份资源提供了一套基于 Docker 的 Redis 集群一键部署方案&#xff0c;面向需要在 CentOS 7.x 环境下快速搭建 Redis 集群的运维与后端开发人员。使用者只需按说明将参数传递给安装脚本&#xff0c;即可自动完成镜像加载、容器编排与集群初始化&#xff0c;省…

作者头像 李华
网站建设 2026/10/8 23:51:34

WPF富文本编辑器开发实战:从FlowDocument到仿Word开源Demo

简介&#xff1a;这是一份基于WPF的开源富文本编辑器代码与演示项目&#xff0c;面向希望在.NET桌面应用中实现类Word编辑功能的开发者&#xff0c;尤其适合具备一定C#与XAML基础、想研究富文本处理机制的中高级人员。压缩包共289个文件&#xff0c;约753KB&#xff0c;以cs源码…

作者头像 李华
网站建设 2026/10/8 23:50:52

PyCharm Python应用开发实战:从环境配置到调试部署

简介&#xff1a;本资源是Packt出版的《Hands-On Application Development with PyCharm》配套代码库&#xff0c;面向Python初学者及希望提升开发效率的中阶开发者&#xff0c;聚焦PyCharm这一主流IDE的工程化实践能力培养。资源以ZIP压缩包形式提供&#xff0c;共包含百余个结…

作者头像 李华