spark环境配置
Spark 环境配置:本地调试用 Local,小集群用 Standalone,生产上 YARN
Spark 有三种运行模式,按复杂度从低到高:
| 模式 | 适用场景 | 特点 |
|---|---|---|
| Local | 开发调试、单元测试 | 单机跑,不用配置集群,最简单 |
| Standalone | 小规模集群、快速部署 | Spark 自带的集群管理,不需要 Hadoop |
| YARN | 生产环境、已有 Hadoop 集群 | 跟 HDFS 无缝集成,统一资源管理 |
Spark 有三种运行模式,按复杂度从低到高:
| 模式 | 适用场景 | 特点 |
|---|---|---|
| Local | 开发调试、单元测试 | 单机跑,不用配置集群,最简单 |
| Standalone | 小规模集群、快速部署 | Spark 自带的集群管理,不需要 Hadoop |
| YARN | 生产环境、已有 Hadoop 集群 | 跟 HDFS 无缝集成,统一资源管理 |
前置准备:Java + Spark 安装包
不管哪种模式,都需要先装好 Java 和 Spark。
Java 版本: JDK 8 或 11(推荐 8,兼容性最好)
下载 Spark:
Spark 安装包分两种:
| 包名 | 特点 | 适合谁 |
|---|---|---|
spark-x.x.x-bin-hadoopx.x |
自带 Hadoop 依赖 | 新手、快速测试 |
spark-x.x.x-bin-without-hadoop |
不带 Hadoop,需要手动关联 | 已有 Hadoop 环境 |
解压
tar -zxvf spark-3.1.1-bin-without-hadoop.tgz -C /usr/local/
mv /usr/local/spark-3.1.1-bin-without-hadoop /usr/local/spark
环境变量(~/.bash_profile):
export SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$PATH
生效:source ~/.bash_profile
如果用 without-hadoop 版本,还需要关联 Hadoop 类路径:
cd $SPARK_HOME/conf
cp spark-env.sh.template spark-env.sh
在 spark-env.sh 里加一行:
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
Local 模式:什么都不用配,直接跑
Local 模式是所有进程在单个 JVM 里跑,没有集群,没有分布式调度,用来验证 Spark 能不能用。
启动 Spark Shell:
spark-shell
成功的话会看到:
Spark context available as 'sc' (master = local[*], app id = local-xxx)
验证: 在 Shell 里跑 WordCount
val lines = sc.textFile("file:///path/to/wordcount.txt")
val counts = lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
counts.collect().foreach(println)
能正常输出结果,说明 Spark 本身装好了。
提交 Jar 包任务:
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
SPARK_HOME/examples/jars/spark-examples_2.12-3.1.1.jar \
10
local[2] 表示用 2 个线程模拟并行。
Standalone 模式:Spark 自带的集群
Standalone 是 Spark 内置的集群管理模式,不需要 Hadoop/YARN,适合小规模集群快速部署。
架构: 一个 Master 节点 + 多个 Worker 节点
配置 Worker($SPARK_HOME/conf/workers):
cp workers.template workers
编辑 workers,每行一个 Worker 节点的主机名:
localhost
# 如果有其他机器,加在这里
# slave1
# slave2
启动集群:
SPARK_HOME/sbin/start-all.sh
验证进程:
jps
应该看到 Master 和 Worker 两个进程
Web UI: http://localhost:8080,能看到集群资源(CPU 核心数、内存总量)
提交任务到 Standalone:
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://localhost:7077 \
--executor-memory 512m \
--total-executor-cores 2 \
SPARK_HOME/examples/jars/spark-examples_2.12-3.1.1.jar \
10
Master 地址默认是 spark://localhost:7077。
停止集群:
SPARK_HOME/sbin/stop-all.sh
YARN 模式:对接 Hadoop 生产环境
YARN 模式是生产环境最常用的——Spark 跑在 Hadoop YARN 上,跟 HDFS 天然集成。
前提条件:
- Hadoop 集群已启动(
start-dfs.sh+start-yarn.sh) - Spark 已经关联了 Hadoop 类路径(第一步已做)
配置 YARN(spark-env.sh,可选):
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
提交任务到 YARN:
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--executor-memory 512m \
--num-executors 2 \
SPARK_HOME/examples/jars/spark-examples_2.12-3.1.1.jar \
10
YARN 两种部署模式:
| 模式 | Driver 在哪 | 日志在哪 | 适用场景 |
|---|---|---|---|
--deploy-mode client |
提交任务的机器 | 客户端控制台 | 交互式调试、Spark Shell |
--deploy-mode cluster |
YARN 集群内 | YARN 日志 | 生产批量任务 |
验证任务状态:
- YARN Web UI:
http://localhost:8088 - 点击应用 ID 可以看 Spark 的任务详情
查看 YARN 应用日志:
yarn logs -applicationId application_xxx_xxx
三种模式快速对比
| Local | Standalone | YARN | |
|---|---|---|---|
| 是否需要 Hadoop | 否 | 否 | 是 |
| 集群管理 | 无(单 JVM) | Spark Master | YARN ResourceManager |
| 配置复杂度 | 最低 | 中 | 高 |
| 适合场景 | 开发调试 | 小规模生产 | 企业生产环境 |
| Master 参数 | local[*] |
spark://host:7077 |
yarn |
常见问题
1. spark-shell 起不来,报 ClassNotFoundException
without-hadoop 版本没关联 Hadoop 类路径。检查 spark-env.sh 里 SPARK_DIST_CLASSPATH 配置是否正确。
2. YARN 模式任务被 kill
YARN 默认检查虚拟内存,如果 Spark 申请的容器内存超了会被 kill。
测试环境可以临时关掉(yarn-site.xml):
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
3. 端口被占用
Standalone 模式下 8080(Master UI)或 7077(Master RPC)被占用。
改 spark-env.sh:
export SPARK_MASTER_WEBUI_PORT=8081
export SPARK_MASTER_PORT=7078