spark 总结

spark 算子学习
map
将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。
输入分区与输出分区一对一,即:有多少个输入分区,就有多少个输出分区。
flatMap
属于Transformation算子,第一步和map一样,最后将所有的输出分区合并成一个。
flatMap只会将String扁平化成字符数组,并不会把Array[String]也扁平化成字符数组。
distinct
对RDD中的元素进行去重操作。

RDD
一般需要了解RDD的以下五个接口:

partition 分区,一个RDD会有一个或者多个分区
dependencies() RDD的依赖关系
preferredLocations(p) 对于每个分区而言,返回数据本地化计算的节点
compute(p,context) 对于分区而言,进行迭代计算
partitioner() RDD的分区函数

一个RDD包含一个或多个分区,每个分区都有分区属性,分区的多少决定了对RDD进行并行计算的并行度。
在生成RDD时候可以指定分区数,如果不指定分区数,则采用默认值,系统默认的分区数,是这个程序所分配到的资源的CPU核数。
窄依赖:
每一个父RDD的分区最多只被子RDD的一个分区所使用
宽依赖
多个子RDD的分区会依赖同一个父RDD的分区

RDD优先位置(preferredLocations)

RDD的优先位置,返回的是此RDD的每个partition所存储的位置,这个位置和Spark的调度有关(任务本地化),
Spark会根据这个位置信息,尽可能的将任务分配到数据块所存储的位置,以从Hadoop中读取数据生成RDD为例,
preferredLocations返回每一个数据块所在的机器名或者IP地址,如果每一个数据块是多份存储的(HDFS副本数),
那么就会返回多个机器地址。

RDD分区函数(partitioner)

目前Spark中实现了两种类型的分区函数,HashPartitioner(哈希分区)和RangePartitioner(区域分区)。

coalesce和repartition区别:
coalesce:
def coalesce(numPartitions: Int, shuffle: Boolean = false)(implicit ord: Ordering[T] = null): RDD[T]
该函数用于将RDD进行重分区,使用HashPartitioner。
第一个参数为重分区的数目,第二个为是否进行shuffle,默认为false;
如果重分区的数目大于原来的分区数,那么必须指定shuffle参数为true,//否则,分区数不变
repartition:
def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T]
该函数其实就是coalesce函数第二个参数为true的实现

zip

def zip[U](other: RDD[U])(implicit arg0: ClassTag[U]): RDD[(T, U)]

zip函数用于将两个RDD组合成Key/Value形式的RDD,这里默认两个RDD的partition数量以及元素数量都相同,否则会抛出异常。

Spark RDD是被分区的,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,
当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。

rdd checkpoint 和 streaming的区别?
rdd的checkpoint是手动指定的,而steaming的checkpoint是自动指定的,如果不指定,任务跑不起来。
持久化和checkpoint的区别?
Checkpoint,是Spark提供的一个比较高级的功能。有的时候啊,比如说,我们的Spark应用程序,特别的复杂,然后呢,从初始的RDD开始,
到最后整个应用程序完成,有非常多的步骤,比如超过20个transformation操作。而且呢,整个应用运行的时间也特别长,比如通常要运行1~5个小时。

在上述情况下,就比较适合使用checkpoint功能。因为,对于特别复杂的Spark应用,有很高的风险,
会出现某个要反复使用的RDD,因为节点的故障,虽然之前持久化过,但是还是导致数据丢失了。那么也就是说,出现失败的时候,
没有容错机制,所以当后面的transformation操作,又要使用到该RDD时,就会发现数据丢失了(CacheManager),此时如果没有进行容错处理的话,
那么可能就又要重新计算一次数据。
简而言之,针对上述情况,整个Spark应用程序的容错性很差。
所以,针对上述的复杂Spark应用的问题(没有容错机制的问题)。就可以使用checkponit功能。

checkpoint功能是什么意思?checkpoint就是说,对于一个复杂的RDD chain,我们如果担心中间某些关键的,在后面会反复几次使用的RDD,可能会因为节点的故障,
导致持久化数据的丢失,那么就可以针对该RDD格外启动checkpoint机制,实现容错和高可用。

checkpoint,就是说,首先呢,要调用SparkContext的setCheckpointDir()方法,设置一个容错的文件系统的目录,比如说HDFS;然后,对RDD调用调用checkpoint()方法。
之后,在RDD所处的job运行结束之后,会启动一个单独的job,来将checkpoint过的RDD的数据写入之前设置的文件系统,进行高可用、容错的类持久化操作。
那么此时,即使在后面使用RDD时,它的持久化的数据,不小心丢失了,但是还是可以从它的checkpoint文件中直接读取其数据,而不需要重新计算。(CacheManager)
持久化主要是将数据保存在BlockManager中,但是RDD的lineage 血缘关系,依赖关系是不变的。
checkpoint之后rdd已经没有所谓的依赖关系了,lineage发生了变化。
通常建议:要对checkpoint的rdd使用persist 将rdd持久化 然后后面计算时,直接从磁盘读取rdd数据,并checkpoint到外部存储系统中,不需要重新计算一次rdd。

你可能感兴趣的:(spark,spark)