Spark记录

RDD只是一个逻辑概念,在内存中并不会真正地为某个RDD分配存储空间(除非该RDD需要被缓存)。
数据操作分为transform()action()两种。
transform()是一个单向操作,rdd1进行操作后会产生新的rdd2,不会修改rdd1。

依赖

窄依赖(NarrowDependency)

新生成的childRDD中的每一个分区都依赖parentRDD中的一部分分区

一对一依赖

map() fliter()

区域依赖

union()

多对一依赖

cogroup() join()

多对多依赖

cartesian()

宽依赖(ShuffleDependency)

新生成的childRDD中的每一个分区都依赖parentRDD中的每个分区的一部分

数据分区方法

水平划分

按照元素的下标划分
常用于输入数据的划分(Map)

Hash划分

HashPartitioner
经常被用于数据Shuffle阶段(Reducer)

Range划分

采用抽样方法来估算数据区域边界

常用transformation()

map() mapValues()

fliter() filterByRange()

flatMap() flatMapValues()

sample() sampleByKey()

mapPartitions() mapPartitionsWithIndex()

partitionBy()

groupByKey()

reduceByKey()

aggregateByKey()

combineByKey()

foldByKey()

cogroup()/groupWith()

join()

cartesian()

sortByKey()

coalesce()

repartition()

repartitionAndSortWithinPartitions()

intersection()

distinct()

union()

zip()

zipPartitions()

zipWithIndex() zipWithUniqueId()

substractByKey()

subtract()

sortBy(func)

glom()

常用action()

count countByKey() countByValue()

collect() collectAsMap()

foreach() foreachPartition()

fold() reduce() aggregate()

treeAggregate() treeReduce()

reduceByKeyLocality()

take() first() takeOrdered() top()

max() min()

isEmpty()

lookup()

saveAsTextFile() saveAsObjectFile() saveAsHadoopFile() saveAsSequenceFile()

物理执行计划

将ShuffleDependency前后的计算逻辑分开

根据action()操作顺序将应用划分为作业(job)

根据ShuffleDependency依赖关系将job划分为执行阶段(stage)

根据分区计算将各个stage划分为计算任务(task)

根据每个stage中的最后一个RDD的分区个数决定生成task的个数。

Shuffle机制

Shuffle机制分为Shffle Write和Shuffle Read

数据分区问题

分区个数与下游stage的task个数一致

数据聚合问题

在线聚合,Shuffle Read阶段在每个record加入HashMap时,同时进行func()聚合操作。

map()端combine

目的是减少Shuffle数据量,只有包含聚合函数的数据操作需要进行map端combine

sort问题

Spark实现逻辑是:先聚合再排序

内存不足问题

内存+磁盘混合存储方案

内存管理机制

  1. 框架本身在处理数据时需要消耗内存
  2. 数据缓存,如将需要重复使用的数据缓存到内存中避免重复计算
  3. 用户代码消耗的内存
    在spark中,多个task以线程的方式运行在同一个Executor JVM中

统一内存管理模型

Framework Memory: 数据缓存空间和框架执行空间
Framework Memory 大小固定,设置了初始比例,可以动态调整

系统保留内存

使用较小的空间存储Spark框架产生的内部对象
spark.testing.ReservedMemory 默认300MB

用户代码空间

存储用户代码生成的对象

框架内存空间

spark.memory.fraction(default 0.6) * (heap - Reserved Memory)
至少要保证数据缓存空间具有约50%左右(spark.memory.storageFraction(default 0.5) * Framework memory)

可以使用堆外空间

spark.memory.offHeap.size

posted @ 2021-12-26 22:52  Yu\.W  阅读(40)  评论(0编辑  收藏  举报