spark入门1

并行集合

对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持久化到内存(或其他地方,可选),之后可以重复利用这部分数据。

共享变量

广播变量,只读。

1
2
3
4
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: spark.Broadcast[Array[Int]] = spark.Broadcast(b5c40191-a864-4c7d-b9bf-d87e1a4e787c)
scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)

累加器,主要是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算子不同。

shuffle过程详解


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2016/05/20/spark入门1/