1. YARN核心概念与Hadoop生态定位
在大数据领域,YARN(Yet Another Resource Negotiator)作为Hadoop 2.0引入的核心组件,彻底改变了早期MapReduce框架的资源管理方式。我初次接触YARN时,最直观的感受是它像大数据集群的"交通指挥中心"——负责将集群资源合理分配给各类计算框架(如MapReduce、Spark、Flink等),同时确保任务之间不会互相干扰。
YARN的架构主要由三个关键组件构成:
- ResourceManager (RM):全局资源调度器,通常部署在独立的管理节点
- NodeManager (NM):每个工作节点上的本地资源代理
- ApplicationMaster (AM):每个应用程序特有的进程,负责与RM协商资源
这种架构设计带来的最大优势是解耦了资源管理与任务调度。记得2015年我们还在使用Hadoop 1.x时,集群资源利用率长期徘徊在30%左右,升级到YARN架构后,同样的硬件配置可以支撑多类型工作负载并行运行,资源利用率直接提升到70%以上。
关键提示:现代Hadoop集群中,YARN已经取代了第一代MapReduce中的JobTracker/TaskTracker架构,成为资源调度的标准方案。即使你不直接使用MapReduce,其他框架如Spark、Tez等也都依赖YARN进行资源管理。
2. 集群环境准备与前置条件
2.1 硬件与操作系统要求
根据我参与过的十几个Hadoop集群部署经验,YARN对硬件的要求主要取决于工作负载类型。对于学习测试环境,建议配置:
- 管理节点:8核CPU/16GB内存/100GB存储
- 工作节点:4核CPU/8GB内存/50GB存储(至少3个节点)
生产环境则需要根据实际数据量进行规划。去年我们为某电商部署的集群就遇到了内存不足的问题——最初按1:4的vCore与内存比例配置,后来发现Spark作业需要更多内存,最终调整为1:8的比例才稳定运行。
操作系统方面,我强烈推荐使用CentOS 7或RHEL 7+系列。曾经在Ubuntu上部署时遇到不少兼容性问题,特别是SElinux相关的权限错误。以下是必须安装的基础软件包:
# CentOS/RHEL sudo yum install -y java-1.8.0-openjdk-devel ssh pdsh ntp rsync2.2 Java环境配置
YARN对Java版本有严格要求,必须使用Oracle JDK 8或OpenJDK 8。虽然新版本Hadoop支持Java 11,但在实际生产中发现不少第三方库仍有兼容性问题。配置JAVA_HOME时有个容易踩的坑——很多教程会直接写:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0但更好的做法是使用alternatives命令确定准确路径:
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))把这个配置加入/etc/profile并执行source /etc/profile使其生效。验证时不要只看java -version,一定要检查环境变量:
echo $JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_642.3 主机名与SSH免密登录
集群节点间的通信依赖正确的主机名解析。建议在每台机器的/etc/hosts中配置所有节点IP与主机名的映射,例如:
192.168.1.101 master 192.168.1.102 worker1 192.168.1.103 worker2SSH免密登录是YARN启动远程进程的基础。在master节点执行:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys然后将公钥分发到所有worker节点:
for node in worker1 worker2 worker3; do ssh-copy-id -i ~/.ssh/id_rsa.pub $node done避坑指南:如果遇到"Permission denied"错误,检查
/etc/ssh/sshd_config中的以下配置:RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys修改后需重启sshd服务:
sudo systemctl restart sshd
3. Hadoop集群安装与基础配置
3.1 二进制包分发与目录结构
从Apache官网下载对应版本的Hadoop二进制包(当前稳定版是3.3.4),解压到统一路径。我习惯使用/opt/hadoop目录:
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz sudo tar -xzf hadoop-3.3.4.tar.gz -C /opt sudo mv /opt/hadoop-3.3.4 /opt/hadoop sudo chown -R hadoop:hadoop /opt/hadoop目录结构的关键点:
bin/:Hadoop基础命令sbin/:启动/停止脚本etc/hadoop/:配置文件目录logs/:日志文件(排查问题的第一去处)share/:示例和文档
3.2 核心配置文件详解
3.2.1 hadoop-env.sh
设置Java环境变量和Hadoop参数:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export HADOOP_HEAPSIZE_MAX=2048m # 控制内存使用上限 export HADOOP_LOG_DIR=/var/log/hadoop3.2.2 core-site.xml
配置全局命名空间和I/O设置:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop/tmp</value> </property> </configuration>3.2.3 hdfs-site.xml
HDFS相关配置,根据节点角色不同有所区别。NameNode配置示例:
<property> <name>dfs.replication</name> <value>3</value> <!-- 根据实际节点数调整 --> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/hadoop/hdfs/name</value> </property>3.2.4 yarn-site.xml
YARN的核心配置文件,需要特别注意以下参数:
<property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> <!-- 不超过物理内存的80% --> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>4096</value> <!-- 单个容器最大内存 --> </property>3.3 环境变量配置
在~/.bashrc中添加以下内容:
export HADOOP_HOME=/opt/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop执行source ~/.bashrc使配置生效。验证安装:
hadoop version Hadoop 3.3.4 Source code repository https://github.com/apache/hadoop.git -r a585a73...4. YARN服务启动与验证
4.1 启动HDFS
首先格式化NameNode(仅在首次安装时执行):
hdfs namenode -format然后启动HDFS服务:
start-dfs.sh检查各节点进程是否正常:
- NameNode:master节点应有
NameNode进程 - DataNode:所有worker节点应有
DataNode进程
4.2 启动YARN服务
在ResourceManager节点(通常是master)执行:
start-yarn.sh验证服务:
- master节点应有
ResourceManager进程 - worker节点应有
NodeManager进程
4.3 Web UI访问
YARN提供了直观的Web界面:
- ResourceManager UI: http://master:8088
- NameNode UI: http://master:9870
如果无法访问,检查防火墙设置:
sudo firewall-cmd --permanent --add-port=8088/tcp sudo firewall-cmd --permanent --add-port=9870/tcp sudo firewall-cmd --reload4.4 提交测试作业
运行内置的MapReduce示例验证集群:
yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar pi 10 100这个计算π值的作业会创建10个map任务,每个任务进行100次采样。成功执行后应看到类似输出:
Estimated value of Pi is 3.141600000000000000005. 高级配置与性能调优
5.1 资源分配策略
YARN支持三种调度器,通过yarn-site.xml配置:
FIFO Scheduler(仅适合测试环境)
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler</value> </property>Capacity Scheduler(生产环境常用)
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property>Fair Scheduler(多租户场景推荐)
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property>
5.2 内存与CPU配置
合理配置资源是保证集群稳定的关键。以下是生产环境推荐配置(8核CPU/64GB内存节点示例):
<!-- yarn-site.xml --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>57344</value> <!-- 64GB * 0.9 (保留10%给系统) --> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>7</value> <!-- 保留1核给系统 --> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> <!-- 容器最小内存 --> </property>5.3 日志聚合配置
启用日志聚合可以方便查看已完成作业的日志:
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/tmp/logs</value> </property>查看聚合日志的命令:
yarn logs -applicationId <application_id>6. 常见问题排查指南
6.1 NodeManager未启动
症状:ResourceManager Web UI中看不到工作节点
排查步骤:
- 检查NodeManager日志(
/opt/hadoop/logs/yarn-<user>-nodemanager-<hostname>.log) - 常见错误:内存配置超出物理内存
- 解决方案:调整
yarn.nodemanager.resource.memory-mb
6.2 作业卡在ACCEPTED状态
可能原因:
- 集群资源不足
- 调度队列配置错误
检查命令:
yarn queue -status <queue_name>6.3 容器执行失败
典型错误信息:
Container killed on request. Exit code is 143这通常表示容器超出了内存限制。解决方法:
- 增加
mapreduce.map.memory.mb和mapreduce.reduce.memory.mb - 或者优化应用程序内存使用
6.4 磁盘空间不足
YARN会在本地存储临时文件,需要定期清理:
# 设置本地目录自动清理 <property> <name>yarn.nodemanager.localizer.cache.cleanup.interval-ms</name> <value>600000</value> <!-- 10分钟 --> </property>7. 与其它组件的集成实践
7.1 Spark on YARN
Spark可以原生运行在YARN上,提交作业时指定:
spark-submit --master yarn \ --deploy-mode cluster \ --executor-memory 4g \ --num-executors 10 \ your-spark-job.jar7.2 Hive on YARN
配置Hive使用YARN作为执行引擎:
SET hive.execution.engine=yarn; SET mapreduce.job.queuename=hive;7.3 Docker容器支持
YARN 3.1+支持使用Docker容器运行任务:
<property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.util.DockerContainerExecutor</value> </property>8. 监控与维护最佳实践
8.1 关键指标监控
建议监控以下YARN指标:
- 集群资源利用率(通过ResourceManager API获取)
- 待处理作业数
- 失败容器比例
- 每个NodeManager的磁盘使用率
8.2 定期维护任务
日志轮转配置(
log4j.properties):hadoop.root.logger=INFO,rollingfile log4j.appender.rollingfile.MaxFileSize=256MB log4j.appender.rollingfile.MaxBackupIndex=10定期检查HDFS健康状况:
hdfs dfsadmin -reportYARN节点健康检查脚本:
yarn node -list -all
8.3 升级策略
YARN升级建议采用滚动升级方式:
- 先升级ResourceManager
- 然后逐个升级NodeManager
- 验证各服务兼容性
- 官方推荐保持所有节点版本一致
9. 安全配置建议
9.1 Kerberos认证
生产环境必须启用Kerberos:
<property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <property> <name>yarn.resourcemanager.principal</name> <value>yarn/_HOST@REALM</value> </property>9.2 网络加密
启用RPC加密:
<property> <name>hadoop.rpc.protection</name> <value>privacy</value> </property>9.3 访问控制
配置队列ACL:
<property> <name>yarn.scheduler.capacity.root.queuename.acl_submit_applications</name> <value>user1,user2</value> </property>10. 实际案例:电商日志分析集群配置
去年我们为某电商平台部署的YARN集群配置如下(20节点):
硬件配置:
- Master节点:32核/128GB内存/2TB SSD ×3
- Worker节点:16核/64GB内存/8TB HDD ×20
yarn-site.xml关键参数:
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>etl,analytics,realtime</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>57344</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>14</value> </property>性能表现:
- 日均处理日志量:~15TB
- 平均作业完成时间:比原有集群缩短40%
- 资源利用率:稳定在75-85%之间
这个案例中最大的教训是初期低估了磁盘I/O的压力,后来通过调整HDFS的dfs.datanode.handler.count和YARN的本地磁盘分配策略才解决性能瓶颈。