前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spark 原理与实践 | 青训营笔记

Spark 原理与实践 | 青训营笔记

作者头像
鳄鱼儿
发布2024-05-21 21:38:54
900
发布2024-05-21 21:38:54
举报

Spark 原理与实践

大数据处理技术栈

常见大数据处理链路

大数据处理链路从数据采集、数据处理,再到数据应用

Spark

Spark 于 2009 年诞生于加州大学伯克利分校 AMPLab,2013 年被捐赠给 Apache 软件基金会,2014 年 2 月成为 Apache 的顶级项目。相对于 MapReduce 的批处理计算,Spark 可以带来上百倍的性能提升,因此它成为继 MapReduce 之后,最为广泛使用的分布式计算框架。

特点

  • 统一引擎,支持多种分布式场景
  • 多语言支持
  • 可读写丰富数据源
  • 丰富灵活的API/算子
  • 支持K8S/YARN/Mesos资源调度

运行架构

执行过程

  1. 用户程序创建 SparkContext 后,它会连接到集群资源管理器,集群资源管理器会为用户程序分配计算资源,并启动 Executor;
  2. Driver 将计算程序划分为不同的执行阶段和多个 Task,之后将 Task 发送给 Executor;
  3. Executor 负责执行 Task,并将执行状态汇报给 Driver,同时也会将当前节点资源的使用情况汇报给集群资源管理器。

SparkCore原理解析

RDD

RDD(Resilient Distributed Datasets弹性分布式数据集),可以简单的把RDD理解成一个提供了许多操作接口的数据集合,和一般数据集不同的是,其实际数据分布存储于一批机器中(内存或磁盘中)

RDD最重要的特性就是,提供了容错性,可以自动从节点失败中恢复过来。即如果某个节点上的RDD partition,因为节点故障,导致数据丢了,那么RDD会自动通过自己的数据来源重新计算该partition。

RDD的数据默认情况下存放在内存中的,但是在内存资源不足时,Spark会自动将RDD数据写入磁盘。(弹性)

RDD算子
  • Transform算子:生成一个新的RDD
    • map/filter/flatMap/groupByKey等
  • Action算子:触发Job提交
    • collect/count/take/saveAsTextFile等
RDD依赖

RDD依赖就是描述父子RDD之间的依赖关系(Lineage)

窄依赖:父RDD的每个partition至多对应一个子RDD分区。表现为一个父RDD的分区对应于一个子RDD的分区或者多个父RDD的分区对应于一个子RDD的分区。

宽依赖:父RDD的每个partition都可能对应多个子RDD分区。表现为存在一个父RDD的一个分区对应一个子RDD的多个分区。

图中的每个小方格代表一个分区,而一个大方格(比如包含3个或2个小方格的大方格)代表一个RDD,竖线左边显示的是窄依赖,而右边是宽依赖。

区分宽窄依赖,要了解父RDD(Parent RDD)和子RDD(Child RDD)。在上图中,“map,filter”左上面的是父RDD,而右上面的是子RDD。“union”左上面的两个RDD都是其右上面的RDD的父RDD,所以它是有两个父RDD的。

RDD的执行流程

调度器

内存管理

Executor内存主要有两类: Storage、Execution。

UnifiedMemoryManager统一管理 Storage/Execution内存

Storage和Execution内存使用是动态调整,可以相互借用

  • 当Storage空闲,Execution可以借用Storage的内存使用,可以减少spill等操作,Execution 使用的内存不能被Storage驱逐;
  • 当Execution空闲, Storage可以借用Execution的内存使用,当Execution需要内存时,可以驱逐被Storage借用的内存,直到spark.memory.storageFraction边界
多任务间内存分配

UnifiedMemoryManager统一管理多 个并发Task的内存分配

每个Task获取的内存区间为1/(2*N) ~ 1/N,N为当前Executor中正在并发运行的task数量

Shuffle

Shuffle,翻译成中文就是洗牌。之所以需要Shuffle,还是因为具有某种共同特征的一类数据需要最终汇聚(aggregate)到一个计算节点上进行计算。这些数据分布在各个存储节点上并且由不同节点的计算单元处理。

Shuffle Write

Shuffle Write,即数据是如何持久化到文件中,以使得下游的Task可以获取到其需要处理的数据的(即Shuffle Read)。

SortShuffleManager

每个MapTask生成一个Shuffle数据文件和一 个index文件

External Shuffle Service

shuffle write 的文件被 NodeManage r中的 Shuffle Service托管,供后续 Reduce Task 进行 shuffle fetch , 如果Executor空闲, DRA可以进行回收

SparkSQL

SparkSQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。

  1. 分析
    • Unresolved Logical plan --> Logical plan。Spark SQL的查询计划首先起始于由SQL解析器返回的AST,或者是由API构建的DataFrame对象。在这两种情况下,都会存在未处理的属性引用(某个查询字段可能不存在,或者数据类型错误),比如查询语句:SELECT col FROM sales,关于字段col的类型,或者该字段是否是一个有效的字段,只有等到查看该sales表时才会清楚。当不能确定一个属性字段的类型或者没能够与输入表进行匹配时,称之为未处理的。Spark SQL使用Catalyst的规则以及Catalog对象(能够访问数据源的表信息)来处理这些属性。首先会构建一个Unresolved Logical Plan树,然后作用一系列的规则,最后生成Logical Plan。
  2. 逻辑优化
    • Logical plan --> Optimized Logical Plan。逻辑优化阶段使用基于规则的优化策略,比如谓词下推、投影裁剪等。经过一些列优化过后,生成优化的逻辑计划Optimized Logical Plan。
  3. 物理计划
    • Optimized Logical Plan -->physical Plan。在物理计划阶段,Spark SQL会将优化的逻辑计划生成多个物理执行计划,然后使用Cost Model计算每个物理计划的成本,最终选择一个物理计划。在这个阶段,如果确定一张表很小(可以持久化到内存),Spark SQL会使用broadcast join。
  4. 生成代码,将查询部分编译成Java字节码
    • 查询优化的最终阶段是生成Java字节码,使用Quasi quotes来完成这项工作的。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spark 原理与实践
    • 大数据处理技术栈
      • 常见大数据处理链路
        • Spark
          • 特点
          • 运行架构
        • SparkCore原理解析
          • RDD
          • 调度器
          • 内存管理
          • Shuffle
        • SparkSQL
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档