- 博客(14)
- 收藏
- 关注
原创 CoGroupRDD原理-源码(spark3.0)
这个类中有三个重要的方法:1:getDependencies:获取每个rdd的依赖,遍历rdds根据每个rdd的分区器rdd.partitioner=Some(part) 则返回newOneToOneDependency() 宰依赖否则返回newShuffleDependency() 宽依赖2:getPartitions:获取分区器,如果是宽依赖则返回None,否则返回newNarrowCoGroupSplitDep3:compute:这个方法最后返回Iterat...
2021-09-02 13:55:47 503
原创 Union 原理-源码(spark3.0)
这也是一个action算子,并且不会发生shuffle。首先会将多个上游的RDD放入到一个集合中,或获取所有RDD的分区,判断是否都定义了分区并且分区是一样的,如果是则返回PartitionerAwareUnionRDD,否则返回UnionRDD;PartitionerAwareUnionRDD 是oneToOneDependency是一个宰依赖,会使用父RDD的分区器UnionRDD中会判断RDD的个数是否超过了10个,没超过类似于合并了下分区,这个是自...
2021-09-02 11:30:33 419
原创 foreach、foreachPartition原理-源码(spark3.0)
foreach 将RDD中每个分区的迭代器中每个元素都调用这个函数 /** * Applies a function f to all elements of this RDD. */ def foreach(f: T => Unit): Unit = withScope { val cleanF = sc.clean(f) sc.runJob(this, (iter: Iterator[T]) => iter.foreach(clea...
2021-09-02 08:53:05 382
原创 saveAsTextFile原理-源码(spark3.0)
用mapPartitions函数将数据封装成Text(hadoop的数据类型),返回的是MapPartitionRDD,在调用SaveAsHadoopFile/** * TODO:存储数据到文件中 并指定压缩格式 * Save this RDD as a compressed text file, using string representations of elements. */ def saveAsTextFile(path: String, codec: ...
2021-09-02 08:52:37 448
原创 countByKey、countByValue原理-源码(spark3.0)
CountByKey 因为代码中调用了collect,所以是action算子 将(key,value)转换成了(key,1) 然后调用了reduceByKey->collect->toMap PairRDDFunctions类\ /** * TODO:统计每个不同的key的个数 * Count the number of elements for each key, collecting the results to a local ...
2021-09-01 20:09:33 207
原创 count 原理-源码(spark3.0)
先对各个分区的迭代器计数,然后sum /** * Return the number of elements in the RDD. */ /** * TODO: 可以看出 是对每个分区计算 计算这个分区后直接将这个分区的结果 * 发送到Driver端,在driver端在对分区的结果进行就算 汇总 * @return */ def count(): Long = sc.runJob(this, Utils.getIteratorSize _).su...
2021-09-01 19:54:51 298
原创 fold 、sum原理-源码(spark3.0)
fold 是一个action算子,也是使用了局部聚合然后在全局汇总,调用了TraversableOnce.foldLeft方法/** * Aggregate the elements of each partition, and then the results for all the partitions, using a * given associative function and a neutral "zero value". The function ...
2021-09-01 19:52:23 240
原创 reduce原理-源码(spark3.0)
是一个action算子,在这个方法里面调用了sc.runJob; 这个方法中定义了两个函数一个是局部聚合函数一个是全局聚合函数(merge分区的结果的),局部聚合函数中调用了TraverableOnce.reduceLft方法/** * Reduces the elements of this RDD using the specified commutative and * associative binary operator. */ def re...
2021-09-01 19:41:32 184
原创 first、top 原理-源码(spark3.0)
first 底层调用的take(1)/** * Return the first element in this RDD. */ def first(): T = withScope { take(1) match { case Array(t) => t case _ => throw new UnsupportedOperationException("empty collection") } }top...
2021-09-01 19:31:52 236
原创 takeSample原理-源码(spark3.0)
这也是一个action算子,但是触发的action>=2,第一次是:countI() 获取数据总量,第二次是:collect() ...如果不满足会执行whlie循环再次执行this.sample().collect 所有action触发的次数>=2.这个方法中有三个参数:参数1:withReplace:抽样的时候应该是否放回,会根据这个采用不同抽样器计算概率,如果是true会采用PoissonBounds抽样器,false会采用BiunomialBounds采样器...
2021-09-01 19:03:35 261
原创 TakeOrdered原理-源码(spark3.0)
是一个action算子,内部调用了reduce算子,这个算子里面调用了runJob 会调用mapPartitions算子计算每个分区的数据迭代器,里面是使用BoundedPriorityQueye有界小顶堆队列存储的,存量为num即只会回去每个分区的前num个数据。mapPartitions算子返回newMapPartitionsRDD。返回结果调用reduce算子,将各个分区返回的queue进行合并,合并成一个队列,返回数组/** * TODO:返回最小的nu...
2021-09-01 17:11:19 167
原创 Take 原理-源码(spark3.0)
take方法中有一个while循环,在首次循环中,会启动一个job来获取第一个分区的数据,如果第一个分区的数据已经满足了条件直接返回数组,如果第一个分区不满足条件,那么会再次循环;会通过partsScanned(会记录已经执行的分区数) 和RDD_LIMIT_SCALE_UP_FACTOR两个参数决定下次执行job会遍历哪些分区/** * Take the first num elements of the RDD. It works by first scanning on...
2021-09-01 16:50:46 269
原创 Collect原理-源码分析(spark3.0)
这个是action算子会触发job操作,会将RDD中每个分区的数据都返回,拼接成一个数组,返回到driver端。是将这个RDD中的每个分区的数据迭代器iterator的数据直接转换成数组,然后所有的分区中的数据(数组) 组成一个大的数组,数组中元素为数组,然后调用Arrays.concat()方法将数据展平,即数组中的元素为真实的数据不再是数组RDD类:/** * Return an array that contains all of the elements in this...
2021-09-01 15:48:47 232
原创 yarn 下cluster和client异同点-源码级别
Spark-submit部署模式 本地模式local[*]、standalone模式、yarn模式;对于standalone模式和yarn模式分为:client(客户端)和cluster(集群) 提交方式Client模式和cluster模式区别 主要的区别是driver运行的节点;使用deploy-modeclient/cluster来指定运行的模式client模式(yarn) 1:在本地机器提交jar,即spark-submit命令,然后在本地...
2021-09-01 15:00:41 132
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人