Spark学习整理之一

一、Spark

Apache Spark是一个开源的分布式计算框架,用于处理大规模的数据。旨在快速进行数据分析、快速运行和快速开发。Spark不是由一个人开发的,而是诞生于美国加州大学伯克利分校的AMP实验室。于2010年开放源码,2012年发布了0.6.0版本,距今已有6年历史,最新版本为2.4.0。
开发Spark可以使用Scala、Java、Python以及R语言。

二 、RDD的五大特性

RDD(Resilient Distributed Dataset)弹性分布式数据集
1、RDD是由一些列的partition组成
2、RDD提供的每一个函数实际上是作用于每一个partition上
3、RDD具有一系列的依赖关系,依赖于其他的RDD,RDD的依赖关系也叫RDD的血统(Lineage)
4、可选项 分区器是作用在KV格式的RDD上的
5、可选项 RDD会提供一系列的最佳的计算位置

注:
Spark中没有读文件的方法,它依赖MapReduce读文件的方法,即需要MapReduce中的jar包。MapReduce在读文件之前会将文件划分为一个个的split,为了保证数据的完整性,split的大小约等于block的大小。第一个RDD的分区数等于split的个数。大多数情况下,split的个数约等于block的个数,特殊情况下block的个数大于split的个数。

特殊情况:
假如前两个block中都存了128M数据,第三个block中只存了第二个block中的最后半行数据,此时第三个block中数据的大小就是半行数据的大小,由于split要保证数据的完整性需要将第三个block中的半行数据划分到第二个split中,此时split数就小于block的个数。因此,不能说block的个数等于split的个数,只能说大多数情况下两者相等。

三、解释RDD的五大特性

1、由图可知每一个RDD由一系列partition组成。
2、例如将flatMap作用在每一个分区上,即父RDD作为flatMap的输入,子RDD作为flatMap的输出。
3、当一个partition内丢失,由于子RDD知道父RDD是谁,所以子RDD可以将函数再次作用在父RDD的partition上,重新生成新的partition,正是由于RDD的依赖性(单向依赖),计算的容错性才高。
4、什么是KV格式RDD?如果RDD中的数据是二元组类型的,那么我们就称RDD是KV格式的RDD。即非KV格式RDD不能使用partitionBy方法。
5、RDD提供了一个方法接口,只要调用这个方法接口,就可以找到每一个partition所在的位置。然后将task分发到partition所在节点上执行,这样有利于数据本地化(计算向数据移动)。

四、RDD的三类算子

什么是算子?算子也称为方法、函数。

1、Transformation类

Transformation属于延迟计算,当使用Transformation类算子的时候,RDD并没有立即进行转换,只是有了对应的逻辑。当出现Action类算子时,Transformation类算子才会被执行。

常见的Transformation类算子:
map()
filter()
flatMap()扁平,返回一组RDD,即一对多。
groupByKey()
作用在KV格式的RDD上,返回一个(K,Seq[V])对的数据集
注意:默认情况下,使用8个并行任务进行分组,你可以传入numTask可选参数,根据数据量设置不同数目的Task
reduceByKey()
作用在KV格式的RDD上,相同的Key值,都被使用指定的reduce函数聚合到一起。和groupbykey类似,任务的个数可以通过第二个可选参数来配置。
sample(withReplacement,fraction,seed)
withReplacement(Boolean类型): 抽样的方式。true表示放回式抽样,false 不放回式抽样
fraction(Double类型):抽样比例。随机抽样出比例为fraction的数据
seed(Lang类型):随机算法的初始值,根据给定的随机种子seed
union() 返回一个新的数据集,由原数据集和参数联合而成
join()内连接
在类型为(K,V)和(K,W)类型的数据集上调用,返回一个(K,(V,W))对,每个key中的所有元素都在一起的数据集

2、Action类

触发Transformation类算子的执行。每当遇见一次Action类算子,就会执行一个job。
常见的Action类算子有:
collect()
count() 返回数据集的元素个数
foreach()
reduce()

3、Control类

将数据持久化到内存或磁盘。
常见的Control类算子
cache()
persist()
当persist()的持久化级别是MEMORY_ONLY的时候与cache()作用一样,所以说cache()是persist()的特例。
注意:

控制类算子都是懒执行的,需要action类算子触发执行
控制类算子后面不能紧跟action类算子例如:rdd.cache().count()
cache和persist算子的返回值可以赋给一个变量,在其他job中直接使用这个变量就可以使用持久化的数据。持久化的单位是partition。

五、Spark Application的大概运行流程

每一个task都由Driver分发到相应的节点上。
每一个task的计算结果都会被拉回到Driver进程中。但是这个情况是十分危险的,容易造成Driver进程的OOM。可以通过代码控制是否将计算结果拉回Driver端。
Driver的作用:

分发task到计算节点
监控task的执行情况
如果task执行失败,会进行重试
将计算结果拉回Driver端
结论:Driver进程会和集群进行频繁的通信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值