SPark关于缓存&坑

本文详细介绍了Spark的执行流程、运行架构特点和关键概念,重点关注Spark的缓存机制。Spark默认情况下,RDD仅使用一次,再次使用需重新计算。缓存机制可以避免重复计算,提高性能,但如果不恰当使用可能导致数据一致性问题。文中通过实例分析了在多维度计算中,由于对象引用值的改变引起的数据误差,并提出了解决方案,包括不缓存、复制对象等策略。
摘要由CSDN通过智能技术生成

SPark基本概念

对于Spark有一定了解的童鞋可以跳过前面基础概念的讲解,直接从下面的缓存部分开始看↓↓↓

Spark执行流程

Spark在执行Transformation类型操作时都不会立即执行,当遇到Action类型操作时,就会触发计算,每个action操作都会触发runJob操作,生成一个Job.在Driver中SparkContext根据RDD之间的依赖关系创建出DAG(有向无环图),DAGScheduler负责解析这个DAG,从当前Action方法向前回溯,如果遇到的是窄依赖则应用流水线优化,继续向前找,当碰到一个宽依赖时,就会把这个宽依赖之前的RDD组装成一个stage,再从当前宽依赖开始继续向前找,重复刚才的步骤,以此类推.每个stage由可以并发执行的一组task构成,一个partition对应一个task.DAGScheduler将stage划分完后,会将这组task提交到TaskScheduler去执行,任务会在Executor进程的多个Task线程上执行,完成Task任务后 将结果信息提交到ExecutorBackend中 他会将信息提交给TaskScheduler,TaskScheduler接到消息后通知TaskManager,移除该Task任务,开始执行下一个任务.TaskScheduler同时会将信息同步到TaskSet Manager中一份,全部任务执行完毕后TaskSet Manager将结果反馈给DAGScheduler,如果属于ResultTask 会交给JobListener.否则话全部任务执行完毕后写入数据.

Spark运行架构的特点

每个Application获取专属的Executor进程,该进程在Application期间一直驻留,并以多线程方式运行tasks。这种Application隔离机制有其优势,无论是从调度角度看(每个Driver调度它自己的任务),还是从运行角度看(来自不同Application的Task运行在不同的JVM中)。当前,这也意味着SparkApplication不能跨应用程序共享数据,除非将数据写入到外部存储系统。

几个名词解释

  1. Executor:
    在启动Spark程序时会指定num-executors executor数量,每个executor在yarn上就是一个container 也就是一个JVM
    通过executor-memory指定JVM内存大小
    spark提交命令
    而启动的一个Spark程序就是一个Application

  2. Job
    Spark是通过action算子触发真正的计算,每一个action操作会对应一个Job
    下面就是一个Application中的18个Job,也就是对应代码中的18个action操作
    一个Application中的18个Job

  3. Stage
    如上面所说的,在每个Job中从当前Action方法向前回溯,如果遇到的是

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值