大数据平台复习七.spark基本原理

MapReduce的编程模型表达能力有限
MapReduce计算框架将计算任务抽象为map和reduce两个计算任务,这简化了编程过程,但也导致MapReduce的编程模型表达能力有限。
当实际中有些处理过程比较复杂时,我们需要建立多个MapReduce过程并连接起来,这也使得MapReduce的编程过程变得复杂。
无法实现快速的迭代计算
当一个复杂的需求涉及多个MapReduce计算任务时,MapReduce只能一个任务完成之后将结果写入磁盘,另一个计算任务才能开始,无法实现快速的迭代计算。
MapReduce计算过程的延迟一般比较高
由于MapReduce的计算过程需要从磁盘中读取数据,并将中间结果和最终结果写入HDFS通过磁盘保存(同时考虑到HDFS的多备份机制),因此MapReduce计算任务涉及大量的磁盘I/O开销。
受制于磁盘的响应速度,MapReduce计算过程的延迟一般比较高。
一个普通的MapReduce作业往往需要分钟级的运算,复杂的作业或者是数据量更大的情况下,可能花费一个小时或者更多。

相比于MapReduce,Spark产生的更晚
借鉴了MapReduce计算框架的优点
解决了MapReduce计算框架所存在的一些局限性
Spark提供了更多的操作,这使得Spark的编程模型的表达能力更强
Spark将计算过程中的中间结果放到内存中而不是写入磁盘,通过提供基于内存的计算,Spark减少了磁盘的I/0开销,能够更好的支持迭代计算任务,并提高了计算的效率
Spark提供了基于有向无环图DAG的任务调度执行机制,能够较好的支持涉及多任务、多阶段的计算需求
通过有向无环图的任务调度执行机制以及基于内存的计算,Spark具有比MapReduce更快的计算速度
Spark更容易使用
支持使用Scala、Java、Python和R语言进行编程,编程接口也更为简洁,并且可以通过Spark Shell进行交互式编程
支持多种部署方式
提供了Standalone、Spark on Mesos和Spark on YARN等多种种部署模式,具有更好的灵活性
已经发展成一个生态系统
遵循“一个软件栈满足不同应用场景”的设计理念在这里插入图片描述
虽然Spark弥补了MapReduce的不足,并且已经发展成能够支持多种计算任务的一栈式解决方案,但是Spark无法完全取代Hadoop。
反而,在使用Hadoop的YARN、HDFS和Hbase等组件来实现资源调度管理、海量数据存储、数据随机访问的同时,Spark已经很好的融入了Hadoop之中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据的分区列表
每个分区对应到集群中一个物理的数据块,每个分区可以由一个单独的节点进行处理。分区是Spark计算的基本单元,分区的大小决定了Spark计算的粒度。
用户可以在创建RDD时指定RDD的分区个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。
计算每个分区的函数
RDD只能通过数据源创建或者通过其他RDD经过某种函数操作转换得到。
这里的计算函数记录了在RDD转换中对父RDD所做的操作。
如果RDD是通过已有的文件系统构建,则计算函数是读取指定文件系统中的数据。
与其它RDD之间的依赖
RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后衍生血缘关系
RDD通过记录自己与其它RDD之间的血缘依赖关系,在部分分区数据丢失时,通过重新计算来恢复丢失的分区
优先位置列表
记录了每个分区的优先位置
当通过HDFS中的数据来建立RDD时,这个列表保存的就是每个分区对应的数据块所在的位置
按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置
分区策略
RDD的分区函数
分区函数决定了RDD的分区个数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Map(func)操作
与MapReduce的map操作计算过程完全一致
将输入RDD中的每个元素,根据map函数中传递进来的func函数来进行处理
对输入RDD的每个元素进行处理的结果将是输出RDD中对应的元素
因此,在经过map操作之后,输入RDD有多少个分区,那么输出RDD也有多少个分区,输入RDD有多少个元素,那么输出RDD也会有多少个元素

flatMap(func)操作
flatMap操作与map操作类似,都首先需要利用传递进来的func函数对输入RDD的每个元素进行处理。
但不同的是,flatMap在通过func函数对每个数据项进行处理之后,还要将各个元素的处理结果进行扁平化操作,也就是将各个元素处理的结果进行合并形成一个集合。

union(rdd)操作
union操作是将两个RDD中的元素进行合并,形成一个新的RDD,并且不进行去重处理
该操作要求进行合并操作的两个RDD中元素的数据类型相同,输出RDD也将与输入RDD具有相同的数据类型

filter(func)操作
根据传递进来的func函数对输入RDD中的数据进行过滤
传递进来的func函数的输出值为true或者false的布尔值
应用输入函数对输入RDD中的每个元素进行处理,结果为true的元素将被保留,而结果为false的数据项元素将被过滤掉
filter操作输出的RDD将只有保留的元素

distinct()操作
distinct操作是将输入RDD中的元素进行去重处理,也就是将输入RDD中重复的元素去除。

groupByKey()操作
groupByKey操作要求输入的RDD中的元素是<key, value>形式的数据
该操作将输入RDD中key相同的元素合并成一个<key, Iterable<value1, value2,value3>>形式的元素。该操作与MapReduce中map和reduce之间的shuffle操作类似。

reduceByKey(func)操作
reduceByKey操作也要求输入RDD中的元素具有<key, value>的形式
该操作将输入RDD中具有相同key的元素的value值根据传递进来的func函数进行聚合处理。
比如,如果传递进来的func函数是两两相加的求和运算,那么reduceByKey就是对输入RDD中具有相同key的数据项的value值进行累加求和,然后形成一个新的<key, value>元素。
所以,reduceByKey操作相当于先进行一次groupByKey操作,然后对groupByKey操作所形成的Iterable<value1, value2, value3>列表中的数据根据func函数进行逐步的聚合运算。

join(rdd)操作
要求当前RDD和通过参数输入的RDD都是<key, value>形式的数据集合
该操作先对当前RDD和通过参数传递进来的RDD中的元素进行协同划分,也就是分别将两个RDD下相同key值对应的value值聚合为一个集合,然后将两个RDD中相同key值对应的value值集合组合形成一个<key, (Iterable, Iterable)>形式的元素
在上述协同划分操作的基础上,在对每个<key, (Iterable, Iterable)>形式的元素中的(Iterable, Iterable)组合进行笛卡尔积操作,也就是将Iterable列表中的数据元素与Iterable列表中的数据元素分别进行连接组合,然后再将结果进行展平
比如,对于协同划分之后形成的一个<k1, (<1>,<1, 2>)>的数据项,进行笛卡尔积操作和展平处理形成的结果为两个新的数据项:<k1,(1, 1)> 和 <k1,(1, 2)>。
对于某个key只在一个RDD出现的情况,那么形成的元素中相应位置上的值将为空。比如,假设<k3, 5>这一数据项中的key值k3只在当前RDD中出现,那么在新生成的RDD中将形成<k3, (5, null)>的数据项。

RDD的持久化操作
惰性计算使得转换过程中所产生的中间RDD在计算完成之后即被丢弃,但是在一些迭代计算中我们可能需要重复利用一些中间计算过程的结果
可以通过持久化操作来保存中间操作的结果
持久化操作的具体操作函数有两个:persist和cache
Persist函数会根据设置不同的StorageLevel,来决定存储到哪个位置
cache操作则是相当于调用了persist(MEMORY_ONLY),将数据缓存到内存中

在这里插入图片描述
reduce(func)操作
Spark的map操作与MapReduce的map操作相同,但是Spark的reduce操作与MapReduce的reduce操作不同。
MapReduce的reduce函数是对一个key对应的value值集合进行处理。
而Spark的reduce操作则是当前RDD的元素从左至右根据传递进来的func函数进行两两运算,并将计算结果与RDD中的下一个元素进行相同的计算,直到遍历完RDD的所有元素。
当RDD有多个分区时,先对每个分区执行上述操作,然后在对各个分区计算结果进行上述操作。

Spark中的RDD只能通过HDFS、Hbase等数据源来创建或者通过其他RDD通过转换得到
Spark将RDD操作中原RDD与目标RDD之间的父子血缘关系关系称为RDD之间的依赖关系在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值