思考是一件有意思的事情。遇到问题,思考出结论,那么脑子里面的过程是什么呢,或者脑子里面是什么呢。我一直认为,这团团的里面是一个模糊的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. http常见状态码含义

    200:请求成功 301:请求的资源已永久移动到新位置 302:请求的资源临时移动到新位置 304:请求内容无改变 401:未授权 403:禁止访问 404:文件未找到 500:服务器内部错误 501 ...

  2. cain使用方法

    首先安装cain,这里就不废话了 1, 选择中核弹标志左边的按一下,然后在sniffer右键点击第一个扫描内网所有ip 扫描完后选择网关的IP下面选择arp标志,在按一下上方空格处,+号变得可以使用了 ...

  3. 【Java学习笔记之二十七】Java8中传多个参数时的方法

    java中传参数时,在类型后面跟"..."的使用:        public static void main(String[] args){       testStringA ...

  4. vijos 1110小胖邮递员;bzoj 1210: [HNOI2004]邮递员

    Description Smith在P市的邮政局工作,他每天的工作是从邮局出发,到自己所管辖的所有邮筒取信件,然后带回邮局.他所管辖的邮筒非常巧地排成了一个m*n的点阵(点阵中的间距都是相等的).左上 ...

  5. angular2 Http和websocket

    1. 注入HttpModule模块: 2. 注入http服务 map方法需要导入"rajx/Rx"组件,作用是针对流的处理.Json是将流转化为json格式.subscribe订阅 ...

  6. Oracle实战笔记(第三天)

    导读 今天的主要内容有:java连接Oracle.事务.Oracle中的事务处理.Oracle函数. 一.Java连接Oracle的两种方式 第一种:桥连接(JDBC_ODBC)(不推荐) 1.准备工 ...

  7. [国嵌笔记][010][TFTP与NFS服务器配置]

    交叉开发 嵌入式软件产生的平台称为宿主机,运行嵌入式软件的平台称为目标机 宿主机一般通过串口.网络.USB.JTAG等方式将软件下载到目标机 网络下载 一般有TFTP和NFS两种方式 tftp服务器 ...

  8. 自写 zTree搜索功能 -- 关键字查询 -- 递归无限层

    唠叨一哈 前两天朋友跟我说要一个ztree的搜索功能,我劈头就是一巴掌:这种方法难道无数前辈还做少了?自己去找,我很忙~然后我默默地蹲着写zTree的搜索方法去了.为什么呢?因为我说了句“找不到是不可 ...

  9. SDP(2):ScalikeJDBC-Connection Pool Configuration

    scalikeJDBC可以通过配置文件来设置连接池及全局系统参数.对配置文件的解析是通过TypesafeConfig工具库实现的.默认加载classpath下的application.conf,app ...

  10. 如何给网站添加CNZZ站长统计功能代码的常用办法

    前几天有个客户来问小编怎么给网站添加上CNZZ站长统计工具,其实这个很简单,只要把cnzz免费代码复制到我们的footer文件就行.今天小编正好有空就来分享一下具体的操作过程. 首先要想获得这个免费的 ...