大数据技术之Spark

简介

spark是一个开源免费的,通用的,可靠性的分布式计算框架,可用于处理海量的数据
Apache Spark™是用于大规模数据处理的统一分析引擎。

常见的计算框架

  1. MapReduce -> 离线批处理
  2. Spark ->离线批处理+实时处理
  3. Storm ->实时处理
  4. Flink ->实时处理

Hadoop MapReduce 存在问题

当发生shuffle时底层会产生大量的磁盘I/O,会降低整体的性能。此外还会产生大量的排序操作,耗费cpu,并且不能做到对中间结果集的服用,导致大量的重新计算,也会降低整体性能

所以spark在设计时,吸取了MapReduce的经验教训,做出相应的改进和优化,比如尽量减少shuffle的产生,减少不必要的排序,以及支持对结果集的复用

spark的模块构成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DapSy1b7-1625794419087)(http://spark.apache.org/images/spark-stack.png)]

从上面可以看出,spark团队的目标是能够一栈式处理大数据所有场景:

  1. 离线批处理
  2. 数据交互式查询以及数据仓库
  3. 实时计算
  4. 复杂的数据分析

spark的使用模式

常见的有三种

  1. local模式:本地单机模式。一般用于练习或测试
  2. Standlone模式:Spark集群模式。集群的资源管理由spark自身来管理
  3. On Yarn模式:spark集群模式。集群的资源由yarn管理

RDD

弹性分布式数据集。初学时,把RDD看做是一种集合,用于存储数据,类比于Array或List。RDD的特点在于:

  • RDD有分区机制:可以分布式并行的处理同一个RDD数据集,从而极大提高处理效率。RDD分区数量由程序员自己定
  • RDD有容错机制,分区数据丢失可以进行恢复

RDD是Spark最核心的概念,需要把数据封装到RDD中,然后通过spark计算引擎进行处理
创建RDD的两种途径:

  1. 将一个普通的集合(Array或List)转变成RDD
    val r1=sc.parallelize(a1,2)
  • sc:spark context
  • a1 :普通集合
  • 2:RDD的分区数
    r1.partitions.size 查看分区数
    r1.glom.collect :查看每个分区的数据

val r2 =sc.makeRDD(List(1,2,3,4),2)
2. 读取外部存储系统文件(Linux,windows,hdfs等等)将整个文件的数据变为RDD以性为单位进行处理,即一行是一条数据
3. 读取本地文件 val r4 = sc.textFile(“file:///home/1.txt”,2)
4. 读取hdfs文件:val r5 = sc.textFile(“hdfs://hadoop01:9000/1.txt”,2)

RDD的操作

RDD的操作总分有三种

  1. Transformation 变换操作,变换操作都是懒操作(懒方法),即调用方法后,不是马上执行,当触发某一个Action方法时才会真正执行,比如textFile就是一个懒方法。此外,每当调用一个懒方法,就会返回一个新的RDD
  2. Action执行操作
  3. Controller控制操作

Spark的DAG(有向无环图)

//单词统计
data.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)

DAG中记录了RDD之间的依赖关系,借助RDD之间的依赖关系可以实现数据容错,即某一个子分区
数据丢失时,找他对应的父分区结合依赖关系进行恢复

RDD的依赖关系

  • 窄依赖 :对于窄依赖操作,它们只是将Partition的数据根据转换的规则进行转化,并不涉及其他的处理,可以简单地认为只是将数据从一个形式转换到另一个形式。
    所以对于窄依赖,并不会引入昂贵的Shuffle。所以执行效率非常高。如果整个DAG中存在多个连续的窄依赖,则可以将这些连续的窄依赖整合到一起连续执行,中间不执行shuffle 从而提高效率,这样的优化方式称之为流水线优化。
    此外,针对窄依赖,如果子RDD某个分区数据丢失,只需要找到父RDD对应依赖的分区,恢复即可。但如果是宽依赖,当分区丢失时,最糟糕的情况是要重算所有父RDD的所有分区。
  • 宽依赖,对于groupByKey这样的操作,子RDD的所有Partition(s)会依赖于parent RDD的所有Partition(s),子RDD的Partition是parent RDD的所有Partition Shuffle的结果。
    宽依赖会产生shuffle,底层会发生磁盘I/O以及网络数据通信较为复杂过程,所以性能上会降低,spark也是会产生shuffle,窄依赖就没有shuffle,所以会提高整体的执行效率

shuffle(洗牌)

  1. 即按照分组(分区条件)将数据分发到正确分区

在这里插入图片描述

Stage的划分

1)Spark在执行Transformation类型操作时都不会立即执行,而是懒执行(计算)
2)执行若干步的Transformation类型的操作后,一旦遇到Action类型操作时,才会真正触发执行(计算)
3)执行时,从当前Action方法向前回溯,如果遇到的是窄依赖则应用流水线优化,继续向前找,直到碰到某一个宽依赖
4)因为宽依赖必须要进行shuffle,无法实现优化,所以将这一次段执行过程组装为一个stage
5)再从当前宽依赖开始继续向前找。重复刚才的步骤,从而将整个DAG还分为若干的stage

stage(阶段),本质上一组task的集合,一个分区对应一个task,连续窄依赖会出现流水线优化
一个分区对应一个task,一个action执行对应一个job
一个app(Application)应用程序,一个Ap至少有一个job

在这里插入图片描述

spark集群搭建

修改conf下的spark-env.sh

在这里插入图片描述

Spark集群提交jar包以及运行的流程

在这里插入图片描述

Spark集群架构

在这里插入图片描述

Spark集群架构图细节补充

在这里插入图片描述

Spark Shuffle Manager

在这里插入图片描述

一、Hash Based Shuffle Manager

在这里插入图片描述

二、Sort Based Shuffle Manager

在这里插入图片描述

RDD的持久化机制

在这里插入图片描述

Spark的Checkpoint机制

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值