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.shSPARK_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