spark概述随笔 // todo

1、spark是一个apache开源项目

2、spark可以提升程序运行速度,spark在100TB数据比赛中战胜hadoop,并且只使用了十分之一的机器。

3、spark提供了java,scala和python语言api支持

4、spark可以与hadoop生态系统和数据源很好的集成。

5、spark可以运行在yarn和mesos管理的集群上。

6、spark核心由spark sql、spark streaming、mllib、graphX组成。

7、spark core是基本引擎,用于大规模并行和分布式数据处理;负责“内存管理和故障恢复”,“在集群上安排、分布和监控作业”,“与存储系统进行交互”。

8、spark引入了弹性分布式数据集(RDD,resilient distributed dataset),它是一个不可变的、容错的、分布式的对象集合,我们可以操作这个集合。他在加载外部数据或者从驱动应用程序分发集合时创建。

9、RDD支持两种操作类型,transformation(例:映射、过滤、联接、联合),它在一个RDD上执行操作,然后创建一个新的RDD来保存结果;action(例:归并、计数、top),它在一个RDD上执行某种计算,然后反馈结果。

10、spark 中 转换是“懒惰”的,spark并不会立即计算出结果,spark只是记住当前需要做的操作,只有当action被调用的时候spark才会真正的进行运算。例如,如果一个大文件需要通过各种转换操作,并且文件被传递给第一个行为,那么spark只会处理第一行内容并返回结果,而不会处理整个文件(// todo 编写代码验证)。

无论transformation执行了多少次,RDD都不会真正的执行运算,只有当Action操作被执行是,运算才会触发。

而在RDD的内部实现机制中,底层接口则是基于迭代器的,从而使得数据访问变得报销,避免大量中间操作消耗内存。

注意,reduceByKey是action,而非transformation

spark可以将RDD之持久化或者缓存到内存中,spark就会在集群保留这些元素,便于下一次快速使用

11、spark sql,提供sql或者hive来直接查询数据。spark sql起源于hive,用于spark上替代MR,现在直接集成到spark堆中了。

12、spark streaming支持实时处理流数据,接收消息队列数据,spark会将数据分成不同的批次,分批次的进行处理,类似流一样

13、MLlib是一个机器学习库,提供了各种算法,提供 分类、回归、聚类、协同过滤等等。(// todo 不明觉厉

14、GraphX是一个用来处理图的库,执行基于图的并行运算。(// todo 不明觉厉

 

后续补充

15、RDD及其容错

RDD可以相互依赖,RDD包含多个分区,每个分区是一个dataset片段,每个RDD都会记录自身依赖的父RDD,一旦出现RDD出现分片丢失,可以通过计算迅速恢复。

RDD依赖分为宽依赖和窄以来,wide dependency:每个partition可以给多个RDD使用,由于多重依赖,只有等到所有节点的数据处理完毕才能进行下一步处理,为防止数据发生丢失或者损坏,需要将之前上一次节点的数据物化,用于恢复。narrow dependency:每个分片只能给一个RDD使用,由于没有多重依赖,所以再一个节点上可以一次性将分片处理完,且一旦发生丢失或者损坏可以迅速从上一个RDD恢复。

不同操作产生不同的依赖,比如map操作产生narrow dependency,而join则产生wide dependency。

spark概述随笔 // todo_第1张图片

支持容错有两种方式:数据复制和日志记录。两种方式都不合适,大量增加网络和机器负载。

RDD天生支持容错。自身是一个不变的数据集;能够记住构建自身的操作图当工作失败后通过操作图获得之前的操作,重新进行计算。因为不采用replication方式,可以降低机器和网络负载。

spark个别场景需要利用日志记录的方式容错spark streaming中,针对数据的update操作,或者调用streaming提供的window操作,就需要恢复执行过程的中间状态。此时需要通过spark提供的check point机制,以支持得到从check point恢复。

RDD是不变的数据结构存储

RDD是支持跨集群的分布式数据结构

RDD可以根据记录的key对结构进行分区

RDD提供了粗粒度的操作,且这些操作都支持分区

RDD将数据存储在内存中,从而提供了低延迟性。

 

 

16、spark中partition和hdfs的block的关系。

hdfs的block是分布式存储的最小单元,类似于盛放文件的盒子。

spark的partition是弹性分布式数据集 RDD的最小单元,RDD是由分布在各个节点上的partition组成的。

partition是指的spark在计算过程中,生成的数据在计算空间内最小单元,同一份数据(RDD)的partition大小不一,数量不定,是根据程序类的算子和最初读入的数据分块数量决定的。因此称为弹性分布式数据集。

block位于存储空间、partition位于计算空间

block的大小是固定的、partition大小不固定

block有冗余、不会轻易丢失。partition 有冗余(设置storagelevel),如果丢失后可以通过重新计算获得。

直白讲述:”

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:昆吾
链接:https://www.zhihu.com/question/37310539/answer/71422848
来源:知乎

存储上为什么要将空间抽象成块前面的兄台已经叙述了,而且之所以设计成这么大的理由还牵扯到大存储空间中的各种管理、容错等等。那么与之对应的,在并行计算里我们希望降低网络带宽的负荷,所以会对计算做一层计算本地性优化,那么怎样做到这点呢?最简单的逻辑,把计算代码发到数据所在的节点上执行就可以了。那么这样一来,怎样做到并行优化?很简单啦,把一个超大的文件切切切分成一个一个不大不小的块(比如hdfs默认的64M,或者配得再大一点),然后把这些块打散在集群的不同节点上,最后把应用代码跟着数据块走,就能在不同节点上并行计算了。与之相对应的,spark为了利用起内存,对一些中间数据尽可能的用内存访问速度进行读写,所以把这部分管理工作纳入到自己这里(对比一下,经典的hadoop mapreduce就直接交给hdfs进行管理),可是就算存到内存里,那也得沿着这个思路来啊,不然计算本地化,并行之类的就很混乱了,那好吧,我也引入个概念,就叫partition好了,目的和前面一样。然后突然发现,哎呀我靠,这不得了,不仅能做到这些,既然我把一个超大份的数据都分成一块一块的了,那每一块是不是就能独立分隔开来了?那一个超大份文件,内存完全放不下,完全可以把其中一些块放到内存里,另外一些暂时放到硬盘里嘛,好歹也比纯放到hdfs来得快嘛……于是生活就变得美好了起来。但是要注意的是,计算本地性优化并不是说绝对地把任务只发到数据所在地进行执行,还要考虑到均衡和并发能力的取舍,不然你的数据要都在一个节点上,难道就只在这台节点上跑任务啦?当然也不可能对吧~

17、spark缓存

useDisk(硬盘)、useMemory(内存)、deserialized(反序列化,用于网络传输对象)、replication(分本数量)

class storageLevel private(useDisk boolean,useMemory boolean,deserialized boolean,repliaction:int)

 

18、提交Job

spark-submit

sbt run

java -jar

 

19、tachyon文件系统(// todo 不明觉厉

tachyon是一个类似于hdfs的实现

20、sparkR计算引擎

将R语言的能力应用到Spark基础计算加购上,为其提供算法引擎。

 

参照:http://blog.jobbole.com/89446/

 

理解Spark的核心RDD

 http://my.oschina.net/darionyaphet/blog/310607

 

http://www.docin.com/p-1090058011.html

 

关于Spark的基本概念和特性简介

http://my.oschina.net/u/2306127/blog/470505#OSC_h1_1

 

关于partition和block的关系和区别

https://www.zhihu.com/question/37310539

 

你可能感兴趣的:(spark概述随笔 // todo)