一、spark原理
参考:
Hive on Spark调优_窗外的屋檐-CSDN博客_spark.executor.instancesSpark资源参数调优参数_TURING.DT-CSDN博客_spark 资源参数
1、Job——对应action算子:
包含很多task的并行计算,可以认为是Spark RDD 里面的action,每个action的计算会生成一个job。
用户提交的Job会提交给DAGScheduler,Job会被分解成Stage和Task。
2、Stage——对应Shuffle过程:
一个Job会被拆分为多组Task,每组任务被称为一个Stage就像Map Stage, Reduce Stage。
Stage的划分在RDD的论文中有详细的介绍,简单的说是以shuffle和result这两种类型来划分。在Spark中有两类task,一类是shuffleMapTask,一类是resultTask,第一类task的输出是shuffle所需数据【Map阶段】,第二类task的输出是result【Reduce阶段】,stage的划分也以此为依据,shuffle之前的所有变换是一个stage,shuffle之后的操作是另一个stage。
3、Task——对应一个rdd有多少个partition:
即 stage 下的一个任务执行单元,一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据.
4、Executor:
Executor是一个执行Task的容器,应用程序运行的监控和执行容器
它的主要职责是:
1、初始化程序要执行的上下文SparkEnv,解决应用程序需要运行时的jar包的依赖,加载类。
2、同时还有一个ExecutorBackend向cluster manager汇报当前的任务状态,这一方面有点类似hadoop的tasktracker和task。
总结:
Spark application的运行单元是task,资源分配单元是executor。task数的多少是和RDD的分区数相关的,整个application的并行度是 Executor数 * Task
二、参数调优
1、必调参数
num-executors/spark.executor.instances
executor-memory/spark.executor.memory
executor-cores/spark.executor.cores
2、优化参数
driver-memory:使用collect算子将RDD的数据全部拉取到Driver上进行处理,那么Driver的内存就要足够大,否则就会出现OMM内存溢出;
spark.default.parallelism:num-executors * executor-cores的2~3倍较为合适;
该参数用于设置每个stage的默认task数量。
三、一些概念
spark-session
spark-context



