Spark部署模式、任务提交

简介: Spark部署模式与任务提交

Spark部署模式与任务提交



一、作业提交

1.1 spark-submit

Spark 所有模式均使用 spark-submit 命令提交作业,其格式如下:


./bin/spark-submit \
  --class <main-class> \        # 应用程序主入口类
  --master <master-url> \       # 集群的 Master Url
  --deploy-mode <deploy-mode> \ # 部署模式
  --conf <key>=<value> \        # 可选配置       
  ... # other options    
  <application-jar> \           # Jar 包路径 
  [application-arguments]       #传递给主入口类的参数


需要注意的是:在集群环境下,application-jar 必须能被集群中所有节点都能访问,可以是 HDFS 上的路径;也可以是本地文件系统路径,如果是本地文件系统路径,则要求集群中每一个机器节点上的相同路径都存在该 Jar 包。


其他详细参数:

image.png


• num-executors:该作业总共需要多少executor进程执行


– 建议:每个作业运行一般设置50~100个左右较合适


• executor-memory:设置每个executor进程的内存, num-executors* executor-


memory代表作业申请的总内存量(尽量不要超过最大总内存的1/3~1/2)


– 建议:设置4G~8G较合适


• executor-cores:每个executor进程的CPU Core数量,该参数决定每个


executor进程并行执行task线程的能力, num-executors* executor-cores代表


作业申请总CPU core数(不要超过总CPU Core的1/3~1/2 )


– 建议:设置2~4个较合适


spark.storage.memoryFraction:设置RDD持久化数据在executor内存中能占的比例,默认0.6,即默认executor 60%的内存可以保存持久化RDD数据

driver-memory:

– 建议:通常不用设置,一般1G就够了,若出现使用collect算子将RDD数据全部拉取到Driver上处理,就必须确保该值足够大,否则OOM内存溢出


• spark.default.parallelism:并行度,每个stage的默认task数量


– 建议:设置500~1000较合适,默认一个HDFS的block对应一个task,Spark默认值偏少,这样导致不能充分利用资源


– 建议:若有较多的持久化操作,可以设置高些,超出内存的会频繁gc导致运行缓慢


• spark.shuffle.memoryFraction:聚合操作占executor内存的比例,默认0.2


– 建议:若持久化操作较少,但shuffle较多时,可降低持久化内存占比,提高shuffle操作内存占比


1.2 deploy-mode

deploy-mode 有 cluster 和 client 两个可选参数,默认为 client。这里以 Spark On Yarn 模式对两者进行说明 :


在 cluster 模式下,Spark Drvier 在应用程序的 Master 进程内运行,该进程由群集上的 YARN 管理,提交作业的客户端可以在启动应用程序后关闭;


在 client 模式下,Spark Drvier 在提交作业的客户端进程中运行,Master 进程仅用于从 YARN 请求资源。


1.3 master-url

master-url 的所有可选参数如下表所示:


Master URL Meaning

local 使用一个线程本地运行 Spark

local[K] 使用 K 个 worker 线程本地运行 Spark

local[K,F] 使用 K 个 worker 线程本地运行 , 第二个参数为 Task 的失败重试次数

local[*] 使用与 CPU 核心数一样的线程数在本地运行 Spark

local[*,F] 使用与 CPU 核心数一样的线程数在本地运行 Spark 第二个参数为 Task 的失败重试次数

spark://HOST:PORT 连接至指定的 standalone 集群的 master 节点。端口号默认是 7077。

spark://HOST1:PORT1,HOST2:PORT2 如果 standalone 集群采用 Zookeeper 实现高可用,则必须包含由 zookeeper 设置的所有 master 主机地址。

mesos://HOST:PORT 连接至给定的 Mesos 集群。端口默认是 5050。对于使用了 ZooKeeper 的 Mesos cluster 来说,使用 mesos://zk://... 来指定地址,使用 --deploy-mode cluster 模式来提交。

yarn 连接至一个 YARN 集群,集群由配置的 HADOOP_CONF_DIR 或者 YARN_CONF_DIR 来决定。使用 --deploy-mode 参数来配置 client 或 cluster 模式。

下面主要介绍三种常用部署模式及对应的作业提交方式。


二、Local模式

Local 模式下提交作业最为简单,不需要进行任何配置,提交命令如下:


# 本地模式提交应用
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100   # 传给 SparkPi 的参数

spark-examples_2.11-2.4.0.jar 是 Spark 提供的测试用例包,SparkPi 用于计算 Pi 值,执行结果如下:

image.png



三、Standalone模式

Standalone 是 Spark 提供的一种内置的集群模式,采用内置的资源管理器进行管理。下面按照如图所示演示 1 个 Mater 和 2 个 Worker 节点的集群配置,这里使用两台主机进行演示:

image.png

hadoop001: 由于只有两台主机,所以 hadoop001 既是 Master 节点,也是 Worker 节点;

image.png

hadoop002 : Worker 节点。

image.png


3.1 环境配置

首先需要保证 Spark 已经解压在两台主机的相同路径上。然后进入 hadoop001 的 ${SPARK_HOME}/conf/ 目录下,拷贝配置样本并进行相关配置:


# cp spark-env.sh.template spark-env.sh
在 spark-env.sh 中配置 JDK 的目录,完成后将该配置使用 scp 命令分发到 hadoop002 上:
# JDK安装位置
JAVA_HOME=/usr/java/jdk1.8.0_201


3.2 集群配置

在 ${SPARK_HOME}/conf/ 目录下,拷贝集群配置样本并进行相关配置:


# cp slaves.template slaves
指定所有 Worker 节点的主机名:
# A Spark Worker will be started on each of the machines listed below.
hadoop001
hadoop002

这里需要注意以下三点:


主机名与 IP 地址的映射必须在 /etc/hosts 文件中已经配置,否则就直接使用 IP 地址;


每个主机名必须独占一行;


Spark 的 Master 主机是通过 SSH 访问所有的 Worker 节点,所以需要预先配置免密登录。


3.3 启动

使用 start-all.sh 代表启动 Master 和所有 Worker 服务。


./sbin/start-master.sh


访问 8080 端口,查看 Spark 的 Web-UI 界面,,此时应该显示有两个有效的工作节点:

image.png



3.4 提交作

# 以client模式提交到standalone集群 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop001:7077 \
--executor-memory 2G \
--total-executor-cores 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100
# 以cluster模式提交到standalone集群 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \  # 配置此参数代表开启监督,如果主应用程序异常退出,则自动重启 Driver
--executor-memory 2G \
--total-executor-cores 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100



3.5 可选配置

在虚拟机上提交作业时经常出现一个的问题是作业无法申请到足够的资源:


Initial job has not accepted any resources;

check your cluster UI to ensure that workers are registered and have sufficient resources

image.png


这时候可以查看 Web UI,我这里是内存空间不足:提交命令中要求作业的 executor-memory 是 2G,但是实际的工作节点的 Memory 只有 1G,这时候你可以修改 --executor-memory,也可以修改 Woker 的 Memory,其默认值为主机所有可用内存值减去 1G。

image.png


关于 Master 和 Woker 节点的所有可选配置如下,可以在 spark-env.sh 中进行对应的配置:

Environment Variable(环境变量) Meaning(含义)

SPARK_MASTER_HOST master 节点地址

SPARK_MASTER_PORT master 节点地址端口(默认:7077)

SPARK_MASTER_WEBUI_PORT master 的 web UI 的端口(默认:8080)

SPARK_MASTER_OPTS 仅用于 master 的配置属性,格式是 "-Dx=y"(默认:none),所有属性可以参考官方文档:spark-standalone-mode

SPARK_LOCAL_DIRS spark 的临时存储的目录,用于暂存 map 的输出和持久化存储 RDDs。多个目录用逗号分隔

SPARK_WORKER_CORES spark worker 节点可以使用 CPU Cores 的数量。(默认:全部可用)

SPARK_WORKER_MEMORY spark worker 节点可以使用的内存数量(默认:全部的内存减去 1GB);

SPARK_WORKER_PORT spark worker 节点的端口(默认: random(随机))

SPARK_WORKER_WEBUI_PORT worker 的 web UI 的 Port(端口)(默认:8081)

SPARK_WORKER_DIR worker 运行应用程序的目录,这个目录中包含日志和暂存空间(default:SPARK_HOME/work)

SPARK_WORKER_OPTS 仅用于 worker 的配置属性,格式是 "-Dx=y"(默认:none)。所有属性可以参考官方文档:spark-standalone-mode

SPARK_DAEMON_MEMORY 分配给 spark master 和 worker 守护进程的内存。(默认: 1G)

SPARK_DAEMON_JAVA_OPTS spark master 和 worker 守护进程的 JVM 选项,格式是 "-Dx=y"(默认:none)

SPARK_PUBLIC_DNS spark master 和 worker 的公开 DNS 名称。(默认:none)


四、Spark on Yarn模式

Spark 支持将作业提交到 Yarn 上运行,此时不需要启动 Master 节点,也不需要启动 Worker 节点。


4.1 配置

在 spark-env.sh 中配置 hadoop 的配置目录的位置,可以使用 YARN_CONF_DIR 或 HADOOP_CONF_DIR 进行指定:


YARN_CONF_DIR=/usr/app/hadoop-2.6.0-cdh5.15.2/etc/hadoop
# JDK安装位置
JAVA_HOME=/usr/java/jdk1.8.0_201


4.2 启动

必须要保证 Hadoop 已经启动,这里包括 YARN 和 HDFS 都需要启动,因为在计算过程中 Spark 会使用 HDFS 存储临时文件,如果 HDFS 没有启动,则会抛出异常。


# start-yarn.sh
# start-dfs.sh


4.3 提交应用

#  以client模式提交到yarn集群 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--executor-memory 2G \
--num-executors 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100
#  以cluster模式提交到yarn集群 
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--executor-memory 2G \
--num-executors 10 \
/usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \
100




目录
相关文章
|
2月前
|
存储 缓存 分布式计算
Spark任务OOM问题如何解决?
大家好,我是V哥。在实际业务中,Spark任务常因数据量过大、资源分配不合理或代码瓶颈导致OOM(Out of Memory)。本文详细分析了各种业务场景下的OOM原因,并提供了优化方案,包括调整Executor内存和CPU资源、优化内存管理策略、数据切分及减少宽依赖等。通过综合运用这些方法,可有效解决Spark任务中的OOM问题。关注威哥爱编程,让编码更顺畅!
199 3
|
2月前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
177 6
|
2月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
71 2
|
4月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何开发ODPS Spark任务
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4月前
|
分布式计算 资源调度 大数据
【决战大数据之巅】:Spark Standalone VS YARN —— 揭秘两大部署模式的恩怨情仇与终极对决!
【8月更文挑战第7天】随着大数据需求的增长,Apache Spark 成为关键框架。本文对比了常见的 Spark Standalone 与 YARN 部署模式。Standalone 作为自带的轻量级集群管理服务,易于设置,适用于小规模或独立部署;而 YARN 作为 Hadoop 的资源管理系统,支持资源的统一管理和调度,更适合大规模生产环境及多框架集成。我们将通过示例代码展示如何在这两种模式下运行 Spark 应用程序。
268 3
|
3月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
47 5
|
6月前
|
分布式计算 运维 Serverless
EMR Serverless Spark PySpark流任务体验报告
阿里云EMR Serverless Spark是一款全托管的云原生大数据计算服务,旨在简化数据处理流程,降低运维成本。测评者通过EMR Serverless Spark提交PySpark流任务,体验了从环境准备、集群创建、网络连接到任务管理的全过程。通过这次测评,可以看出阿里云EMR Serverless Spark适合有一定技术基础的企业,尤其是需要高效处理大规模数据的场景,但新用户需要投入时间和精力学习和适应。
7187 43
EMR Serverless Spark PySpark流任务体验报告
|
3月前
|
SQL 机器学习/深度学习 分布式计算
Spark适合处理哪些任务?
【9月更文挑战第1天】Spark适合处理哪些任务?
192 3
|
4月前
|
存储 分布式计算 供应链
Spark在供应链核算中应用问题之通过Spark UI进行任务优化如何解决
Spark在供应链核算中应用问题之通过Spark UI进行任务优化如何解决
|
5月前
|
分布式计算 Java Serverless
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
本文以 ECS 连接 EMR Serverless Spark 为例,介绍如何通过 EMR Serverless spark-submit 命令行工具进行 Spark 任务开发。
426 7
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务