以下是使用 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 配置目录
- 检查 YARN 集群是否正常运行 (
- 内存不足错误 :
- 调整
spark.executor.memory
和spark.driver.memory
- 检查 YARN 内存总量 (
yarn-site.xml
中的yarn.nodemanager.resource.memory-mb
)
- 调整
- 历史服务器无法访问 :
- 确保 HDFS 目录
/spark-logs
存在且权限正确 - 检查 History Server 日志 (
$SPARK_HOME/logs
)
- 确保 HDFS 目录
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>