随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化。
由于篇幅较长,所以在这里分篇组织,如果要看最新完整的网页版内容,可以戳这里:http://spark-config.readthedocs.org/,主要是便于更新内容
schedule调度相关
调度相关的参数设置,大多数内容都很直白,其实无须过多的额外解释,不过基于这些参数的常用性(大概会是你针对自己的集群第一步就会配置的参数),这里多少就其内部机制做一些解释。
spark.cores.max
一个集群最重要的参数之一,当然就是CPU计算资源的数量。spark.cores.max 这个参数决定了在Standalone和Mesos模式下,一个Spark应用程序所能申请的CPU Core的数量。如果你没有并发跑多个Spark应用程序的需求,那么可以不需要设置这个参数,默认会使用spark.deploy.defaultCores的值(而spark.deploy.defaultCores的值默认为Int.Max,也就是不限制的意思)从而应用程序可以使用所有当前可以获得的CPU资源。
针对这个参数需要注意的是,这个参数对Yarn模式不起作用,YARN模式下,资源由Yarn统一调度管理,一个应用启动时所申请的CPU资源的数量由另外两个直接配置Executor的数量和每个Executor中core数量的参数决定。(历史原因造成,不同运行模式下的一些启动参数个人认为还有待进一步整合)
此外,在Standalone模式等后台分配CPU资源时,目前的实现中,在spark.cores.max允许的范围内,基本上是优先从每个Worker中申请所能得到的最大数量的CPU core给每个Executor,因此如果人工限制了所申请的Max Core的数量小于Standalone和Mesos模式所管理的CPU数量,可能发生应用只运行在集群中部分节点上的情况(因为部分节点所能提供的最大CPU资源数量已经满足应用的要求),而不是平均分布在集群中。通常这不会是太大的问题,但是如果涉及数据本地性的场合,有可能就会带来一定的必须进行远程数据读取的情况发生。理论上,这个问题可以通过两种途径解决:一是Standalone和Mesos的资源管理模块自动根据节点资源情况,均匀分配和启动Executor,二是和Yarn模式一样,允许用户指定和限制每个Executor的Core的数量。 社区中有一个PR试图走第二种途径来解决类似的问题,不过截至我写下这篇文档为止(2014.8),还没有被Merge。
spark.task.cpus
这个参数在字面上的意思就是分配给每个任务的CPU的数量,默认为1。实际上,这个参数并不能真的控制每个任务实际运行时所使用的CPU的数量,比如你可以通过在任务内部创建额外的工作线程来使用更多的CPU(至少目前为止,将来任务的执行环境是否能通过LXC等技术来控制还不好说)。它所发挥的作用,只是在作业调度时,每分配出一个任务时,对已使用的CPU资源进行计数。也就是说只是理论上用来统计资源的使用情况,便于安排调度。因此,如果你期望通过修改这个参数来加快任务的运行,那还是赶紧换个思路吧。这个参数的意义,个人觉得还是在你真的在任务内部自己通过任何手段,占用了更多的CPU资源时,让调度行为更加准确的一个辅助手段。
spark.scheduler.mode
这个参数决定了单个Spark应用内部调度的时候使用FIFO模式还是Fair模式。是的,你没有看错,这个参数只管理一个Spark应用内部的多个没有依赖关系的Job作业的调度策略。
如果你需要的是多个Spark应用之间的调度策略,那么在Standalone模式下,这取决于每个应用所申请和获得的CPU资源的数量(暂时没有获得资源的应用就Pending在那里了),基本上就是FIFO形式的,谁先申请和获得资源,谁就占用资源直到完成。而在Yarn模式下,则多个Spark应用间的调度策略由Yarn自己的策略配置文件所决定。
那么这个内部的调度逻辑有什么用呢?如果你的Spark应用是通过服务的形式,为多个用户提交作业的话,那么可以通过配置Fair模式相关参数来调整不同用户作业的调度和资源分配优先级。
spark.locality.wait
spark.locality.wait和spark.locality.wait.process,spark.locality.wait.node, spark.locality.wait.rack这几个参数影响了任务分配时的本地性策略的相关细节。
Spark中任务的处理需要考虑所涉及的数据的本地性的场合,基本就两种,一是数据的来源是HadoopRDD; 二是RDD的数据来源来自于RDD Cache(即由CacheManager从BlockManager中读取,或者Streaming数据源RDD)。其它情况下,如果不涉及shuffle操作的RDD,不构成划分Stage和Task的基准,不存在判断Locality本地性的问题,而如果是ShuffleRDD,其本地性始终为No Prefer,因此其实也无所谓Locality。
在理想的情况下,任务当然是分配在可以从本地读取数据的节点上时(同一个JVM内部或同一台物理机器内部)的运行时性能最佳。但是每个任务的执行速度无法准确估计,所以很难在事先获得全局最优的执行策略,当Spark应用得到一个计算资源的时候,如果没有可以满足最佳本地性需求的任务可以运行时,是退而求其次,运行一个本地性条件稍差一点的任务呢,还是继续等待下一个可用的计算资源已期望它能更好的匹配任务的本地性呢?
这几个参数一起决定了Spark任务调度在得到分配任务时,选择暂时不分配任务,而是等待获得满足进程内部/节点内部/机架内部这样的不同层次的本地性资源的最长等待时间。默认都是3000毫秒。
基本上,如果你的任务数量较大和单个任务运行时间比较长的情况下,单个任务是否在数据本地运行,代价区别可能比较显著,如果数据本地性不理想,那么调大这些参数对于性能优化可能会有一定的好处。反之如果等待的代价超过带来的收益,那就不要考虑了。
特别值得注意的是:在处理应用刚启动后提交的第一批任务时,由于当作业调度模块开始工作时,处理任务的Executors可能还没有完全注册完毕,因此一部分的任务会被放置到No Prefer的队列中,这部分任务的优先级仅次于数据本地性满足Process级别的任务,从而被优先分配到非本地节点执行,如果的确没有Executors在对应的节点上运行,或者的确是No Prefer的任务(如shuffleRDD),这样做确实是比较优化的选择,但是这里的实际情况只是这部分Executors还没来得及注册上而已。这种情况下,即使加大本节中这几个参数的数值也没有帮助。针对这个情况,有一些已经完成的和正在进行中的PR通过例如动态调整No Prefer队列,监控节点注册比例等等方式试图来给出更加智能的解决方案。不过,你也可以根据自身集群的启动情况,通过在创建SparkContext之后,主动Sleep几秒的方式来简单的解决这个问题。
spark.speculation
spark.speculation以及spark.speculation.interval,spark.speculation.quantile, spark.speculation.multiplier等参数调整Speculation行为的具体细节,Speculation是在任务调度的时候,如果没有适合当前本地性要求的任务可供运行,将跑得慢的任务在空闲计算资源上再度调度的行为,这些参数调整这些行为的频率和判断指标,默认是不使用Speculation的。
通常来说很难正确的判断是否需要Speculation,能真正发挥Speculation用处的场合,往往是某些节点由于运行环境原因,比如CPU资源由于某种原因被占用,磁盘损坏导致IO缓慢造成任务执行速度异常的情况,当然前提是你的分区任务不存在仅能被执行一次,或者不能同时执行多个拷贝等情况。Speculation任务参照的指标通常是其它任务的执行时间,而实际的任务可能由于分区数据尺寸不均匀,本来就会有时间差异,加上一定的调度和IO的随机性,所以如果一致性指标定得过严,Speculation可能并不能真的发现问题,反而增加了不必要的任务开销,定得过宽,大概又基本相当于没用。
个人觉得,如果你的集群规模比较大,运行环境复杂,的确可能经常发生执行异常,加上数据分区尺寸差异不大,为了程序运行时间的稳定性,那么可以考虑仔细调整这些参数。否则还是考虑如何排除造成任务执行速度异常的因数比较靠铺一些。
当然,我没有实际在很大规模的集群上运行过Spark,所以如果看法有些偏颇,还请有实际经验的XD指正。
相关推荐
3. **配置Spark**:修改`conf\spark-env.sh`(或者在Windows上是`conf\spark-env.cmd`),根据你的环境配置JVM参数、Hadoop相关路径等。 4. **验证安装**:打开命令行,输入`pyspark`或`spark-shell`启动交互式...
### dolphinScheduler海豚调度器动态传递任务执行参数 #### 一、重要性及应用场景 **dolphinScheduler**(简称DS)是一款强大的分布式任务调度平台,支持多种类型的作业执行,如Shell、Python、Spark等。它能够...
Apache Spark作为一款高效的大数据处理框架,在其内部有着复杂的任务调度与执行机制。本文将深入探讨Spark中Task执行期间的具体流程以及相关函数调用的关系。 #### 准备工作 在开始之前,请确保满足以下条件: 1. ...
《Hive on Spark安装配置详解》 在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,常用于大规模数据集的查询和分析。然而,Hive默认使用MapReduce作为执行引擎,由于MapReduce的磁盘I/O特性,其性能相对较...
### Hadoop & Spark 安装、环境配置、使用教程及应用项目详解 #### 一、Hadoop & Spark 安装与环境配置 ##### 1. Hadoop 安装与环境配置 **步骤详解:** - **下载Hadoop安装包:** - 访问Apache Hadoop官方网站...
### Hadoop与Spark知识点详解 #### 一、Hadoop概览 Hadoop作为一个开源的分布式存储和计算框架,在大数据处理领域具有举足轻重的地位。它最初由Apache开发,核心功能在于提供高度可靠且可扩展的数据存储解决方案...
### Spark:Executor分配详解 #### 一、Spark的资源分配机制概述 在深入探讨Executor的分配之前...在实际部署Spark集群时,开发者应该根据具体的应用场景和资源限制来调整Executor的相关配置,以实现最佳的性能表现。
Driver进程主要负责创建Spark上下文、提交作业(Job)以及协调任务(Task)的调度;而Executor进程则在各个工作节点上执行具体的计算任务,并为需要持久化的RDD提供存储功能。本文主要关注Executor进程中的内存管理。 #...
### Hadoop & Spark 使用教程详解 #### Hadoop 使用教程 **一、安装与配置** 1. **下载与安装Hadoop** - 访问官方网站获取最新版本的Hadoop压缩包。 - 解压并安装Hadoop,确保设置正确的`JAVA_HOME`环境变量。 ...
- **spark-defaults.conf**: Spark 提交 Job 时的默认配置文件,用于定义 Spark 的全局配置参数,例如 Executor 的内存大小等。 - **spark-env.sh**: Spark 的环境变量配置文件,可以设置一些特定于系统的环境变量,...
SparkCore是Apache Spark的核心组件,它是大数据处理框架Spark的基础,主要负责分布式计算任务的调度、内存管理和集群资源的协调。本篇文章将详细讲解SparkCore的基本概念、架构、核心功能以及如何进行快速入门。 ...
- `SparkContext`的创建需要一个`SparkConf`对象作为输入,该对象包含了Spark集群配置的各种参数。 - 在`WordCount`示例中,`SparkConf`对象被用来设置应用名称和主节点地址。 ### spark-submit - `spark-submit`是...
- **解压Spark**:安装时通常需要解压Spark的二进制包,并根据系统环境配置相关目录。 - **配置文件**:主要涉及`spark-env.sh`,用于设定JDK路径、主节点等环境变量,`slaves`文件列出集群中的工作节点。 - **...
5. **性能优化**:Spark的性能优化涉及多个方面,包括内存管理(如Tungsten项目的代码生成和动态资源分配)、数据缓存策略、任务调度优化(如动态调整executor数量)、以及网络传输优化(如使用Tungsten进行序列化和...
总结,Spark Submit 是 Spark 集群管理和任务调度的关键工具,理解和掌握其使用方法对于提升 Spark 应用的性能和稳定性至关重要。2020年7月4日的Spark峰会提供了宝贵的实践经验,帮助开发者更好地利用 Spark 解决...
在搭建Hadoop和Spark集群的过程中...总的来说,搭建Hadoop和Spark集群是一项涉及多步骤、多组件配置的任务,要求对分布式系统有深入理解。正确配置和调试这些组件,才能确保集群稳定运行,实现大数据处理和分析的目标。
- **Master/Worker模式**: Spark集群通常采用Master/Worker架构,其中Master节点负责任务调度,Worker节点执行具体计算任务。 - **部署方式**: 可选择Standalone模式或者YARN模式。本文重点介绍YARN模式下的部署。 ...
读者可以从中了解到Spark如何实现高效的分布式计算,以及如何通过配置参数优化系统性能。通过阅读源码,开发者可以更精确地定位问题,进行定制化的开发和优化。 总的来说,《Spark技术内幕》是一本深度解析Spark的...
2. **设置选项列表**:在 “选项列表” 中,可以配置各种参数来控制 Spark 任务的运行环境,例如: - `--driver-memory 2G`:设置 Driver 的内存大小为 2GB。 - `--executor-memory 2G`:每个 Executor 的内存大小...
### Spark相关面试知识点详解 #### 一、Spark基础概念及原理 **1.1 Spark简介** Apache Spark是一款专为大规模数据处理而设计的快速通用计算引擎。它支持多种编程语言如Scala、Java、Python等,并提供了高效的...