学习目标:
P34-42
学习内容:
1、算子的合理选择
2、序列化方式的合理选择
一、算子的合理选择
Spark中的RDD:RDD是可伸缩的数据集,解决了MR的每一步骤需要落实而造成的开销很大的问题。RDD 是一个基于分区的、只读的数据记录集抽象。RDD 只可以通过对持久存储或其他 RDD 进行确定性运算得来,这种运算被称为变换。常用的变换算子包括:map,filter 和 join。
用法基本相似,只不过是action和transformationaction的区别,写数据库一定要使用xxxpartition。
map VS map partition(分区)
foreach VS foreeach partition :常用于将数据写入到数据库中。
groupByKey VS reduceByKey: groupByKey是将每个元素的出现打印出来(元素,1,1,1,1) 需要使用map对出现次数求和。而reduceByKey直接就是(元素,总次数)前者的shuffle的数据量要多,因此在进行wordcount这类工作是应该优先考虑reduceByKey。
groupByKey所有的Key的数据都经过了shuffle,而reduceByKey是在map端做一个本地的聚合,然后将聚合后的数据进行shuffle。
collect:执行结果的数据都放在一个数组里,但是在数据量不清晰的情况下,所有数据都需要返回Driver里,但是Driver的内存是固定的,因此collect在我们无法确定Driver能存下多少数据量的情况下,这个算子要慎用。
coalesce VS repartition:coalesce(Int,Shuffle:Boolean = false),当我们不对shuffle定义,默认下为不进行Shuffle过程的,这事对分区的大小做调整,只能缩小,不能放大,并且一旦我们设置的值超过原来大小,则输出原来的值,而定义True,则可以进行更改啦。会导致数据倾斜。repartition将分区由少变多。
cache没有切断血缘关系,一般用于以后还会用到当前数据的相关数据。cache调用的是persist(),persist调用的是persist(MEMORY_ONLY)。
2、合理的序列化整合Spark使用为性能提速
序列化(Java)、序列化(Kyro)