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的执行过程,简化版。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值