一 :Spark概述:
Spark 是一种计算框架,是用来实现快速而通用的集群计算的平台
Spark适用于各种各样原本需要多种不同的分布式平台的场景,包括批处理,迭代计算,交互式查询,流处理,通过在一个统一的框架下支持这些不同的计算,Spark使我们可以简单而低耗地把各种处理流程整合在一起。
Spark提供了丰富的接口API,除了提供了基于Java,Scala,Python,SQL和R语言API之外, 还能很好的和Hadoop等大数据工具密切配合使用,比如Hadoop,Spark
可以访问包括Cassandra在内的任意Hadoop数据源。
Spark包含很多组件, Spark的核心是有一个对由很多计算任务组成,运行在多个工作机器或者一个计算集群上的应用进行调度,分发以及监控的计算引擎 , Spark之所以叫做统一的计算框架, 当Spark的核心引擎进行优化之后,那么基于SQL和MLlib的程序库也都能自动获得提升,一个处理程序只需要运行一个软件系统即可
Spark的组件设计图:
二:Spark来源与背景
Spark是于2009年作为一个研究项目在加州大学伯克利分校RAD实验室诞生,为什么会有Spark呢?因为研究室的人员当时都使用过MapReduce,他们发现MapReduce操作过于简单(只能通过map,Reduce),对于处理复杂的程序,实现起来很麻烦,并且在迭代计算和交互式计算中效率低下,因此Spark从一开始设计的核心就是迭代算法设计和交互式查询,同时还支持内存式存储和高效的容错机制。
Spark于2010年3月开源,并且在2013年6月交给了Apache基金会,现在已经成为Apache开源基金会的顶级项目。
Spark产生背景:
1 :MapReduce局限性
仅支持Map 和Reduce两种操作
当编写一个数据分析应用时,只需要实现Map和Reduce就可以了,太过于简单,当编写多个数据分析程序时,需要编写很多MR,对于处理复杂的程序,会非常的繁琐,对于Map和Reduce之间的转换不太直观。
2 :MapReduce处理低效
Map中间结果写磁盘,Reduce写HDFS,Map和Reduce之间的衔接不太好,多个MR之间通过HDFS交互数据
对于MR设计上面的一些问题:
任务调度和启动开销大
无法充分利用内存
Map和Reduce均需要排序
不适合迭代计算,在处理迭代式计算时,MapReduce是通过多个Map和Reduce作业组合来处理的,对于磁盘的IO消耗比较大
3 :计算框架的多样化
批处理:MapReduce,HIVE
流式计算:Storm
交互式计算:Impala
那么Spark就在考虑是否能够提供一个统一的计算框架,来解决批处理,流式计算,交互式计算呢。在一个统一框架下,进行批处理,流式计算,交互式计算
二 :计算类型与应用场景
批处理计算:
对时间没有严格的要求,对吞吐率要高( 比如每日的数据汇总,数据分析Job等 )
迭代式与DAG计算
机器学习算法
交互式计算
支持类Sql语言,快速进行数据分析
流式计算
数据像流水一样进入系统,需实时对其进行处理和分析 (比如天猫双十一,实时显示交易额)
计算框架分类
三:Spark与Hadoop
为什么要加入这一节?很多人不明白Spark与Hadoop的关系是什么?那么在这里着重说明一下,
从图上我看看到Spark处于计算框架这一层,也就是说Spark只负责对数据进行分析和计算。
Spark是一个计算框架而Hadoop是整个大数据的生态系统,Hadoop包括 数据存储,收集,调度,计算等等。Spark与Hadoop不能直接的比较,Spark更多的是的融合了Hadoop,成为了其一部分,而且它只是计算,没有存储没有资源管理。Hadoop是整个大数据的解决方案,是一个很广义的东西, Spark仅仅是一套分布式计算的解决方案或者说是一套计算引擎。
四 :Spark特点
高效
根据科研结果证明,Spark比MapReduce快很多(10-100倍)(正常情况下会快很多,不过在某些情况下会比MR慢)
内存计算引擎,提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销
DAG引擎,减少多次计算之间中间结果写到HDFS的开销
使用多线程池模型来减少task启动开销,shuffle过程中避免不必要的sort操作以及减少磁盘IO操作
易用
提供了丰富的API,支持Java,Scala,Python和R 四种语言
代码量比MapReduce少2~5倍
与Hadoop集成
读写HDFS/HBase
与YARN集成
五 :MapReduce与Spark
六 :Spark核心概念
RDD:Resilient Distributed Datasets 弹性分布式数据集
RDD是分布式的元素集合,在Spark中,对数据的所有操作不外乎创建RDD,转换已有RDD以及调用RDD操作进行求值,Spark会自动将RDD中的数据分发到集群上,并将操作并行化执行。
RDD是对数据集的一种抽象,RDD的数据集是分布式的,会存在多个节点上。是弹性的 :数据集可以存在磁盘里,也可以存在内存中,通过磁盘和内存之间可以进行置换
RDD基础特性:
分布在集群中的只读对象集合(由多个partition构成)
可以存储在磁盘或内存中(多种存储级别)
通过并行”转换”操作构造
七 :RDD基本操作
Transformation (转换操作)
可以通过Scala集合或者Hadoop数据集构造一个新的RDD,
通过Spark的一些函数,输入一个RDD然后输出一个RDD
比如:map,filter,flatmap,reduceByKey
Action (行动操作)
通过RDD计算得到一个或者一组值,等于输入一个RDD,输出的并不是一个RDD而是一个结果集
比如:count,reduce,saveAsTextFile