Spark-core-问题记录:join shuffle

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/anitinaj/article/details/80902159

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的基础上,

                  增加shufflefilter 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少的RDDshuffle

        D。单个join,a.join(b),shuffle跟a、b在join左右两侧的位置无关

        E。zipPartition,即使没有相同的partitioner,也没有shuffle,计算的时候是多个RDD的这个partition算完,再算下一个partition

6、localcheckpoint

        A。会打断RDD的依赖关系,并且把当前的RDD保存为一个新的RDD

        B。当有块丢失时,会导致系统异常,退出

猜你喜欢

转载自blog.csdn.net/anitinaj/article/details/80902159