在spark ui上的现象是时间过长且gc的时间比较长,现象截图以下:缓存
原理分析数据结构
平常使用中,咱们经过spark.executor.memory
来控制一个executor最多能够使用的内存大小,其实是经过设置Executor的JVM的Heap大小实现的。ui
Executor的内存界限分明,分别由3部分组成:execution,storage和system。spa
execution
execution空间经过设置spark.shuffle.memoryFraction
参数来控制大小,默认为0.2。为了不shuffle,join,排序和聚合这些操做直接将数据写入磁盘,所设置的buffer大小,减小了磁盘读写的次数。3d
storage
storage空间经过设置spark.storage.memoryFraction
参数来控制大小,默认为0.6。用于存储用户显示调用的persist,cache,broadcast等命令存储的数据空间。code
system
程序运行须要的空间,存储一些spark内部的元数据信息,用户的数据结构,避免一些不寻常的大记录带来的OOM。orm
以前的管理方式,最明显的就是对execution和storage空间进行了明显的划分。举个例子,一些任务可能对数据缓存的需求并非很高,就会形成storage空间的浪费。blog
spark.executor.memory
|
spark.storage.memoryFraction | spark.shuffle.memoryFraction | |
原来 | 36G | 默认值0.6 | 默认值0.2 |
修改后 | 48G | 0.4 | 0.5 |
修改后的spark ui 截图,处理时间从22分钟降到4.3分钟排序