spark概述与编程模型

spark与hadoop的比较

spark与hadoop的异同点比较

spark rdd

rdd(resilient distributed dataset, 弹性分布数据集)是一个容错的、并行的数据结构,可以让用户显式的将数据存储在磁盘和内存中,并且还能控制数据的分区。对于迭代式计算和交互式挖掘,rdd可以将中间计算的结果保存在内存中,若是后面计算中需要中间结果,则可以直接从内存中读取,从而极大的提高计算速度。

rdd有五大特征:

1.A list of partitions 分区列表. 每个rdd被分成多个分区, 这些分区运行在集群的不同节点,每个分区都会被一个计算任务处理,分区数决定了并行计算的数量,创建rdd时可以指定rdd分区的个数,如果不指定分区数量,当rdd从集合创建时,默认分区数量为该程序所分配到的资源的cpu核数(每个core可以承载2-4个partitions), 如果从Hdfs创建,默认为文件的Block数。

2.a function for computing each split 每个分区都有一个计算函数。 spark的rdd的计算函数是以分片为基本单位的,每个rdd都会实现compute函数,对具体的分区进行计算。

3.a list of dependencies on other rdds 依赖于其他rdd. rdd的每次转换都会生成一个新的rdd, 所以rdd之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,spark可以根据这个依赖关系计算丢失的分区数据,而不是对rdd的所有分区重新计算。

4.optionally, a partitioner for key-value rdds (key, value)数据类型的rdd分区器. 当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于于key-value的RDD,才会有Partitioner,非key-value的RDD的Parititioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle输出时的分片数量。

5.optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file) 每个分区都有一个优先位置列表。 对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。

spark rdd 中的依赖关系

在spark中,rdd之间存在依赖关系,rdd之间的依赖关系有2种,分别时窄依赖(narrow dependency)和宽依赖(wide dependency).窄依赖是指父rdd的每个分区最多被一个子rdd的分区使用,窄依赖的表现一般分为2类,第一类表现为一个父rdd的分区对应一个子rdd的分区,第二类表现为多个父rdd的分区对应一个子rdd的分区。当rdd执行map,filter,union及join时,都会产生窄依赖,如下如所示。

rdd做map,filter,union操作时为窄依赖的第一种表现,rdd做join操作时为窄依赖的第二种表现。inputs co-partitioned(输入协同划分)是指多个父rdd的某一分区的所有key,被划分到子rdd的同一分区,而不是指同一个父rdd的某一个分区被划分到子rdd的2个分区。当子rdd做算子操作时,因为某个分区操作失败导致数据丢失,只需要重新对父rdd对应的分区(与子rdd对应的分区)重新做算子操作即可恢复数据。

当rdd做groupByKey和join操作时,会产生宽依赖。如下图所示。

从图中可以看出,当父rdd做groupByKey操作和join(inputs not co-partitioned 输入未协同划分)操作时,子rdd依赖于所有父rdd的所有分区。当子rdd做算子操作时,因为某个分区操作失败导致数据丢失时,则需要重新对父rdd的所有分区做算子操作才能恢复数据。

需要注意的是,join算子操作既可以属于宽依赖,又可以属于窄依赖。当join算子操作后,分区数量没有变化则为窄依赖(如join with inputs co-partitioned,输入协同划分),分区数量发生变化则为宽依赖(如join with inputs not co-partitioned,输入未协同划分)。

在spark中,rdd采用惰性求值,即每次调用action算子,都会从头计算。然后每次调用action算子,都会触发一次从头开始计算,这对迭代计算代价是很大的。因为迭代计算需要多次重复的使用同一个数据集,所以为了避免重复计算的开销,可以让spark对数据集进行持久化,持久化的方式有2中,分别是cache()和persist().

spark rdd算子

transformation算子

1.map

2.filter

3.flatMap

map对集合中的每个元素进行操作,flatMap对集合中的每个元素进行操作然后再做扁平化。map对每一条输入进行指定的操作,然后为每一条输入返回一个对象;flatMpa对每一条输入进行指定的操作,每一个输入产生一个对象,然后将这些对象合并为一个对象。

4.sample算子 用来抽样 包含三个参数 第一个参数是Boolean值表示抽出样本后是否要放回去,true表示会放回去,即意味抽样的样本可能重复 //第二个参数是float值表示抽出多少比例,第三个值是seed 根据seed随机抽取,如果固定seed 那每次抽出的样本都是一样的

5.union算子,将2个rdd合并,不去重

6.intersection,求2个rdd的交集,并且会去重

7.distinct,rdd去重

8.groupByKey算子,对具有相同key的value分组

9.sortBykey算子,根据key值对rdd进行排序

10. join算子,将2个rdd相同key的value归并

11.cogroup相当于sql中的全外连接full outer join,返回左右rdd中的记录,关联不上的为空

12 cartesian算子  笛卡尔积

13 coalesce(numPartitions)算子,减小rdd的分区数到numPartitions.

14.repartition(numPartitions)算子 重新shuffle rdd中的数据,增加或者rdd的分区数

15 reduceByKey()算子 reduceByKey=groupByKey+reduce

action算子

1.reduce算子 首先将第一个和第二个元素传入reduce算子中定义的func,得到一个结果,然后该结果和后面的元素依次执行func函数,最终所有的元素都执行完毕得到最终结果,比如对一个list元素的累加和

2.countBykey算子  统计key出现的次数

3.foreach(f)算子 遍历rdd,将函数f应用于每个元素

4.collect()算子 将分布式的rdd元素全部返回到driver端,要慎用,如果rdd的数据量很大,那么可能产生内存问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值