Spark概念:
Apache Spark是专门为大规模数据处理而设计的快速通用的计算引擎。Spark是加州大学伯克利分校的AMP实验室所开源的类Hadoop MapReduce的通用并行计算框架,Spark拥有Hadoop MapReduce所具有的所有优点,但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不需要读写HDFS,因此Spark能更好的的适用于数据挖掘与机器学习等需要迭代的MApReduce的算法。
Spark特点:
(1)速度快。Spark是基于内存的分布式计算框架,高效DAG执行引擎
(2)支持java,Scala,Python,R,Sql等语言进行开发。
(3)通用:上层模块都是SparkCore的延伸。
(4)运行模式包含:
local:可以在本地eclipse、IDEA中写Spark代码,在本地运行,多用于测试
Yarn:Hadoop生态圈中的资源调度框架,Spark也可以基于Yarn运行
Standalone:Spark中自带的资源调度框架,支持分布式搭建。
Mesos:资源调度框架
Spark技术栈:
HDFS、Hadoop、Hive、MapReduce,Storm
SparkCore(处理批数据)、SparkSql(使用SQL处理分布式数据)、Sparkstreaming(处理流式数据)
弹性分布式数据集----RDD(Resilient Distributed Dataset):

textFile方法底层封装的是MR读取文件的方式,读取文件前先split,默认split大小是一个block大小,这里split也同时对应一个partition。
RDD五大特性:
(1)RDD是由多个partition组成
(2)算子(函数)是作用在partition上
(3)RDD之间有依赖关系
(4)分区器是作用在K,V格式的RDD上
(5)Partition对外提供最佳的计算位置,利于数据处理的本地化,体现了大数据中“计算向数据移动“的理念。
*******K、V格式的RDD*******
如果RDD里面存储的数据都是二元组对象,那么这个RDD我们就称之为K,V格式的RDD
*******RDD的分布式体现*******
RDD是由Partition组成,partition是分布在不同节点上的
*******RDD的弹性体现(容错)*******
1.partition分布在多个节点上,并且大小没有限制
2.RDD之间有依赖关系,可以基于一个RDD重新计算出来新的RDD
Saprk任务执行原理:

Driver和Worker是启动在节点上的进程,是运行在JVM中的进程
1.Driver与集群节点之间有频繁的通信
2.Driver负责任务(tasks)的分发和结果的回收,任务的调度。如果task的计算结果非常大就不能回收了,否则会造成OOM。
3.Worker是Standalone资源调度框架里面资源管理的从节点,也是JVM进程
4..Master是Standalone资源调度框架里面资源管理的从节点,也是JVM进程
Spark算子:
Transformation类算子
也叫转换算子,是懒执行(也叫延迟执行),需要Action算子触发,包含:
filter:过滤符合条件的记录数,true保留,false过滤掉
map:将一个RDD中的每个数据项,通过map中的函数映射变成一个新的元素
特点:输入一条,输出一条数据
flatMap:先map后flat。与map类似,每个输入项可以映射为0到多个输出项
sample:随机抽样算子,根据传进去的小数按比例进行放回,或者无放回的抽样
reduceByKey:将相同的Key根据相应的逻辑进行处理
sortByKey/sortBy:作用在K、V格式的RDD上,对key进行升序或者降序
Action行动算子:
Transformation类算子是延迟执行的,是由Action类算子触发执行的。一个application应用程序中有几个Action类算子,就有几个job执行。
count:返回数据集中的元素数,会在计算结果完成后回收到Driver端
take:返回一个包含数据集前n个元素的集合
first:first=take(1),返回数据集中的第一个元素
foreach:循环遍历数据集中的每一个元素,运行相应的逻辑
collect:将计算结果回收到Driver端
持久化算子:
是Spark快速计算的一个重要原因,简单来说,它就是将RDD中的一些数据在内存中进行持久化,这样下次调用这些数据就不需要再去磁盘中读取,大大减少了IO的读取,并且基于内存,读取速度非常快。

cache:默认将数据存储在内存中
cache()=persist()=persist(StorageLevel.MEMORY_ONLY)
persist:
可以手动指定持久化级别。
常用级别:
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
尽量少用DISK_ONLY和“_2”级别
checkpoint:
(1)cache和persist都是懒执行,持久化的单位是partition
(2)对一个RDD进行cache或者persist时,可以赋值给一个变量/也可以不赋值给一个变量,下个job中使用这个变量就是使用的持久化的数据。
(3)如果使用第二种方式,对RDD持久化之后,后面不能紧跟action算子。例如:lines.persist().count()
(4)持久化的数据是由spark自动存储,当Spark Application停止后,这个数据就会自动清除。