思考是一件有意思的事情。遇到问题,思考出结论,那么脑子里面的过程是什么呢,或者脑子里面是什么呢。我一直认为,这团团的里面是一个模糊的n维空间。理解一个复杂的系统、公式、算法,都要在这个n维空间里具象化。这个具象化的镜像的精确度就代表了理解的深入度。想起了,考研的时候,太用力,每天晚上脑袋里镜像不断刷新的画面。

最近一直在折腾spark,项目赶得飞快,理解上的问题也一直在积压。今天慢慢梳理,突然发现脑袋里面的镜像构建的不对。

spark的rdd是分布式的存储在内存中的,每个stage的边界是宽依赖导致的shuffle,连续的窄依赖(如map)在一个stage中流水线的执行。之前脑中的镜像是图左,窄依赖不必依赖其他的node,一个node的分区窄依赖变换时不必依赖其他node,所以可以连续执行;宽依赖需要其他node的数据,所以只能shuffle了。

在这种镜像下,我自己很多困惑没有得到解答,比如2个rdd的笛卡尔积为什么是窄依赖呢?笛卡尔积是全连接,需要所有node上的数据。知乎上有个问题是问这个的,有个答案竟然是spark后来的实现打破了自己论文中的设计。有次面试一位多年spark经验的开发,也是这样被误导了。

重新构建一下,如图右。RDD只是一个抽象的概念,分区也是抽象的,并不会存储在内存中,只有调用了cache等明确要求存储的函数时,RDD的分区才会存储到内存变成block。spark运行时并不存在分区,而是对分区进行计算的任务。每个任务其实就是一段执行代码,代码中的内容是就是这一个stage中的连续窄依赖变换,如果图右中的map和groupBy。

那么为什么要把一个job通过宽依赖划分为不同的stage呢?其实很像我们优化一段代码,想提升速度,自然的,开多线程。但如果这段代码中,有一些过程需要依赖前面过程全部执行完才能正确运行。这时,我们切分这段代码为(a,b,c),c依赖b执行完,b依赖a执行完。然后,把这段代码划分为3个stage,每个stage分别多线程运行a,b,c 3块代码。a,b,c内部的操作就是窄依赖,可以并行的执行,a,b,c的边界就是宽依赖,需要前一个stage执行完才可以运行。

这样想,清晰了很多,一个变换是不是窄依赖的决定性因素是:每个分区任务是否可以独立并行的执行。是的话,就可以和其他相邻窄依赖一起合并成任务并行执行。那我们看一下笛卡尔积的例子吧。

如上图,笛卡尔积是可以独立并行执行的,拿到父RDD(2位)的2个分区(m,n)变换出a分区不需要依赖父RDD的其他分区。

笛卡尔积也并有打破论文中的定义:窄依赖是独生家庭,父RDD的一个分区只会唯一生成子RDD的一个分区。假设RDD1(M个分区)和RDD2(N个分区)笛卡尔积得到的子RDD有M*N个分区。父RDD为2个RDD,他的一个分区为(m,n)唯一生成子RDD中的一个分区a,是独生子女,符合政策,不用罚款。

持续构建中。。。

您的关注可能成为我写的动力,助我能每周坚持一篇吧

spark头脑镜像的更多相关文章

  1. zhihu spark集群,书籍,论文

    spark集群中的节点可以只处理自身独立数据库里的数据,然后汇总吗? 修改 我将spark搭建在两台机器上,其中一台既是master又是slave,另一台是slave,两台机器上均装有独立的mongo ...

  2. Spark入门(1-4)安装、运行Spark

    如何安装Spark 安装和使用Spark有几种不同方式.你可以在自己的电脑上将Spark作为一个独立的框架安装或者从诸如Cloudera,HortonWorks或MapR之类的供应商处获取一个Spar ...

  3. docker 快速部署ES集群 spark集群

    1) 拉下来 ES集群  spark集群 两套快速部署环境, 并只用docker跑起来,并保存到私库. 2)弄清楚怎么样打包 linux镜像(或者说制作). 3)试着改一下,让它们跑在集群里面. 4) ...

  4. hadoop进阶----hadoop经验(一)-----生产环境hadoop部署在超大内存服务器的虚拟机集群上vs几个内存较小的物理机

    生产环境 hadoop部署在超大内存服务器的虚拟机集群上 好 还是  几个内存较小的物理机上好? 虚拟机集群优点 虚拟化会带来一些其他方面的功能. 资源隔离.有些集群是专用的,比如给你三台设备只跑一个 ...

  5. 使用 Iceberg on Kubernetes 打造新一代云原生数据湖

    背景 大数据发展至今,按照 Google 2003年发布的<The Google File System>第一篇论文算起,已走过17个年头.可惜的是 Google 当时并没有开源其技术,& ...

  6. Docker 搭建Spark 依赖singularities/spark:2.2镜像

    singularities/spark:2.2版本中 Hadoop版本:2.8.2 Spark版本: 2.2.1 Scala版本:2.11.8 Java版本:1.8.0_151 拉取镜像: [root ...

  7. Docker 搭建Spark 依赖sequenceiq/spark:1.6镜像

    使用Docker-Hub中Spark排行最高的sequenceiq/spark:1.6.0. 操作: 拉取镜像: [root@localhost home]# docker pull sequence ...

  8. 创建Spark镜像文件

    创建Spark镜像文件 1.将spark容器提交到新的镜像中 $>docker commit 01a25bdf1499 myrepos:centos-spark 2.将centos-spark镜 ...

  9. 制作spark镜像

    构建镜像 添加jdk引用(可以使用yum进行安装): 安装SSH 碰到一个问题,执行systemctl的时候发生了异常: Failed to get D-Bus connection 解决这个问题的方 ...

随机推荐

  1. HUST 1585 排队

    1585 - 排队 时间限制:1秒 内存限制:128兆 351 次提交 179 次通过 题目描述 BG站在一个有n个人的队伍中,但他并不知道他处于队伍中的哪个位置,他向前向后观察,只能断定他的前方有至 ...

  2. bzoj 2946

    Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单词 l        计算最长公共子串的长度 l        输 ...

  3. bzoj:3392: [Usaco2005 Feb]Part Acquisition 交易

    Description     奶牛们接到了寻找一种新型挤奶机的任务,为此它们准备依次经过N(1≤N≤50000)颗行星,在行星上进行交易.为了方便,奶牛们已经给可能出现的K(1≤K≤1000)种货物 ...

  4. [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)

    以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列S ...

  5. UVA 572 dfs求连通块

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...

  6. android狼人杀源码,桌面源码,猎豹快切源码

    Android精选源码 android实现狼人杀app源码 android实现精心打造的Android基础框架源码 android热门电影的客户端源码 android 实现桌面的Launcher源码 ...

  7. linux基本命令学习01

    =============================================================================Unix/Linux最主要的应用领域是基础服务 ...

  8. zookeeper基本讲解及基本命令和配置 (转)

    一.ZooKeeper概述 ZooKeeper是一种为分布式应用所设计的高可用.高性能且一致的开源协调服务,是Google的Chubby一个开源实现,是Hadoop和Hbase的重要组件,它提供了一项 ...

  9. css之隐藏内容的方法

    css隐藏内容的方法有三种:即display:none.visibility:hidden.overflow:hidden. 1.display:none;的缺陷: 搜索引擎可能认为被隐藏的文字属于垃 ...

  10. 算法-java代码实现计数排序

    计数排序   第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3], ...