5分钟深入spark运行机制

转载-包子铺里聊it 
因为这篇文章说的简单明了,感觉有必要学习下哈…… 
其中有写概念我会加入我自己的理解(个人见解啊)。 
关键概念  
Spark 的关键就是引入了RDD,resilient distributed datasets概念。其实没有什么太深,你可以把rdd想想成一组数据。 
spark把要处理的数据,处理的中间结果,和输出结果都定义成RDD,这样一个场景的spark job就类似: 
从数据源读取数据,把输入转化成一个rdd; 
通过运算把输入RDD转换成另一个RDD; 
在通过运算把生成的RDD转换成另一个RDD,重复需要进行rdd转换操作。 
ps:主要2种transformation和action,操作一般就是etl中的t的步骤。本身语法是比较简单的。  
最后运算成结果RDD,处理结果。 
有个图,感觉没有必要就没放。 
为了处理 大数据 ,还是要把处理得数据进行分区,分散到多台机器上,以便之后月并行处理,这个和 Hadoop 的理念一致。不过,rdd默认存储到内存中,只有当数据大于spark被允许使用的内存大小时,才被splill到磁盘。 
ps:每个节点能给spark平台使用的内存是可以配置的,spark.executor.memory。  
RDD的接口  
考虑到RDD是连接psrak数据操作的核心,RDD的接口自然是重重。这套接口告诉你Lwsm生成了这个RDD,他的上一个RDD是谁,以及生成这个RDD,他的上一个RDD,以及生产的过程 使用的运算是什么。 
ps:关于RDD,他的特性有可以互相转化和血源关系,款依赖和窄依赖。互相转换就是一个RDD经过transformation操作可以转换成另一个RDD,这会然他们有关系,如果某个操作有问题了,可以通过重新运行父rdd来恢复(父RDD是重新运行的,并不是想hadoop那种保存中间结果),窄依赖和款依赖,款依赖会shuffle。  
在Spark里,由于RDD是被分区存储,所以我们要指导实际是每个RDD分区的来龙去脉。比如:你有一堆数据A,被分成了A1,A2,你为每个分区使用了 算法 F把他们转换成了另一堆数据B1,B2合起来就是B。那么当我们问,你如何得到B2时,你怎么回答。我们需要数据A2,并且需要运算F。同样的如何得到B1。我们需要数据A1,并且需要运算F,就是这么简单。 
数据操作  
别小看了RDD的这套接口,掐指一算,绝大数运算都可以有这套接口定义。 
map:一个RDD的分区分别转换成下一个RDD的分区,各个分区之间互不影响。那么每个RDD分区的爸爸就是上一个RDD的对应分区。运算就是用户定义的map function。 
Filter:过滤,F编程了这数据是否该留下来。在这种情况下这样A1>=B1,从量上。 
groupbykey:他里面的数据都不是单个的,而是Key-value形式。和hadoop一样,RDD B里面的分区中的数据可能是A1,也可能是A2,那我们就清楚楚地告诉B,你的每个分区的爸爸都是A里面的所有的分区。运算?就是合并所有的key一样的key value pair,组成一个set. 
等等。 
RDD构建  
RDD其实就是数据集,是一组数据被处理到另一个阶段的状态。 
每个spark job 就是定义了有输入RDD,如果把他转换成下一个状态,在下一个状态,直到转换成我们的输出。这些转换 就是对RDD里每一个操作。用个高大上的语言,一个spark job就是一系列的RDD以及他们之间的转换关系。那么如何定义RDD和转换关系呢? 
比较简单,去看 Scala 的操作就好了。 
Narrow或者wide有什么关系?  
一个spark job 中可能连续地调用transformation,比如map,filter,map等。 
我们可以大胆设想一下,如果每个分区里的数据就呆在那台机器的内存里,我们逐一的调用map,filter,map就可以,job就能够完成。 
更最要的是,由于数据没有转换到别的机器,我们避免了网络io和disk io。唯一的任务就是把map filter运行环境搬到这些机器上运行。这对机器来说,overhead几乎可以忽略不计。 
这种把多个操作合并到一起,在数据上一口气运行的方法在spark中pipeline。这就是不同就出现了:只有narrow transformation才可以进行pipeline操作。对于wide transformation,rdd转换需要很多分区预算,包括数据在机器之间移动。 
ps:宽依赖和窄依赖,感觉说的听复杂的,宽依赖有数据移动,shuffle过程,窄依赖没有,只是上一个状态到下一个状态的转变。  
rdd执行  
当用户调用action函数时,spark会在后台创建一个DAG(有向无环图)。就是说spark不仅用到DAG建模,而且是真正地创建了一个DAG,然后执行它(DAG在spark中不是一个对象表示的,而是用RDD对象之间的关系) 
spark会把这个DAG交给一个叫DAG scheduler的模块,DAG schedule会优先使用pipeline方法,把RDD的transformation压缩,当我们需要wide transformation时,由于之前的narrow transformation无法和wide transformation pipeline,那么DAG scheduler会把前面的transformation定义成一个stage。 
最要的事情说三遍(确实以前不知道):DAS scheduler会分析spark job 所有的transformation,用wide transformation做为边界,把所有的transformation分成若干个stage。一个stage里面的一个分区就被spark叫做一个task。所以一个task就是一个分区的数据和数据上面的操作,这些操作包含一个transformation,也可能多个,但一定是narrow transformation。 
DAG scheduler工作的结果就是产生一组stage,这组stage被传到spark的另一个组件task scheduler,task scheduler会使用集群管理一次执行task,当所有的task执行完毕,一个stage标记完成,在运行下一个stage,直到整个job运行完毕。 
这个其实就是rdd的执行过程,简化版。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值