Spark静态内存模型和统一内存模型详解

523

内存管理接口(MemoryManger)

MemoryManger类中有6个重要的方法:

3个是申请内存的:acquire

3个是释放内存的:release

以上者3个申请内存和3个释放内存的方法,其实就是对申请到的总内存进行一种逻辑上的管理规划

堆内内存和堆外内存是真实存在的一个内存区域,执行内存和存储堆存都是堆内和堆外内存的一个逻辑区划的概念

1、Spark1.X的静态内存模型(StaticMemoryManger)

执行内存和存储内存相互之间不能占用

2、Spark2.x的统一内存模型(UnifiedMemoryManger)

执行内存和存储内存相互之间能占用

3、注意:每一个Executor中的线程池类型

Executors.newCachedThreadPool();

4、Spark.default.parallelism

如果master是local:默认的分区数是1个,而且没有executor
如果master是spark:默认的分区数是2个

每一个stage中到底有多少个task由谁决定?
划分stage的标准:shuffle算子---宽依赖

在一个stage中有可能有多个RDD
每一个stage中的task总数,是由这个stage中的最后一个RDD分区数决定的

Spark还是从HDFS读取数据,使用的方式,默认情况下依然是TextInputFormat
默认情况下,MapReduce的数据读取规则是由TextInputFormat和LineRecorderReader决定的
默认情况下,其实就是一个split对应一个task,每个元素的读取方式依然是逐行读取形成为一个元素

Mapper:key,value
RDD[String]:key