Spark笔记2. RDD初探


RDD

先只做一个静态的分析,即上图最左面部份,动态调度执行稍后分析


概念理解

做为新手,RDD看的我头痛,Resilient Distributed Dataset,  弹性分布式数据集,有哪些特点呢?

1. 首先他是 Dataset, 俗称数据集。可以类比 Redis 里的 ZSET, HSET, SET, 保存数据的一种组织结构而已。区别就在于 RDD 是分布式,粗粒度

2. 关于分布式,大家所熟知的就是将数据分片。类比 MySQL 分库分表,可以有按 ID 做 Range 分怎,也可以按 Hash。RDD 也同样,具体取决于 partitioner 如何实现。

3. 具有 fault tolerance 特性,做个对比,关系数据库一般都是对分区 partition 做多副本来做到容灾和高可用。但是RDD 完全另外一个思路,他有一个 lineage(血统??) 的概念,每一个 partition 都可以回溯来重建。

4. 由于 RDD 只读,每一个 RDD 都由父 RDD 和做用之上的操作生成,父子 partition 涉及一一对应(窄依赖)和一对多(宽依赖),而这种依赖关系就是构成 fault tolerance 回溯的基础。

上面只是对于 RDD 静态的分析,至于动态的调度执行和 stage 划分下次再分享。


RDD 五要素

1. A list of partitions   数据分区

2. A function for computing each split 每个片的处理函数

3. A list of dependencies on other RDDs 依赖

4. Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) 分区函数很重要,对于join group 优化

5. Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)


例子: 行数统计

来看一个官网 quick start 例子,打开 spark-shell

scala> val textFile = sc.textFile("README.md")

textFile: org.apache.spark.rdd.RDD[String] = README.md MapPartitionsRDD[1] at textFile at:27

textFile 是一个 MapPartitionsRDD, 他没有 Dependency, 并且也不会读取数据,不做任何操作

scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))

linesWithSpark: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at:29

linesWithSpark 同样也是一个 MapPartitionsRDD, 他有 Dependency, 就是上文的 textFile, 并且附加一个 filter 操作,返回包含 “Spark” 的记录

scala> linesWithSpark.count

res0: Long = 17

最后执行 count 函数,得到记录 17 

transformation 和 action

RDD 只读,所以每次 filter, map, flatMap 等操作都是生成一个新的 RDD, 多个 RDD 为链式关系,由 Denpendency 和 compute 联系在一起。下图是主要的两类函数。

transformations和action

transformation: 惰性的操作,只生成新的 RDD, 描述执行逻辑

action: 会提交 job, 交给 worker 去执行,流式依次计算所有 transformation 操作,流式的精髓在于 Iterator

对应文中例子,textFile和filter 都是 transformation 操作,只负责生成 RDD, 只有最后一个 count 才发起 job 执行。

filter

filter 函数简单明了,直接生成一个新的 MapPartitionsRDD, 重点在于两个参数 this 和 iter 操作的闭包

MapPartitionsRDD

MapPartitionsRDD 要重写几个关键成员函数,partitioner 决定如何做分区,getPartitions 决定如何从父 RDD 中获取自已使用的 partition,这块是简单的 one to one依赖,即窄依赖,后续会涉及到 shuffle 宽依赖再分析。compute 封装传弟的 f 闭包,直接作用于 partition, 这里都是针对 Iterator, 不到最后触发是不会执行。

Reduce

count不具有代表现,贴一个 reduce 源码, 最常见的就是 reduce(_+_),如果大家了解单机的,肯定知道原理,对于分布式的RDD也一样。 jobResult 是一个 Option[T] 结果,mergeResult 决定如何对各个分区的结果进行操作,就是调用 reduce(f: (T,T) => T): T 里面的闭包f,对于各分区也执行 f。

RDD 的初探,DAGSchdule 后文分析,如有理解有误的请大家指证

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容