人工智能时代前沿技术社区

首页 > 大数据 > 热点

Spark计算引擎剖析

​Spark的计算是一个层层迭代的过程,迭代即上一轮的输出是下一轮计算的输入,RDD是spark计算的核心。飞马网于12月14日晚邀请到王富平老师为大家分享该领域的内容,王富平老师是苏宁大数据中心中台指标平台开发部技术负责人,一直从事大数据方向的研发工作,在实时计算领域经验丰富。

作者: | 2018-12-18 10:07:42

Spark的计算是一个层层迭代的过程,迭代即上一轮的输出是下一轮计算的输入,RDDspark计算的核心。飞马网于1214日晚邀请到王富平老师为大家分享该领域的内容,王富平老师是苏宁大数据中心中台指标平台开发部技术负责人,一直从事大数据方向的研发工作,在实时计算领域经验丰富。

1545099505189844.jpg

以下是本次分享的全部内容:

一、核心概念

Spark里面的数据存储都是以RDDResilient Distributed Datasets)形式存储的,也就是弹性分布式数据集。

特点:

1、分布在集群中的只读对象集合

2、可以存储在磁盘或内存中

3、通过并行“转换”操作构造

4、实效后自动重构

RDD是Spark计算引擎的核心概念。

RDD有两种操作,一种是transformation;一种是action

Transformation:

转换的概念,简单来讲,转换就是由一个RDD生成一个新的RDD.

Action:

要得到一个结果或者一个值,比如count、collectsave

Spark提供了一些TransformationAction的实现:

Spark程序架构:

首先,Spark程序是分布式的。这里有一个核心概念,Sparkdriver发起整个程序,executor是来执行具体任务的。

Spark On YARA的流程:

从简单的wordcount例子来看:

首先第一步读取文件,第二步转换为新的RDD,最后一步将结果保存到需要的地方。

结合这张图可以看到这个物理查询计划。

首先,分成了两个步骤,即stage1和stage2.1里面有三个动作,在2里面是对1的转换。

基本概念总结:

二、Spark计算引擎原理

分为四个阶段:

1、logical:通过RDD生成一个DAG这样的逻辑计划。

2、physical:划分多个stage,为DAG生成物理查询计划

3、schedule:调度并执行task

4、execution:分布式执行task

内部原理图:

这张图主要是为说明RDD的依赖关系,这种依赖关系主要分为两种,一种是宽依赖;一种是窄依赖。

一对一的依赖关系。左为窄依赖,右为宽依赖。

任务调度阶段:

生成job

三、Spark shuffle 剖析

Spark程序做优化就是为了优化shuffle,使它的性能变得更好。如果在实际中发现运行耗时较长,往往是因为shuffle

Reduce by key例子:

它定义了一个reduce的方法,即value进行合并的方法是两个相加。我们定义了三个分区。如上图。输入User RDD进行本地合并,合并之后将数据进行分区,发送到三个不同的任务上去,然后进行shuffle,然后在合并生成一个结果。

Local combine:先在本地将相同的key进行聚合,减少数据量。

Shuffle:洗牌,有目的的,把相同的key放在同一个分区,对应的所有值放在一个list里去。

Shuffle write

 

算法优化:hash—based

高效优化:sortbased


Shuffle read

Aggregate

四、Spark性能优化

三个思路:

1、Spark运行环境:存储于计算资源的优化

防止不必要的jar包上传和分发

提高数据本地性

存储格式选择,优先使用ORC和Parquet格式

将Spark运行在高配置机器上

2、优化RDD操作符的使用方法

过滤操作导致产生很多小任务,解决方案是对数据过滤后使用coalesce或者repartition操作符合并分若干分片

降低单条记录处理开销

处理数据倾斜或者任务倾斜

对复用的RDD进行缓存

操作符的选择

3、参数调优

设置合适的资源量

设置合理的JVM参数

启用更高效地序列化方法

增大off heap内存

Shuffle参数调优

设置reduce task数目

以上就是本次线上直播的主要内容,想了解更多更详细内容的小伙伴们,可以关注服务号:FMI飞马网,点击菜单栏飞马直播,即可进行学习。

微信图片_20180530151141.jpg