Spark的执行过程
SparkSQL的执行过程
Spark的内存模型
YARN
1.日志管理是由NodeManager进行管理
ID下的 application_1505751916576_69536280 点击进入
Tracking URL: ApplicationMaster
Spark的on Yarn模式,其资源分配是交给Yarn的ResourceManager来进行管理的
Attempt ID 那一行有 Logs 点击 Logs 进入日志
每个Container会输出三类日志
prelaunch.err prelaunch.out
gclog : Total file length is 13623 bytes.
stderr : Total file length is 6484551 bytes.
stdout : Total file length is 14809 bytes.
2. 转存到hdfs的日志,生命周期不再由Nodemanager负责,
而是由JobHistory 服务负责管理。
每个日志文件最大存留时间为yarn.log-aggregation.retain-seconds(单位为s,默认为3*60*60,即3小时)。
ResourceManager NodeManager ApplicationMaster 端的日志 container
Tracking UI
ApplicationMaster
executor节点上的日志
一个driver
executor后可以看到 其他executor
01.特点是: 存储内存和计算内存在同一空间,并且可以动态的使用彼此的空闲区域
02.构成:
Spark在一个Executor中的内存分为三块,一块是execution内存,一块是storage内存,一块是other内存
内存分为堆内内存和堆外内存
001.堆外内存式由Spark控制,直接在工作节点的系统内存中开辟空间,即对于大内存,Spark自行和内存打交道
这部分用户代码无法直接操作。
堆外内存部分主要用于JVM自身,如字符串、NIO Buffer等开销,
另外还有部分堆外内存由spark.memory.offHeap.enabled及spark.memory.offHeap.size控制的堆外内存,这部分也归offheap,但主要是供统一内存管理使用的。
002.堆内内存依赖JVM,一般我们使用的Spark.driver.memory 和 spark.executor.memory
动态占用-- 存储内存和计算内存
storage memory 和 Executor memory
Executor memory: 主要存储Shuffle、Join、Sort、Aggregation等计算过程中的临时数据;
Driver的功能
1)一个Spark作业运行时包括一个Driver进程,也是作业的主进程,具有main函数,
并且有SparkContext的实例,是程序的人口点;
2)功能:负责向集群申请资源,向master注册信息,负责了作业的调度,
负责作业的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler
Executor
Executor 的内存管理建立在 JVM 的内存管理之上
Executor 内运行的并发任务共享 JVM 堆内内存,这些内存被规划为 存储(Storage)内存 和 执行(Execution)内存
一块儿是专门用来给RDD的cache、persist操作进行RDD数据缓存用的;
另外一块儿,用来给spark算子函数的运行使用的,存放函数中自己创建的对象
1. Driver 内存不够 2. Executor 内存不够
Driver 内存不够: 1. 读取数据太大
2. 数据回传
Executor 内存不够: 1. map 类操作产生大量数据,包括 map、flatMap、filter、mapPartitions 等
2. shuffle 后产生数据倾斜
Driver内存溢出的解决方式:
读取数据太大 增加 Driver 内存,具体做法为设置参数 --driver-memory
collect 大量数据回传 Driver,造成内存溢出:解决思路是 分区输出
Executor内存溢出解决方式
map 过程产生大量对象
解决思路是 减少每个 task 的大小,从而减少每个 task 的输出;
具体做法是在 会产生大量对象的 map 操作前 添加 repartition(重新分区) 方法,分区成更小的块传入 map
解决思路: 用 mapPartitions 替代多个 map,减少 Executor 内存压力
shuffle:
broadcast join
缓存 RDD 既可以节省内存,也可以提高性
DataFrame 代替 RDD
数据倾斜:
过滤导致倾斜的 key
使用随机 key 进行双重聚合
sample 采样对倾斜 key 单独进行 join
Reduce
增加 reduce 并行度其实就是增加 reduce 端 task 的数量, 这样每个 task 处理的数据量减少,避免 oom
判断 -- 定位 --确认 --解决
原文:https://www.cnblogs.com/ytwang/p/13665187.html