Spark框架作为大数据计算的第二代框架,主要的优势就是在计算性能上的优化,因为这使得大规模数据计算的效率和结果反馈的速度,都得到极大的提升,对于大数据的下一步运用,也有更明显的优势。而Spark计算性能的优化,其中涉及到很关键的一部分,就是Spark Stage划分。
Spark Stage划分,贯穿于Spark作业任务的运行之中,涉及到三个环节:
第一步:生成逻辑计划
Spark通过应用程序内部RDD之间的依赖关系,构造DAG,其中DAG的每个点是RDD对象,边则是两个RDD之间的转换方式。
第二步:生成物理计划
根据前一阶段生成的DAG,按照一定的规则进一步生划分为若干个stage,其中每个stage由若干个可以并行计算的任务构成。
这里,就是Spark Stage划分的关键节点。stage的划分原则是以shuffle依赖为界划分的,将非shuffle依赖的RDD尽可能压缩到一个stage中,同一个stage中,task执行在同一个executor里,避免数据传输。
根据RDD不同依赖关系,Spark Stage划分出来的两种类型,是
宽依赖和窄依赖。
窄依赖:父RDD的每个分区都只被RDD的一个子分区使用,即每个输入分区(父RDD),只有一个输出分区(子RDD),但是一个子分区可能会有多个父分区,换句话说,就是没有shuffle依赖关系的是窄依赖。
宽依赖:一个父RDD分区被子RDD的多个分区使用,会有shuffle发生(一个父分区,输出多个子分区)。
每个stage内部是窄依赖,stage之间是宽依赖。stage划分还有一个前提,就是spark的惰性计算机制,有了惰性计算,才让宽窄依赖划分成为可能。
第三步:调度并执行任务
按照依赖关系,调度并计算每个stage,对于给定的stage,将其对应的任务调度给多个Executor同时计算。
从以上的Spark任务运行,我们可以看出Spark Stage划分的依据,Spark Stage与Shuffle之间的关系。在Spark框架的学习当中,理解了这些原理,才能更好地理解下一步的运算。
成都大数据培训机构,加米谷大数据,大数据技术分享,大数据专业培训,课程大纲及学习资料,可私聊客服领取!