2019独角兽企业重金招聘Python工程师标准>>>

Spark core思考

Spark上的子框架,都是后来加上去的。都是在Spark core之上完成的,所有框架一切的实现最终还是由Spark core来做的,比如streaming的实现,具体来说是streaming的代码是如何翻译成spark core的。只是他们有各自领域和针对性的优化而已。抛开任何具体的东西,现在考虑下Spark core是个什么东西。

解析rdd

程序就是数据+代码。所以首先,我们需要考虑spark core由什么数据结构构成,一共就三种:rdd,broadcast,accumulator,最重要、最核心的是rdd。

rdd可以简单的认为是一个数组,只不过是一个分布式的数组。具备弹性、分布式的特性。我们一般传统的数据结构list、array等都是在一台机器,而spark的内核提供的最基础、最核心、最重要的数据结构是rdd,rdd是平铺在分布式的机器。
我们看这里发生了什么变化。实质上我们想,数据平铺在不同的机器,也就是数据的不同部分分布在不同的机器上,为了获得不同部分的数据,也要获得指针(地址)。指针会包含具体在什么机器上,范围是什么,和数据的下标相比只不过是加上了一个机器的维度。这个和在一台机器有没有本质的区别。因为都是地址的定位,只不过rdd有一套自己的定位机制。所以我们不应该认为rdd学习比数组学习更复杂。

上升一个维度来看,数据依然在磁盘或内存中。只是从原先的一台机器的磁盘或内存中,上升到了多台机器的磁盘或内存中而已。也就是说,原先数据(array)的寻址可能只有一个路径,现在升维后,多了机器的维度,比如协议,ip,端口等代表机器维度的信息,而已。

而 broadcast是全局Executor只读的。

而 accumulator是全局Executor只写的。

这在平常的程序中也是很常见的。

rdd的调度

基于rdd的编程和调度,我们也同样拿数组的编程调度来类比。传统的数组操作是在一个进程中,但是因为spark需要面对的是海量的分布在多台机器上的数据,因此这里有个权衡,是将数据复制到程序所在节点来计算呢,还是将程序放到数据所在节点计算?显然,面对海量的数据,网络传输是更大的瓶颈。因此在rdd中,需要将程序发送到数据所在的不同的机器上操作,就构成了数据不同代码动的理念。如果要操作数据,比如map,要找到数据所在的机器上,这个是rdd的perferedLocation来告诉你的。原先单机计算的时候,也需要知道数据在哪里,现在知道数据在哪里后,需要把代码传到那里(通过Http等方式),但是也只是把代码传过去而已。所以说分布式计算和单机计算也没有本质区别。

由于要跑到其他机器上,就有了管理的过程,怎么进行管理,就是driver负责的事情。普通数组的操作不需要怎么管理,因为没有到那么多机器上去。

RDD管理主要是管理计算,这里延伸出了一些东西:

第一个层面就是要知道怎么确定到不同的机器上,这个就是任务调度。
第二个层面,由于你是在不同的机器上,计算的时候出现错误,怎么进行容错。

容错

对数组操作出错,如果业务很复杂,也肯定会有容错的方式,至于rdd的操作也会更加慎重的考虑容错,因为分布式一旦出错的话,位于不同的机器上,代价比一台机器上更大。

业界容错的经典方式进行加检查点(加快照)并放在其他机器上,显然在海量数据量下,将某一步的计算结果保存下来,这种方式比较消耗时间,因为有网络通信等操作。因此,在不是特别重要的时候,不建议使用checkpoint。

rdd的方式是每次操作都会产生新的rdd,它记住的是算子之间的依赖关系,而不是从数据角度考虑容错。算子之间的关系进行记录是从数据产生的角度考虑容错。算子只是表达数据怎么产生这件事,rdd强大之处在于,既能够表达算子之间的依赖关系,还包涵了数据在哪里。

从容错角度看,由于rdd包涵了数据在哪里,在容错时再次获得数据的时候,它包含了数据本身和计算过程,所以可以部分的恢复数据,而不是全部的。同时,无论是数据的元数据还是计算关系都是在rdd中,这是个非常轻量级的过程,可以避免直接操作海量的数据本身。这是一个非常强悍的地方。

shuffle

在分布式计算的时候会有一些自己规则,比较典型的就是机器间要传数据的时候,搞了一个shuffle。

因为分布式的时候进行计算,计算时候有个很大的问题,就是不同的机器之间,需要通过数据级别的通讯。比如数组的计算,可能有全局级别的计算,比如各个item出现的次数。从分布式角度,group、reduce这种就是全局级别。

考虑全局级别就是整个分布式的关键之所在,这个时候就像我们对一个数组进行整体的操作,对rdd全局级别的操作,由于数据分布在不同的机器上,这个时候全局级别的操作,要加上ip、端口和具体数据存在什么地方,而且要在机器之间传数据。

机器之间传数据,代价比较大,所以当发生时,spark会把计算结果先保存在本地磁盘上,免得进行全局级别操作出现故障时,重新计算代码太大,这是一种用空间换时间的方式。计算成果放在本地磁盘上,整个驱动的调动程序会知道,方便告诉后面的计算数据到底在哪里。在下一个阶段计算时,会问driver数据在哪里,driver告诉之后,就会去上个阶段保存的地方去拿自己想要而数据,由于是分布式的,有自己的一套规则,对数据进行分门别类。

shuffle的过程就是对全局数据进行分类整理的过程,因为任何一台机器都有可能包含想要的数据,所以会依赖所有的数据来源。整理抓到我们想要的数据之后,就继续进行计算,而由于进行网络的传输,都会有一些调用逻辑,从spark角度讲就变成了stage。

小结

rdd就是个大大的分布式数组,计算时有时是自己单纯的计算,有时是全局的计算,和对数组操作没有任何区别。

不同语言都有一套语法规则,但是核心是思考如何处理数据。spark是运行在jvm上的,jvm并不知道spark这个东西,所以一个事实是,jvm只有一些基本的数据结构和语法的支持,spark只不过是在jvm基础上,构造了rdd这个数据结构而已。所以精通spark和精通其他java程序没有区别。因为jvm本身就屏蔽掉了不同机器之间的区别,只需要进行地址定位就可以,这就是jvm的伟大之处,分布式和单机处理没有本质区别。

数据分布在多台机器,数据依然通过地址定位后。唯一的不同,是因为数据量特别大,移动特别耗时,只能将程序发送到数据端计算。然后又多了一些调度的工作。而已。

忘掉分布式,会接触更加本质的东西。

借鉴

欲知后事如何,且听下回分解!

转载于:https://my.oschina.net/corleone/blog/713748

spark内核回顾思考 RDD相关推荐

  1. PySpark | RDD持久化 | 共享变量 | Spark内核调度

    文章目录 一.RDD持久化 1.RDD的数据是过程数据 2.RDD缓存 2.1 RDD缓存的特点 2.2 cache()与unpersist()实战 3.RDD CheckPoint 3.1 Chec ...

  2. 05_大数据技术之Spark内核解析(1.1)

    1. Spark 内核概述 Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spa ...

  3. Spark内核(上)——附:两种Yarn模式源码解析

    文章目录 一.Spark内核概述 1.1 Spark核心组件回顾 1.1.1 Driver 1.1.2 Executor 1.2 Spark通用运行流程概述 二.Spark通信架构概述 2.1 Spa ...

  4. 第13课 spark内核架构解密学习笔记

    第13课 spark内核架构解密学习笔记  2016.01.16 内容: 1.通过手动绘图的方式解密spark内核架构 2.通过案例验证spark内核架构 3.spark架构思考 第一阶段:彻底精通s ...

  5. 大数据计算平台Spark内核全面解读

    1.Spark介绍 Spark是起源于美国加州大学伯克利分校AMPLab的大数据计算平台,在2010年开源,目前是Apache软件基金会的顶级项目.随着Spark在大数据计算领域的暂露头角,越来越多的 ...

  6. Spark内核解析1

    Spark通讯架构 脚本探究: 概述 Spark 内核泛指 Spark 的核心运行机制,包括 Spark 核心组件的运行机制.Spark 任务调度机制.Spark 内存管理机制.Spark 核心功能的 ...

  7. Spark内核解析之一:内核概述

    Spark 内核概述 Spark 内核泛指 Spark 的核心运行机制,包括 Spark 核心组件的运行机制.Spark任务调度机制.Spark 内存管理机制.Spark 核心功能的运行原理等,熟练掌 ...

  8. spark期末大作业RDD编程初级实践

    1.需求描述 本次实验需要:系统:linux unbuntu14.04,处理器:至少需要两个处器,一个内核,内存:至少4G,硬盘空间:大小需要20GB.Hadoop:2.7.1以上版本,JDK:1.8 ...

  9. 一、Spark内核之运行机制

    Spark内核系列目录 一.Spark内核的运行机制 二.Spark内核的通讯架构 文章目录 Spark内核系列目录 前言 一.Spark核心组件 1.Driver 2. Executor 3. Sp ...

最新文章

  1. 自动登录126邮箱的脚本
  2. LeetCode 410——分割数组的最大值
  3. SpringMVC  注解式传递Ztree参数
  4. “约见”面试官系列之常见面试题之第九十篇之页面加载触发函数(建议收藏)
  5. C++远征之封装篇——字符串类型
  6. Flink WatermarkKeyed
  7. hdu 1142 记忆化搜索
  8. NOR Flash的原理与操作
  9. 持久化存储技术之SharedPreferences存储
  10. sql语句分页多种方式ROW_NUMBER()OVER
  11. android shape 使用小结
  12. mysql如何创建用户代码_Mysql 创建用户 受权_mysql
  13. 别样的风景——韦应物《滁州西涧》赏析
  14. IF:5+ 7种癌症免疫治疗证明DNA损伤反应通路突变可作为免疫检查点阻断疗效的潜在生物标志物
  15. Android 百度文字识别(详细步骤+源码)
  16. 毫米波雷达(一):原理
  17. IBM 中国研究院面试经历
  18. 【Python码住雪景小程序】雪景人像最强攻略:让你一下美10倍、美醉了(中国人不骗中国人)
  19. 并不简单的翻页时钟(一):样式篇(Flex布局、line-height、data-set用法、css before after伪元素)
  20. python3安装scapy_scapy安装

热门文章

  1. DCMTK:测试文件是否使用DICOM Part 10格式
  2. VTK:Rendering之Skybox_PBR
  3. VTK:Filtering之ConnectivityFilter
  4. OpenCV watershed分水岭分割算法的实例(附完整代码)
  5. OpenCV信息流Alpha遮罩
  6. 智能指针 shared_ptr 的实现(源码)
  7. C++什么时候需要使用“常引用”?
  8. QT实现在图表顶部绘制一个附加元素(标注)
  9. QML基础类型之var
  10. 经典C语言程序100例之二七