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

80 阅读4分钟

这是我参与青训营笔记活动的第五天

大数据处理引擎Spark介绍

大数据处理技术栈

常见的大数据处理链路

开源大数据处理引擎

批式:map reduce Hadoop,Spark

  • map reduce Hadoop:解决了数据大规模计算的问题
  • spark:离线处理场景

流式:Flink

OLAP:presto,ClinkHourse,Impala,Doris

Spark的生态

)

Spark的特点

多语言支持:支持SQL,Java,Python,scala,R

丰富的数据源

  • 内置DataSource:
  • 自定义 DataSource

丰富的API/算子

  • SparkCore->RDD
  • SparkSQL->dataframe

Spark运行架构

  • 在application的main函数中创建SparkContext,负责和ClusterManager(集群管理器)通信,进行资源的申请,任务的分配和监控等。
  • ClusterManager将任务分配给多个Work Note(工作节点)
  • Executer(执行人)作为一个进程运行的Worker节点上,该进程负责运行Task,并且负责将数据存在内存或磁盘上

Spark的三种部署方式

  • Spark Local Modal:本地测试/单进程多线程模式

    • 进程:运行中的应用程序称为进程,拥有系统资源(CPU,内存)
    • 线程:进程中的一段代码,一个进程中可以有多个代码
  • Spark Standalone Modal(Spark独立模态):需要启动Spark的Standalone的Master/Worker

  • on YARN/K8S:依赖外部的资源调度器(YARN/K8S)


Sparkcore原理解析

SparkCore是Spark的核心,主要负责任务调度等管理功能,其实现依赖于RDD(Resilient Distribute Databases 弹性分布式数据库)的程序抽象概念。

描述RDD的五要素

  1. Partition:分区列表
  2. Compute:用于计算每个分割的函数
  3. Dependencies:对其他RDD的依赖列表
  4. Partitioner:键值RDD的分区器
  5. PreferredLocations:计算每个拆分的首选位置列表(eg:HDFS文件的块位置)

创建RDD

  • 内置RDD:shuffle RDD ,Hadoop RDD,JDBC RDD
  • 自定义RDD

两类RDD算子

  • Transform算子:生成一个新的RDD
  • Action算子:触发job提交

RDD依赖:描述父子RDD之间的依赖关系

  • 窄依赖:父RDD的每个partition至多对应1个子RDD分区
  • 宽依赖:父RDD的每个partition都可能对应多个子RDD分区(shuffleDependency)

image-20220801102840740

RDD执行流程

SparkSQL原理解析

  1. SQL解析器会把字符串解析为一个语法树,即变为Unresolved Logical Plan(未解析的逻辑计划)
  2. Analysis:遍历整个语法树,对每个节点进行数据类型的绑定,函数的绑定,根据catalog的元数据信息对数据表中的数据字段进行解析。最后变为(Logical plan 解析后的计划)
  3. Logical Optimization:是catalyst的核心,分为RBO和CBO两种策略。通过这一步后转换为Optimized Logical Plan(优化后的逻辑计划)
  4. Phyplanning:逻辑计划是不能被spark执行的,通过这一模块转换为Physical Plans(物理执行计划)
  5. cost Model:根据过去性能统计,选择最佳物理计划(cbo)
  6. code generation:代码生成,转换为Java实现

Catalyst优化器

  • RBO:基于规则优化

    • 实质:对语法树进行遍历,模式匹配,找到满足规则的节点,进行等价转换
    • Spark是通过RuleExecuter模块来调度规则
    • RuleExecute内部提供batch,定义了RuleExecute的处理步骤
    • batch->once:只执行一次
    • batch->once:重复执行,直到plan不再改变,或者到固定次数
  • CBO:基于代价优化

    • 先收集列,表的统计信息
    • 打开CBO进行估算
  • Adaptive Query Execution (AQE)自适应查询

    • 边执行边优化

    • 目前支持的优化场景

      • partition合并,优化shuffle读取,减少reduce task个数

        • 可以把相邻的较小分区合并为一个大的分区,由一个task读取进行处理
      • SMJ->BHJ

        • AQE运行过程中动态获取准确join的实际大小,将SortMergeJoin->BroadcastHashJoin
      • Skew join优化(数据倾斜优化)

        • 数据倾斜:分区之间的数据分布不均匀,拉慢整体速度
        • AQE根据shuffle文件统计自动检查倾斜,将大的分区转换为几个小的分区
  • Runtime Filter

    • 全局优化:从提升全局资源利用率,消除数据倾斜,降低IO等角度优化
    • 局部优化:提升某个task的执行效率,主要从提高CPU和内存利用率的角度进行优化