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