Spark中的RDD到底是什么

刘超 16天前 ⋅ 110 阅读   编辑

一、大白话说RDD

  有如下杯子,它由圆筒(3)、圆(2)、耳朵(1)等积木组成:

 

  假设有10个杯子,我们把这些杯子拆分开来,那就是一大堆积木,这堆积木我们可以看成RDD,每种形状(圆筒、圆、耳朵)就是一个Partition;每个形状的积木给一个小盆友去玩,小盆友就是一个处理这个Partition的Task。

  现要求每个小盆友根据手上已有的积木组成自己喜欢的形状,那就不需要和其他小盆友交互,不需要Shuffle

  当要求每个小盆友利用各种形状搭出一个杯子,那就需要和其他小盆友借不同形状的积木了,这就是Shufle。

  老师用一个小本本做记录,记录下小盆友A从小盆友B借得圆筒,这个小本本可以看做lineage。每个小盆友搭建积木的目的是统一交付给老师进行打分,或者各自保存起来。那么这个目的就是Action,由此触发小盆友搭建积木的动作。当互借完成,有些小盆友不满意自己分配时,要求回到之前某个状态,就是基于lineage的容错机制

二、从表现形式来说RDD
  RDD从表现形式上讲类似于数据库的视图(View),去除这个RDD在物理结构上的特色,单从逻辑上的表现来说,它就是一个数据集合。
  那什么是数据集合?可以理解为Java中的一个list,或者是数据库里的一张表(或者视图)等等。
  既然是一张表,我们可以理解Spark对RDD的操作,其实类似于SQL里面对表的一些操作。
  在最开始的时候说RDD最类似数据库的视图,那为什么是视图而不是表呢?这就要说说RDD里面的这个R(弹性),什么叫弹性呢,就是一个RDD的数据并不一定是物理上真实存在的,注意是不一定,就像数据库里的视图(view),只有你在query的时候他才会真正计算出这些数据。RDD里的数据也一样,比如一张全是大写地名的表-- {S: SHANGHAI, BEIJING, ...},可能在RDD里是这样一种形式 {S = S1:{Shanghai, BEIJing, ...}. toUPPERcase }. 前面提到的两个集合在物理上的内容其实是不一样的,但是最终结果是一样的。在Spark里面,类似于toUPPERcase 这样的操作我们叫算子。好了,这样就理解了这个R。再说说中间的那个D(分布式),这个很好理解,就是一个数据集分别放在几个机器上,而RDD只要存储这些数据的元信息(如那一片在哪个机器上)即可。这样也就不难理解“RDD,包含一组分区列表(实际上是分区到block的映射,具体数据可以是分布式的存储在HDFS各个节点上)以及一组transformation或action算子等”
  不过这样解释似乎缺了些什么,就是为什么RDD要如此麻烦呢?这里我说最明显的两个亮点。1,容错:比如你有一个表,里面是一个公司12个月的平均销售额,存储在12个机器上,突然存储8月数据的机器坏了,那么通常选择的做法是把整一年的销售资料拿出来,再以月份分组,再把8月的算出来,存在一个好的机器里。而RDD存储8月的数据可能就是(select avg(sales)from t where month = 8) ,在你需要的时侯,如果发现8月数据不在了,可以自动从原数据里把这个数据恢复出来。(这个例子并不是特别真实,只不过很简单的帮你理解容错这个特性)。另一个优点是执行效率优化。假设有这么一个情况,有一个数据表,先把里面的数据都+1,再-1,再+1,再-1. 这样显然数据应该都是不变的。如果你每次都把这个数据表都算出来,这样就要执行4次O(n)效率的查找。然而用RDD的思路,{S'} = {S}+1-1+1-1 => {S'} = {s} + 0, 这样就大大提高了效率。(同样这个例子很弱智,但是能帮助你理解RDD为什么要用数据+算子的形式去描述一个数据集).
三、参考文章
1、https://www.zhihu.com/question/37437257/answer/139975355

注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: