宽依赖和窄依赖
在学习spark宽依赖、窄依赖的时候,对 map算子是窄依赖、reduceByKey算子是宽依赖 都好理解;而对于join with inputs co-partitioned是窄依赖理解不深刻,特此记录。
在spark中如何表示RDD之间的依赖关系分为两类:
①窄依赖:每个父RDD的分区都至多被一个子RDD的分区使用,即为OneToOneDependecies;
②宽依赖:多个子RDD的分区依赖一个父RDD的分区,即为OneToManyDependecies。
由上图可知,join分为宽依赖和窄依赖,如果RDD有相同的partitioner,那么将不会引起shuffle,因此我们可以对RDD进行Hash分区。分别对A和B用同一个函数进行Partition,比如按照首字母进行Partition,那么A和B都可以分成26个Partition,并且A1只需要和B1进行join,A1不需要和B剩下的25个Partition进行join,这样就大大的减少了join次数,最好的办法是对表进行分区,每次只取两个对应分区的数据进行join操作。具体的Hash Partition函数需要根据具体的应用场景实现。分区大小需要根据task-nums、num-executors以及executor-cores确定。
用自己的话理解就是在join之前,两个rdd(rdd是跨节点的)用相同的分区策略进行分区,保证相同的key在同一个分区,也就保证分区后相同的key在同一个节点上(spark计算末尾,一般会把数据做持久化到hive,hbase,hdfs等等。我们就拿hdfs举例,将RDD持久化到hdfs上,RDD的每个partition就会存成一个文件,如果文件小于128M,就可以理解为一个partition对应hdfs的一个block。反之,如果大于128M,就会被且分为多个block,这样,一个partition就会对应多个block),这样就可以保证join的时候没有网络传输,没有shuffle,也就是窄依赖。












网友评论