标签:spark
由于Spark是用Scala实现的,所以Spark天生支持Scala API,此外,还支持Java和Python API。以Spark 1.3版本的Python API为例,其模块层级关系如下图所示:1) pyspark.SparkContext
它抽象了指向spark集群的一条连接,可用来创建RDD对象,它是API的主入口。
3) pyspark.RDD
RDDs can be stored in memory between queries without requiring replication. Instead, they rebuild lost data on failure using lineage: each RDD remembers how it was built from other datasets (by transformations like
map, join or groupBy) to rebuild itself.
RDD是Spark编程的核心抽象概念,它代表了一个抽象的弹性分布式数据集,Spark支持对RDD进行两类操作:transformations和actions,它们所包含的函数列表可以参考官方文档的"Transformations"和"Actions"部分。
根据Spark Programming Guide文档"RDD Operations"部分的说明,根据已经存在的数据集创建新数据集的操作被称作transformation;对数据集做计算并将结果返回driver
program的操作被称作action。
例如,map是根据传入的函数参数对已有RDD做处理,其运行结果得到一个新的RDD,所以它是一个transformation操作;而reduce则是根据传入的函数参数对已有RDD做计算,计算结果不再是个RDD,而是个具体的值(对reduce来说,计算结果是个具体的数字,而其它action(s)得到的可能是个list或其他数据结构),所以reduce是个action操作。
需要特别强调的是,Spark对所有的transformations操作都采用lazy evaluation的策略,也即spark在调度时并不是对遇到的每个transformation都立即求值以得到新的RDD,而是将针对某个RDD的一系列transformations操作记录下来,只有最终遇到action操作时,Spark才会计算先前记录的每个transformations。
这种lazy evaluation的设计思路使得Spark得以更高效运行,因为调度器可以对从初始RDD到最终action操作路径上的transformations做合并或其它变换,且只有最终的action操作结果才会返回给driver program,节省了transformations操作的中间结果在集群worker node和driver program间的传输开销。
默认情况下,调用action操作时,初始RDD经过的每个transformation操作均会被执行一次,在多个actions会经过一系列相同的transformations操作时,这种recompute显得并不高效。因此,在实际开发Spark计算任务脚本时,会被多个actions共用的transformations结果最好调用persist或cache缓存起来,这样会节省不少计算时间。
5) pyspark.Accumulator
它是Spark支持的另一种变量共享的方式(第1种方式是上面介绍的Broadcast),worker节点上的进程可以通过add()操作更新变量,更新后的变量会自动传播回driver program。
7) pyspark.StorageLevel
它可以指定RDD的存储级别,如只使用内存、只使用磁盘、内存为主磁盘为辅,等等。详细的控制标识可以参考这里的文档。
======================= EOF ====================
标签:spark
原文地址:http://blog.csdn.net/slvher/article/details/46423653