1、partitionBy:当hashCode为负时,抛异常:java.lang.ArrayIndexOutOfBoundsException,
at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:151)
2、rdd.partitionBy(new TdidPartitioner(10)).mapPartitionsWithIndex {
case (idx, value) =>
Iterator.single(idx, value)
}
A。返回值为Iterator中的value为Iterator,抛异常:NotSerializableException
- object not serializable (class: org.apache.spark.InterruptibleIterator, value: non-empty iterator)
B。把value改为Iterator.single(idx, value.toSet)
3、join于zipPartitions区别
tmpRdd.join(bloomFilterRdd)、tmpRdd.zipPartitions(bloomFilterRdd)
的区别:
A。join会先计算左边的rdd,然后计算右边的rdd,根据key join
B。zipPartitions,根据key,一个一个进行匹配
4、persist、以及导致shuffle增长的原因(streaming)
val tmpRDD = Analysis.analyserJoin(tdidRDD, filterRDD).persist()
//filterRDD.unpersist()
filterRDD = tmpRDD
//filterRDD.persist()
filterRDD.count() *** tmpRDD.count() ***
tmpRDD.unpersist()
问题描述:
循环使用filterRDD,tdidRDD每次都是不同的数据
A。在调用action操作之前,先调用unpersist又调用persist,算子会先执行上次操作的计算,因为unpersist把之前的计算释放,因为所有的计算在调用action操作时,才会真正的计算,unpersist则会把RDD标记为不需要persist,并且释放block块
B。如果是tmpRDD.count(),也会执行上次filterRDD的计算,因为count操作只是执行了tmpRDD之前的操作,下次用到filterRDD时,需要计算filterRDD的结果
C。每执行一次action操作,都会重新计算一遍,除非使用persisit方法
val tmpRDD = Analysis.analyserZip(tdidRDD, filterRDD)
filterRDD.count()
filterRDD.unpersist()
filterRDD = tmpRDD
*** 使用这种方式,不会导致shuffle增长 ***
5、join操作、co-partitioin
A。按相同的paritioner分区后,如果有mapPartitionsWithIndex、mapPartitions 操作,
需要设置preservesPartitioning这个参数,
默认值:preservesPartitioning: Boolean = false
override val partitioner = if (preservesPartitioning) firstParent[T].partitioner else None
B。按相同的paritioner分区后,如果map、flatMap、filter 操作,partitioner被置为None
C。streaming实例验证:
1、当为no-partitioner时,shuffle每批数据都会增长,并且,序列化和反序列化后,shuffle并不下降,
即使重启系统后,重新读区序列化后的数据,会在上次shuffleWrite的基础上,
增加shuffle(filter RDD shuffleWrite + tdidRDD shuffleWrite)全shuffle
结论:BloomFilter的shuffleWrite和shuffleRead的增长,其大小跟put的数据有关,put的数据越大(重复率越小),增量越大
2、当为no-partitioner时,其中一个RDD有partitioner,另一个partitioner为None,shuffle的量为partitioner为None的RDD的数据量
3、当为co-partitioner时,partition相同,shuffle每批增长的量为上批tdidRDD的数据量,当序列化反序列后,shuffle下降为20M左右
4、当为co-partitioner时,partition不同,shuffle的量为partition少的RDD当shuffle
D。单个join,a.join(b),shuffle跟a、b在join左右两侧的位置无关
E。zipPartition,即使没有相同的partitioner,也没有shuffle,计算的时候是多个RDD的这个partition算完,再算下一个partition
6、localcheckpoint
A。会打断RDD的依赖关系,并且把当前的RDD保存为一个新的RDD
B。当有块丢失时,会导致系统异常,退出