数分-理论-大数据7-Spark

Posted yxyibb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数分-理论-大数据7-Spark相关的知识,希望对你有一定的参考价值。

数分-理论-大数据7-Spark(大数据框架)

(数据分析系列)

文章目录

1知识点

  • 概述
  • 编程模型
  • 架构原理
  • 实战应用

2具体内容

2.1概述

2.1.1起源

  • 内存(进出仓库的通道):存储正在使用的资源

  • 磁盘(仓库):存储暂时用不到的资源

  • MapReduce:每一步在内存中,但产生的中间值(溢写文件)写入磁盘,下一步将中间值merge到内存,循环到最终完成计算

  • spark:每一步在内存中,产生的中间值直接写入下一个步骤,至所有步骤完成后将最终结果保存进磁盘(适合计算步骤多)

2.1.2诞生

2.1.3Spark与Hadoop、MapReduce、HDFS的关系

1.hadoop:

  • HDFS读取输入data
  • Map使用用户定义的mapper func,结果写入磁盘
  • Reduce从各Maping机器读取Map计算的中间结果,使用reduce func,结果写会HDFS
  • 三次读写,高度依赖磁盘读写

2.Spark

  • 基于性能更高的内存存储来进行数据存储和读写
  • 缺乏对数据存储的支持,没有分布式文件系统(HDFS),只能依赖外部数据源

3.异同

  • 都是大数据框架
  • hadoop
    • 分布式数据基础措施,将巨大的数据集分派到一个集群中的多个节点进行存储
    • 计算处理的功能
  • spark
    • 对分布式存储的大数据进行处理的工具
    • SparkCore看做是MapReduce的竞品
    • 不会分布式存储

2.1.4生态体系

Spark是一个用来实现快速且通用的集群计算平台

  • 速度:在内存中进行计算,可以面向海量数据进行分析处理;
  • 通用:针对任何业务类型分析进行处理
    • SparkCore离线批处理
    • SparkSQL交互式分析,支持SQL语句
    • SparkStreaming,实时流数据处理
    • MLlib,支持机器学习
    • GraphX,支持图计算
    • StructuredStreamig流式处理

2.2编程模型-核心

2.2.1RDD概述

弹性数据集(Resilient Distributed Datasets)的缩写

  • mr,面向过程的大数据计算,如何将计算逻辑用Map和Reduce实现,输入输出是什么
  • spark,面向对象(大数据抽象为一个RDD对象)编程,在RDD上计算至最后的结果

2.2.2RDD定义

  • 分布式内存
  • 只读的记录分区集合
  • 横跨集群所有节点进行并行计算
  • spark建立在抽象RDD上,统一算子进行运算

2.2.3RDD五大特性

1.分区

  • 计算以分区为单位,分配到多个机器并行计算
  • 从HDFS取数,spark使用位置信息,将计算工作就近发机器减少跨网络传输数据量

2.可并行计算

  • 一个分区一个计算任务Task
  • 每个分区有计算函数(计算算子)
  • 以分片为基本单位并行计算
  • RDD的分区数决定着并行计算的数量

3.依赖关系

  • 依赖关系列表构建RDD
  • 容错机制,出错可重建RDD

4.k-v数据的RDD分区器

  • Partitioner分区器决定分区策略
    • Hash分区
    • Range分区
    • 自定义分区
  • 针对k-v形式,从0到 numPartitions-1区间内映射每一个key到partition ID上

5.每个分区有一个优先位置列表

  • 分区位置列表会存储每个Partition的优先位置,如果读取的是HDFS文件,这个列表保存的就是每个分区所在的block块的位置
  • 尽可能将任务分配到处理数据的数据块位置

2.2.4RDD操作函数

  1. 转换transformation,返回值是RDD

    • map(func)计算
    • filter(func)过滤
    • union(otherDataset)合并
    • reduceByKey(func, [numPartitions])根据key聚合
    • join(otherDataset, [numPartitions])连接数据集
    • groupByKey([numPartitions])分组
  2. 执行action,不返回RDD

  3. spark以RDD为单位,对大数据分片计算,每个RDD分片分到一个执行进程处理

  4. 转换操作

    • 转换操作产生的RDD不会出现新的分片情况:
      • RDD数据分片,经过map或者filter转换操作后,其结果还在当前的分片中
      • 物理上,Spark只有在产生新的RDD分片时候,才会真的生成一个RDD,Spark的这种特性也被称作惰性计算
    • 转换操作产生的RDD会产生新的分片情况:
      • reduceByKey,来自不同分片的相同key 必须聚合在一起进行操作,这样就会产生新的RDD分片
      • 是否会产生新的RDD分片,并不是根据转换函数名就能判断出来的

2.3架构原理

  • 移动计算而非移动数据
  • 通过DAG来实现计算

2.3.1计算阶段

  • 根据应用的复杂程度,将过程分割成更多的计算阶段(stage),这些计算阶段组成一个有向无环图(DAG),Spark任务调度器根据DAG的依赖关系执行计算阶段(stage)

  • Spark快:大量的迭代计算,产生数万个计算阶段,这些计算阶段在一个应用中处理完成

  • 有向无环图,即是说不同阶段的依赖关系是有向

    • 计算过程沿着依赖关系方向
    • 依赖关系不是环形依赖,否则死循环
      • 执行阶段1和阶段2后,再执行阶段3
  • Spark大数据应用的计算过程:

    1. 根据程序初始化DAG
    2. 由DAG再建立依赖关系
    3. 根据依赖关系顺序执行各个计算阶段
  • Spark 作业调度执行核心是DAG

    • DAG可以得出 整个应用就被切分成哪些阶段以及每个阶段的依赖关系
    • 每个阶段要处理的数据量生成相应的任务集合(TaskSet)
    • 每个任务都分配一个任务进程去处理
  • DAGScheduler组件负责应用DAG的生成和管理

    • 根据程序代码生成DAG
    • 将程序分发到分布式计算集群
    • 按计算阶段的先后关系调度执行

2.3.2划分计算阶段

#上图DAG
rddB = rddA.groupBy(key)
rddD = rddC.map(func)
rddF = rddD.union(rddE)
rddG = rddB.join(rddF)
#4个函数,三个阶段
  • RDD之间的转换连接线呈现多对多交叉连接的时候,就会产生新的阶段
  • 一个RDD表示一个数据集,一个数据集中的多个数据分片需要进行分区传输,写入到另一个数据集的不同分片中
  • Spark中计算阶段划分的依据是Shuffle
  • 从数据集跨越,由多个分区传输的过程,叫做Shuffle
  • Shuffle将数据进行重新组合,把相同key的数据放一起,因为新的聚合、关联,产生新的计算阶段
  • 不需要Shuffle的依赖,称为窄依赖。需要Shuffle的依赖,称为宽依赖

MR与Spark效率比较:

  • 本质:
    • MapReduce根据Shuffle将大数据计算分为Map和Reduce两个阶段
    • Spark将前一个的Reduce和后一个的Map进行连接,当作一个阶段进行计算,从而形成了一个更高效流畅的计算模型
    • 本质是Map和Reduce,但多个计算阶段依赖执行的方案可以有效减少对HDFS的访问(落盘),减少作业的调度执行次数
  • 存储方式:
    • 使用磁盘存储Shuffle过程的数据
    • Spark优先使用内存进行数据存储(RDD也优先存于内存)

2.3.3作业管理

  1. DAGScheduler遇到Shuffle时,会生成一个计算阶段
  2. 遇到action函数时,会生成一个作业(Job)
  3. RDD里的每个数据分片,Spark都会创建一个计算任务进行处理,一个计算阶段会包含多个计算任务(Task)
    • 一个作业至少包含一个计算阶段
    • 每个计算阶段由多个任务组成
    • 这些任务(Task)组成一个任务集合
  4. DAGScheduler根据代码生成DAG图,Spark的任务调度以任务为单位进行分配,将任务分配到分布式集群的不同机器上执行。

2.3.4执行过程

  • spark支持多种部署方案(Standalone、Yarn、Mesos等)
  • 不同的部署方案核心功能和运行流程基本一样,只是不同组件角色命名不同。
  1. JVM启动应用程序(Driver进程)

    • Driver调用SparkContext初始化执行配置和输入数据
    • SparkContext启动DAGScheduler构造执行的DAG图,切分成计算任务这样的最小执行单位
  2. Driver向Cluster Manager请求计算资源,用于DAG的分布式计算

    • ClusterManager收到请求以后,将Driver的主机地址等信息通知给集群的所有计算节点Worker Node
  3. Worker收到信息

    • 根据Driver的主机地址,向Driver通信并注册,然后根据自己的空闲资源向Driver通报可以领用的任务数
    • Driver根据DAG图向注册的Worker分配任务

2.4实战应用

  1. spark local模式安装
  2. WordCount为例,查看SparkRDD执行流程

3参考

以上是关于数分-理论-大数据7-Spark的主要内容,如果未能解决你的问题,请参考以下文章

一篇文章搞懂DataSetDataFrameRDD-《每日五分钟搞定大数据》

Python中读取大文件的惰性方法?

如何计算一个非常大的惰性序列中的元素数量?

2021年大数据常用语言Scala:基础语法学习 声明变量

数据类型理论

python 生成器:生成器基础惰性实现