专栏首页小强的进阶之路《从0到1学习spark》--手撕parallelize源码

《从0到1学习spark》--手撕parallelize源码

之前小强介绍了RDD是什么以及RDD的用法,如果还有疑惑的同学可以查看《从0到1学习spark》-- RDD,今天小强将介绍一下RDD的使用和源码解析。

手撕RDD

RDD有两种,一种如上图所示的,使用parallelize方法创建的并行集合

另外一种是外部存储创建的RDD,例如读取HDFS的内容。

http://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds

关于spark RDD官网资料

这里在传参的时,也就是图片红色圈起来的方法,和函数体里面都有执行到assertNotStopped()这个方法,那么这里看一下具体的内容

找到parallelize方法,先看看withScope这个方法的作用,因为这里在进入到这个断点前会先进入到这个方法里面,这里梳理一下几个方法的执行顺序

首先因为defaultParallelism这个方法作为形参的结果返回,因此第一个执行也就是最开始执行的内容,然后第二个执行withScope,接着才是执行函数体里面的内容也就是assertNotStooped()和new 这里的内容

这里会根据方法的注释可以知道,用户未指定时要使用的默认并行级别

那么这里默认级别是多少呢?还有这里是根据什么来设置的呢?

一直进入具体的方法

这里可以知道就是根据spark.default.parallelism这个参数来设置的,这里取两者的最大值

另外这里可以看到这里返回的参数结果是2,这里参数部分执行完默认的并行度之后,接着就是执行withScope方法了,这里同样进入查看一下

这里执行withScope,获取方法名称,然后再次调用withScope,但是这里的形参不一样

这里是对sc的一些属性进行设置,主要是对RDD的范围的获取

这里是一个柯里化的函数,柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数, 并且返回接受余下的参数而且返回结果的新函数的技术。

https://www.jianshu.com/p/8869c0777cbe

这里关于scala的函数的一些资料

https://blog.csdn.net/qq_21383435/article/details/79666170

关于spark withScope的源码的含义,可以具体参考网上的资料

withScope是最近的发现版中新增加的一个模块,它是用来做DAG可视化的(DAG visualization on SparkUI)

以前的sparkUI中只有stage的执行情况,也就是说我们不可以看到上个RDD到下个RDD的具体信息。于是为了在sparkUI中能展示更多的信息。所以把所有创建的RDD的方法都包裹起来,同时用RDDOperationScope 记录 RDD 的操作历史和关联,就能达成目标

然后这里执行完设置spark.rdd.scope的结果如上所示,关于withScope的内容这里因为涉及到其他模块,因此这里暂时只作为了解,后面有机会再详细研究。

然后执行完这里之后,就又回到了最前面的 parallelize

然后这里进入查看一下

这里主要是继承了RDD,然后看下具体的执行过程

这里主要的执行方法就是RDD.scala里面的内容了,可以看到这里涉及有checkpoint的内容

这个其实就是RDD的安全检查点,所谓的安全检查点其实是将系统运行的内存数据结构和状态持久化到磁盘当中,在需要时通过对这些吃就好数据的读取,重新构造出之前的运行期的状态

这里有几个地方可以注意一下,第一个地方是指定了持久化级别的

第二个看注释是用于创建RDD的,然后这里sc.getCallSite()这个方法是和堆栈有关的,这部分内容在创建sparkContext中也有,可以看具体的相关内容

然后可以看到这里得到的RDDOperationScope就是一个jsonMapper和scopeCounter

这里主要内容其实还是这个jsonMapper,说白了其实RDD也是一个大的Mapper,只不过里面包含了很多其他的各种工具内容等等。

那么创建完RDD之后,这里数据在哪里呢?

就是在这个body里面了

总结

今天小强介绍了RDD通过parallelize方法并行化创建的源码执行流程,欢迎大家在后台拍砖,让我们一起学习spark。

本文分享自微信公众号 - 小强的进阶之路(xiaoqiang_code),作者:程序员小强

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学习JVM是如何从入门到放弃的?(修订版)

    JVM在准备面试的时候就有看了,一直没时间写笔记。现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书。

    程序员小强
  • Java平台下日志的那些事

    Java平台下存在很多日志框架,比如JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j...

    程序员小强
  • 工作中遇到的99%SQL优化,这里都能给你解决方案(二)

    利用最左前缀法则:中间字段不能断,因此查询用到了name索引,从key_len=74也能看出,age索引列用在排序的过程中,因为Extra字段里没有using ...

    程序员小强
  • LXD 3.8 发布,下一代容器管理器

    LXD 3.8 发布了,LXD 是下一代容器管理程序,它提供类似于虚拟机的用户体验,但使用的是 Linux 容器。LXD 的核心是一个特权守护程序,它通过本地 ...

    Debian社区
  • bootstrap 颜色选择器

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>bootSt...

    用户5760343
  • struts2: 玩转 rest-plugin

    近期使用struts2的rest-plugin,参考官方示例struts2-rest-showcase,做了一个restful service小项目,但官网提供...

    菩提树下的杨过
  • 从敏捷转型到精益企业 | TW商业洞见

    科技即商业 TECHNOLOGY IS BUSINESS 数字化大时代下传统企业面临着种种挑战:效率永远跟不上市场业务需求,质量总是修修补补过日子,协同在部门墙...

    ThoughtWorks
  • WPF备忘录(5)怎样修改模板中的控件

         首先,想问大家一个问题,你们如果要给一个Button添加背景图片会怎么做?(呵呵,这个问题又点小白哈) 是这样吗? <Button ...

    hbbliyong
  • 【TypeScript 演化史 — 第二章】基于控制流的类型分析 和 只读属性

    基于控制流的类型分析 TypeScript 官网总结了基于控制流的类型分析: TypeScript 2.0 实现了对局部变量和参数的控制流类型分析。以前...

    Javanx
  • 第 3 章 敏捷软件开发

    love丁酥酥

扫码关注云+社区

领取腾讯云代金券