内存管理接口(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