作者:calvinrzluo,腾讯 IEG 后台开发工程师
本文基于 Spark 2.4.4 版本的源码,试图分析其 Core 模块的部分实现原理,其中如有错误,请指正。为了简化论述,将部分细节放到了源码中作为注释,因此正文中是主要内容。
Spark Core
RDD
RDD(Resilient Distributed Dataset),即弹性数据集是 Spark 中的基础结构。RDD 是 distributive 的、immutable 的,可以被 persist 到磁盘或者内存中。
对 RDD 具有转换操作和行动操作两种截然不同的操作。转换(Transform)操作从一个 RDD 生成另一个 RDD,但行动(Action)操作会去掉 RDD 的 Context。例如是行动操作,返回的是一个数组而不是 RDD 了,如下所示
转换操作是 Lazy 的,直到遇到一个 Eager 的 Action 操作,Spark 才会生成关于整条链的执行计划并执行。这些 Action 操作将一个 Spark Application 分为了多个 Job。
常见的Action 操作包括:、、、、、、、、、、、。
常见 RDD
RDD 是一个抽象类,在 Spark 中有诸如ShuffledRDD、HadoopRDD等实现。每个 RDD 都有对应的方法,用来描述这个 RDD 的计算方法。需要注意的是,这些 RDD 可能被作为某些 RDD 计算的中间结果,例如,对应的,例如也可能是经过多个 RDD 变换得到的,其决定权在于所使用的算子。
我们来具体查看一些 RDD。
首先,我们需要了解一下什么是操作,这个方法有多个重载版本。如下所示的版本,对或或的所有的 key,生成一个,表示对于这个 key,这三个 RDD 中所有值的集合。容易看到,这个算子能够被用来实现 Join 和 Union(不过后者有点大材小用了)
这里的是一个,具有和两个方法。通过继承可自定义分区的实现方式,目前官方提供有和等。
一般通过算子得到
领取专属 10元无门槛券
私享最新 技术干货