并行集合
对scala seq调用SparkContext的parallelize方法可以创建一个并行集合,之后在这个并行集合就可以被并行操作。并行集合有一个参数是切片数,表示一个数据集切分的份数,一般spark会根据集群自动化分,也可以手动设置。
外部文本数据及可以用SparkContext.textFile构造并行集合。
RDD 内部的数据集合在逻辑上(以及物理上)被划分成多个小集合,这样的每一个小集合被称为分区。
操作
对于RDD,有两种类型的动作,一种是Transformation,一种是Action。它们本质区别是:
Transformation返回值还是一个RDD。它使用了链式调用的设计模式,对一个RDD进行计算后,变换成另外一个RDD,然后这个RDD又可以进行另外一次转换。这个过程是分布式的
Action返回值不是一个RDD。它要么是一个Scala的普通集合,要么是一个值,要么是空,最终或返回到Driver程序,或把RDD写入到文件系统中
Transformations转换操作,返回值还是一个 RDD,如 map、 filter、 union;
Actions行动操作,返回结果或把RDD持久化起来,如 count、 collect、 save。
RDD持久化:通过presist()或cache()将rdd持久化到内存(或其他地方,可选),之后可以重复利用这部分数据。
共享变量
广播变量,只读。
|
|
累加器,主要是conuters和sum的操作
Shuffle
spark进行数据处理时不会跨partition进行数据处理,因此对于某些操作,比如reduceByKey,需要让所有的相同key在一个partition。为了构造这样的partition,需要进行一个all-to-all的操作,这个操作就是shuffle。
shuffle后partition中的数据顺序是无序的,如果希望有序可以用sortBy等命令
这些操作会引发shuffle:
- 有repartition的操作:repartition,coalesce。。。
- ByKey:groupByKey,reduceByKey。。。
- join:cogroup,join。。。。
shuffle过程类似于mr的map和reduce,与spark的map和reduce算子不同。
本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。