【Spark】使用Spark集群搭建Yarn模式

以下是使用 YARN 作为资源管理器搭建 Spark 集群的详细步骤:

1. 环境准备

1.1 集群规划

假设已有 Hadoop YARN 集群(至少包含 NameNode、ResourceManager、NodeManager):

  • 主节点 :hadoop-master (192.168.1.100)
    • 运行 NameNode、ResourceManager
  • 从节点 :hadoop-worker1 (192.168.1.101)、hadoop-worker2 (192.168.1.102)
    • 运行 DataNode、NodeManager
1.2 系统要求
  • 所有节点安装 Hadoop 3.x 并正常运行 YARN
  • 所有节点安装 Java 8+(推荐 OpenJDK 11)
  • 所有节点安装 Spark 3.x(版本需与 Hadoop 兼容)

2. 安装 Spark

2.1 下载并解压 Spark

在所有节点执行:

bash

复制代码
wget https://downloads.apache.org/spark/spark-3.3.2/spark-3.3.2-bin-hadoop3.tgz
tar -zxvf spark-3.3.2-bin-hadoop3.tgz
mv spark-3.3.2-bin-hadoop3 /opt/spark
2.2 配置环境变量

在所有节点的 ~/.bashrc 中添加:

bash

复制代码
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
export HADOOP_CONF_DIR=/etc/hadoop/conf  # Hadoop 配置目录

使环境变量生效:

bash

复制代码
source ~/.bashrc

3. 配置 Spark 与 YARN 集成

3.1 修改 Spark 配置文件

所有节点$SPARK_HOME/conf 目录下:

3.1.1 spark-env.sh

复制模板并编辑:

bash

复制代码
cp spark-env.sh.template spark-env.sh

添加以下内容:

bash

复制代码
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64  # 根据实际路径修改
export HADOOP_CONF_DIR=/etc/hadoop/conf
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
export SPARK_EXECUTOR_CORES=2
export SPARK_EXECUTOR_MEMORY=2g
export SPARK_DRIVER_MEMORY=1g
3.1.2 spark-defaults.conf

复制模板并编辑:

bash

复制代码
cp spark-defaults.conf.template spark-defaults.conf

添加以下内容:

properties

复制代码
spark.master                     yarn
spark.submit.deployMode          cluster
spark.yarn.am.memory             1g
spark.yarn.am.cores              1

4. 验证 Hadoop YARN 集群

确保 YARN 集群正常运行:

bash

复制代码
# 在主节点检查 HDFS
hdfs dfsadmin -safemode leave
hdfs dfs -ls /

# 在主节点检查 YARN
yarn resourcemanager -format-state-store
yarn node -list

访问 YARN Web UI (http://hadoop-master:8088) 确认所有 NodeManager 正常注册。

5. 提交 Spark 应用到 YARN

5.1 测试 Spark Pi 示例

在任意节点执行:

bash

复制代码
spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master yarn \
  --deploy-mode cluster \
  $SPARK_HOME/examples/jars/spark-examples_2.12-3.3.2.jar \
  100

参数说明:

  • --master yarn:指定 YARN 作为资源管理器
  • --deploy-mode cluster:Driver 运行在 YARN 集群中
  • --deploy-mode client:Driver 运行在提交命令的客户端
5.2 查看应用状态
  • 通过 YARN Web UI (http://hadoop-master:8088) 查看应用运行状态
  • 通过 Spark History Server (http://hadoop-master:18080) 查看历史应用日志

6. 高级配置(可选)

6.1 启用 Spark History Server

spark-defaults.conf 中添加:

properties

复制代码
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs:///spark-logs
spark.history.fs.logDirectory    hdfs:///spark-logs

创建 HDFS 目录并启动服务:

bash

复制代码
hdfs dfs -mkdir -p /spark-logs
hdfs dfs -chmod 777 /spark-logs
start-history-server.sh
6.2 调整资源分配

根据集群规模调整以下参数(spark-defaults.conf):

properties

复制代码
spark.executor.memory            4g
spark.executor.cores             4
spark.dynamicAllocation.enabled  true
spark.shuffle.service.enabled    true

7. 故障排查

  • 应用无法提交
    • 检查 YARN 集群是否正常运行 (yarn node -list)
    • 确认 HADOOP_CONF_DIR 指向正确的 Hadoop 配置目录
  • 内存不足错误
    • 调整 spark.executor.memoryspark.driver.memory
    • 检查 YARN 内存总量 (yarn-site.xml 中的 yarn.nodemanager.resource.memory-mb)
  • 历史服务器无法访问
    • 确保 HDFS 目录 /spark-logs 存在且权限正确
    • 检查 History Server 日志 ($SPARK_HOME/logs)

8. 常用命令

bash

复制代码
# 启动 Spark Shell (YARN 模式)
spark-shell --master yarn --deploy-mode client

# 停止 History Server
stop-history-server.sh

# 查看 YARN 应用列表
yarn application -list

# 杀死 YARN 应用
yarn application -kill <application_id>
相关推荐
计算机编程小央姐6 小时前
【Spark+Hive+hadoop】基于spark+hadoop基于大数据的人口普查收入数据分析与可视化系统
大数据·hadoop·数据挖掘·数据分析·spark·课程设计
鲲志说6 小时前
数据洪流时代,如何挑选一款面向未来的时序数据库?IoTDB 的答案
大数据·数据库·apache·时序数据库·iotdb
没有bug.的程序员6 小时前
MVCC(多版本并发控制):InnoDB 高并发的核心技术
java·大数据·数据库·mysql·mvcc
nju_spy9 小时前
南京大学 - 复杂结构数据挖掘(一)
大数据·人工智能·机器学习·数据挖掘·数据清洗·南京大学·相似性分析
哈哈很哈哈9 小时前
Flink SlotSharingGroup 机制详解
java·大数据·flink
Insist7539 小时前
基于OpenEuler部署kafka消息队列
分布式·docker·kafka
豆豆豆大王10 小时前
头歌Kingbase ES内连接、外连接查询
大数据·数据库·elasticsearch
在未来等你10 小时前
Elasticsearch面试精讲 Day 20:集群监控与性能评估
大数据·分布式·elasticsearch·搜索引擎·面试
是店小二呀12 小时前
整合亮数据Bright Data与Dify构建自动化分析系统
大数据·自动化·dify·mcp·bright data
励志成为糕手13 小时前
Kafka选举机制深度解析:分布式系统中的民主与效率
分布式·kafka·linq·controller·isr机制