rdd的计算都是以partiotion为单元的,这些分区的转换函数(见后面的章节)不会直接返回结果。当出现collect,count,toList,print才会真正执行。
分区函数
分区函数确定了 宽窄依赖,如果父RDD的key只映射到子RDD中的一个key,则是窄依赖。反之为宽依赖。
spark默认的两种分区函数,hash分区和range分区。分区函数只能适用于<K,V>类型的RDD,非<K,V>类型的分区函数为None
val partitions = sc.textFile("/home/.../.../test/log",2);
partitions.partitioner
res0: None
val new_partitions = partitions.map(x,x).groupByKey(new HashPartitioner(3))
回顾前面的知识,RDD的分区如何被找到呢?
在一个DAG执行过程中,一般从HDFS文件作为出发点,集合函数在dadanode上执行,如果执行完生成新的RDD分区还在本机,则下一个集合函数继续在本机上执行,如果生成的RDD分区部分(或全部)不再本机上了,集合函数将在其他机器上执行,是如何做到跟踪的呢?
val location = rdd.preferredLocations(rdd.dependecies(0))
首选位置函数显示的知道了rdd的分区位置,底层具体怎么实现,便不知了。。