Spark运行框架和RDD特征 | 青训营笔记

73 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

Spark

解决海量数据的分析计算;先申请资源,在进行计算;

运行框架

Spark

Spark

  1. 构建Application环境,申请资源;
  2. 启动Executor,与Cluster Manager维持心跳;
  3. Spark Context构建DAG,将 DAG 图分解成多个 Stage,任务调度器将task分发;
  4. Executor执行任务;
Driver
  • 将用户程序转化为作业(job)
  • 在 Executor 之间调度任务(task)
  • 跟踪Executor 的执行情况
  • 通过UI 展示查询运行情况
  • 算子以外的代码都是在Driver 端执行
Executor
  • 运行在工作节点(Worker)中的一个JVM 进程,是整个集群中的专门用于计算的节点;
  • RDD 直接缓存 Executor 进程内;
  • 算子里面的代码都是在Executor 端执行
Master & Worker

独立部署环境中

  • Master是一个进程,负责资源的调度和分配,并进行集群的监控等;
  • Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处理和计算;
ApplicationMaster

用于向资源调度器申请Container容器,资源与计算的解耦;

Spark运行模式

  • Local:运行在一台机器上。 测试用。
  • Standalone:是Spark自身的一个调度系统。
  • Yarn:采用Hadoop的资源调度器

Spark常用端口号

  • 4040:spark-shell 任务端口
  • 7077:内部通讯端口
  • 8080:任务执行的端口
  • 18080:历史服务器

RDD五大属性

rdd主要是将逻辑封装,生成task发送到executor执行计算

  1. 分区列表

    rdd是被分区的,每个分区都会被一个计算任务(Task)处理,用于执行任务时并行计算,如果不指定那默认cpu的核数(从集合中获取)/hdfs文件的block数(从hdfs文件中);

  2. 每个分区都有计算函数

    使用分区函数对每个分区计算;

  3. 基于其他rdd的列表

    rdd之间的依赖关系(血缘):宽依赖(有shuffle)和窄依赖(每个上游rdd最多被下游的一个分区使用->独生子女),当错误发生时,我们可以通过依赖关系进行恢复,可能不需要全部重新开始;

  4. key-value数据类型的分区器

    当数据为 KV 时,可以通过(Hash分区 / Range分区 / 用户自定义分区)指定分区;

  5. 首选位置

    计算数据时,可以根据计算节点的状态选择不同的节点位置进行计算,因为我们认为转移计算比转移数据更加方便,所以我们会把计算逻辑发送到数据所在的块位置,以减少IO;

image.png

RDD转换算子

value: map / mapPartitions / mapPartitionsWithIndex / flatMap / glom / groupBy / filter / sample / distinct / coalesce / repartition / sortBy

双value:intersection / union / subtract / zip

key-value: partitionBy / reduceByKey / groupByKey / aggregateByKey / foldByKey / combineByKey / sortByKey / join / leftOuterJoin / cogroup

RDD行动算子

reduce / collect / count / first / take / takeOrdered / aggregate / fold / countByKey / foreach / save相关

当spark与数据库操作时,由于数据算子内的操作都是在executor端做的,所以需要有闭包的问题,可以使用foreachPartition代替foreach,在前者中获取数据库连接,那样只需要在一个分区内连接一次了。

内存管理

Spark 作为一个基于内存的分布式计算引擎,Spark采用统一内存管理机制。重点在于动态占用机制。执行内存(程序执行时需要的空间)和存储内存(用户定义的广播变量、分区器等等)可以互相占用,但是运行内存比较强势,如果他需要资源时会把存储内存驱逐。

image.png 具体了解请点击

SparkSQL

执行过程

解析-》 优化 -》 生成执行计划

image.png

影响SparkSQL性能两大技术:

  1. Optimizer:执行计划的优化,目标是找出最优的执行计划
  1. Runtime:运行时优化,目标是在既定的执行计划下尽可能快的执行完毕。

RBO:基于规则优化 CBO:基于代价优化 优化手段