Spark多模式部署实战(从Local到YARN一站式通关)
1. 环境准备:从零搭建Spark实验环境
第一次接触Spark的朋友可能会被各种术语搞晕,其实部署Spark就像组装电脑一样简单。我建议使用Ubuntu 18.04作为实验系统,实测下来兼容性最好。下面是详细的环境清单:
- 虚拟机配置:VMware Workstation 16+ 或 VirtualBox 6.1+,分配至少4GB内存
- 基础软件栈:
- JDK 1.8(注意必须是Oracle JDK,OpenJDK可能遇到奇怪问题)
- Python 3.6+(推荐Anaconda3管理环境)
- Hadoop 2.7.7(仅YARN模式需要)
踩坑提醒:我曾因为使用OpenJDK 11导致Spark Shell无法启动,报错信息非常隐晦。建议用
java -version确认输出包含"Java(TM) SE Runtime Environment"
安装Hadoop时有个小技巧:先单独测试HDFS和YARN是否正常工作。我习惯用以下命令验证:
hdfs dfs -mkdir /test hdfs dfs -put /etc/hosts /test hadoop jar /path/to/hadoop-mapreduce-examples.jar wordcount /test/hosts /output2. Spark安装与Local模式实战
2.1 版本选择与安装
Spark官网提供了多个版本,新手常被各种打包版本搞懵。这里直接给结论:
- 学习环境选Pre-built for Apache Hadoop 2.7版本
- 生产环境选对应Hadoop版本的Without Hadoop版本
安装步骤其实就三步:
tar -xzf spark-3.3.1-bin-hadoop2.tgz -C /opt cd /opt && ln -s spark-3.3.1-bin-hadoop2 spark echo 'export SPARK_HOME=/opt/spark' >> ~/.bashrc2.2 Local模式快速验证
Local模式是Spark的"玩具车"模式,适合快速验证代码。启动交互式环境:
# Scala版本 spark-shell --master local[2] # Python版本 pyspark --master local[2]这里的local[2]表示使用2个线程,相当于模拟两个CPU核心。
做个简单测试(在spark-shell中):
val textFile = sc.textFile("file:///etc/hosts") textFile.filter(_.contains("localhost")).count()实用技巧:如果看到满屏INFO日志,可以修改
conf/log4j.properties,把log4j.rootCategory改为WARN
3. 伪分布式Standalone模式部署
3.1 关键配置详解
Standalone模式是Spark自带的集群模式,配置文件主要修改两个地方:
spark-env.sh:
export SPARK_MASTER_HOST=your_hostname export SPARK_WORKER_CORES=2 export SPARK_WORKER_MEMORY=4gworkers(旧版本叫slaves):
localhost3.2 服务启停与管理
启动集群就像开机关机一样简单:
# 一键启停 sbin/start-all.sh sbin/stop-all.sh # 单独控制组件 sbin/start-master.sh sbin/start-worker.sh spark://master:7077验证集群状态有两种方式:
- 命令行:
curl http://localhost:8080 - Web UI:浏览器访问
http://your_ip:8080
3.3 提交作业实战
用Standalone模式运行WordCount:
spark-submit --master spark://your_host:7077 \ --class org.apache.spark.examples.SparkPi \ $SPARK_HOME/examples/jars/spark-examples_2.12-3.3.1.jar \ 100遇到过的一个典型报错:
WARN TaskSchedulerImpl: Initial job has not accepted any resources这通常是资源不足导致的,解决方法要么增加worker,要么调小--executor-memory参数。
4. 集成YARN集群实战
4.1 前置条件检查
YARN模式下需要确保:
- Hadoop集群正常运行(
start-yarn.sh) HADOOP_CONF_DIR环境变量已设置- Spark配置中包含YARN支持
验证YARN是否就绪:
yarn node -list4.2 配置调优要点
在spark-defaults.conf中添加:
spark.yarn.jars hdfs:///spark/jars/* spark.driver.memory 2g spark.executor.instances 3建议提前上传Spark依赖包到HDFS:
hdfs dfs -mkdir /spark hdfs dfs -put $SPARK_HOME/jars/* /spark/jars/4.3 YARN作业提交
提交作业时有个部署模式的选择:
# 客户端模式(日志直接输出到控制台) spark-submit --master yarn --deploy-mode client ... # 集群模式(适合生产环境) spark-submit --master yarn --deploy-mode cluster ...常见问题处理:
- 内存不足:在
yarn-site.xml中调整yarn.nodemanager.resource.memory-mb - 类冲突:添加
--conf spark.executor.extraClassPath=/path/to/libs
5. 三种模式对比与选型建议
通过实际测试对比(8核CPU/16GB内存环境):
| 模式 | 启动速度 | 资源隔离 | 适合场景 | 最大并发 |
|---|---|---|---|---|
| Local | <3秒 | 无 | 开发调试 | 线程数 |
| Standalone | ~30秒 | 一般 | 专用Spark集群 | 节点×核数 |
| YARN | ~1分钟 | 完善 | 混合部署环境 | 队列配额 |
个人经验法则:
- 本地开发用Local模式
- 测试环境用Standalone(省资源)
- 生产环境必选YARN/Mesos
最后分享一个排查问题的万能命令:
# 查看详细日志(YARN模式) yarn logs -applicationId <app_id> | less