Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35
Spark core思考
Spark上的子框架,都是后来加上去的。都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来做的。抛开任何具体的东西,现在考虑下Spark core是个什么东西。
解析rdd
程序就是数据+代码。所以首先,我们需要考虑spark core由什么数据结构构成,一共就三种:rdd,broadcast,accumulator,最重要、最核心的是rdd。
rdd可以简单的认为是一个数组,只不过是一个分布式的数组。具备弹性、分布式的特性。我们一般传统的数据结构list、set等都是在一台机器,而spark的内核提供的最基础、最核心、最重要的数据结构是rdd,rdd是平铺在分布式的机器。
我们看这里发生了什么变化。实质上我们想,数据平铺在不同的机器,也就是数据的不同部分分布在不同的机器上,为了获得不同部分的数据,也要获得指针(地址)。执政会包含具体在什么机器上,范围是什么,和数据的下标相比只不过是加上了一个机器的维度。这个和在一台机器有没有本质的区别。因为都是地址的定位,只不过rdd有一套自己的定位机制。所以我们不应该认为rdd学习比数组学习更复杂。
rdd的调度
基于rdd的编程和调度,我们也同样拿数组的编程调度来类比。数组操作是在一个进程中,而rdd中,需要在不同的机器上操作,就构成了数据不同代码动的理念。如果要操作数据,比如map,要找到数据所在的机器上,这个是rdd的perferedLocation来告诉你的。原先单机计算的时候,也需要知道数据在哪里,现在知道数据在哪里后,需要把代码传到那里(通过Http等方式),但是也只是把代码传过去而已。所以说分布式计算和单机计算也没有本质区别。
由于要跑到其他机器上,就有了管理的过程,怎么进行管理,就是driver负责的事情。数组的操作不需要怎么管理,因为没有到那么多机器上去。
管理主要是管理计算,这里延伸出了一些东西:
第一个层面就是要知道怎么确定到不同的机器上,这个就是任务调度。
第二个层面,由于你是在不同的机器上,计算的时候出现了容错的方式,怎么进行容错。
容错
对数组操作出错,如果业务很复杂,也肯定会有容错的方式,至于rdd的操作也会更加慎重的考虑容错,因为分布式一旦出错的话,位于不同的机器上,代价比一台机器上更大。
业界容错的经典方式进行加检查点(加快照)并放在其他机器上,这种方式比较消耗时间,因为有网络通信等操作。
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的伟大之处,分布式和单机处理没有本质区别。
忘掉分布式,会接触更加本质的东西。
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580
Spark Streaming揭秘 Day35 Spark core思考的更多相关文章
- Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考
Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考 Job是SparkStreaming的重要基础,今天让我们深入,进行一些思考. Job是什么? 首先, ...
- Spark Streaming揭秘 Day15 No Receivers方式思考
Spark Streaming揭秘 Day15 No Receivers方式思考 在前面也有比较多的篇幅介绍了Receiver在SparkStreaming中的应用,但是我们也会发现,传统的Recei ...
- Spark Streaming揭秘 Day17 资源动态分配
Spark Streaming揭秘 Day17 资源动态分配 今天,让我们研究一下一个在Spark中非常重要的特性:资源动态分配. 为什么要动态分配?于Spark不断运行,对资源也有不小的消耗,在默认 ...
- Spark Streaming揭秘 Day16 数据清理机制
Spark Streaming揭秘 Day16 数据清理机制 今天主要来讲下Spark的数据清理机制,我们都知道,Spark是运行在jvm上的,虽然jvm本身就有对象的自动回收工作,但是,如果自己不进 ...
- Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展
Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展 Receiver是SparkStreaming的输入数据来源,从对Receiver整个生命周期的设计,我们 ...
- Spark Streaming揭秘 Day8 RDD生命周期研究
Spark Streaming揭秘 Day8 RDD生命周期研究 今天让我们进一步深入SparkStreaming中RDD的运行机制.从完整的生命周期角度来说,有三个问题是需要解决的: RDD到底是怎 ...
- Spark Streaming揭秘 Day5 初步贯通源码
Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们 ...
- Spark Streaming揭秘 Day4-事务一致性(Exactly one)
Spark Streaming揭秘 Day4 事务一致性Exactly one 引子 对于业务处理系统,事务的一致性非常的关键,事务一致性(Exactly one),简单来说,就是输入数据一定会被处理 ...
- Spark Streaming揭秘 Day3-运行基石(JobScheduler)大揭秘
Spark Streaming揭秘 Day3 运行基石(JobScheduler)大揭秘 引子 作为一个非常强大框架,Spark Streaming兼具了流处理和批处理的特点.还记得第一天的谜团么,众 ...
随机推荐
- 关于通过adb启动Activity、activity、service以及发送broadcast的命令
一.启动activity: $ adb shell$ am start -n {包名}/{包名}.{活动名称} 如:启动一个名叫MainActivity的活动 # am start -n com.ex ...
- 琐碎-关于StringTokenizer工具
属于:java.util包 构造函数: 1. StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象.java默认的分隔符是“空格”.“制表 ...
- 大四找实习(web前端),加油
大四很奇妙,课程变少了,事情却繁杂了. 大三暑假去学驾照,在很多人看来太迟了(毕竟身边很多人跑去实习了),包括我自己.学驾照特别费时间,尤其是对即将大四,希望用实习充实自己的我来说.考虑再三,终于决定 ...
- DataTables warning (table id = 'myTable'): Requested unknown parameter '0' from the data source for row 0
第一种方式:不用在js里设置列Html: <table id="myTable"> <thead> <tr> <th>Title-1 ...
- Firefox便携版
安装firefox后默认配置文件在C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox 可以在快捷方式里设置不同的配置文件,但是要注意参数的含义 ...
- VSX规划Package文件
VSX是VS扩展,可以针对不同项目编写插件,虽然接触VSX的时间并不多,但是当了解VSX后深刻感受到VSX的魅力. VSX的材料比较少,配置文件也很繁琐,当初我也走了不少弯路. 这篇文章将帮助您更好的 ...
- JS中的嵌套作用域
在JS中仅仅区分全局变量和局部变量还不够,实际上,变量作用域可以有任意层级(嵌套).其他函数内部定义的函数可以调用父函数的局部变量,而内部函数里定义的函数则不仅可以调用父函数的局部变量,还可以调用祖父 ...
- Bootstrap引用
<!--设置移动设置页面标准--> <meta name="viewport" content="width=device-width,i ...
- Web前端设计:Html强制不换行<nobr>标签用法代码示例
在网页排版布局中比如文章列表标题排版,无论多少文字均不希望换行显示,需要强制在一行显示完内容.这就可以nobr标签来实现.它起到的作用与word-break:keep-all 是一样的.nobr 是 ...
- Linux命令(6):mv命令
1.作用: 为文件或目录改名或将文件由一个目录移入另一个目录中 2.格式: mv [选项] 源文件或目录 目标文件或目录 3.常见参数: 4.使用实例: [root@localhost ~]# mv ...