Spark是一个分布式计算框架,对资源的调度,任务的提交跟踪、节点间的通信及数据并行处理的内在操作都进行了抽象。
四种运行模式:
本地单机模式:所有spark进程都运行在同一个JVM中
集群单机模式:使用spark内置的任务调度框架
基于Mesos:Mesos 是一个流行的开源集群计算框架
基于Yarn:hadoop2,一个与hadoop关联的集群计算和资源调度框架
区别:解析hadoop新一代mapreduce框架Yarn http://www.csdn.net/article/2014-02-10/2818355
1、spark集群
由一个驱动程序和多个执行程序构成,如图1。Driver程序是应用逻辑执行的起点,负责作业的调度,即Task的分发;多个worker用来管理计算节点和创建Excecutor并行处理任务。在执行阶段,Driver将Task和所依赖的文件及jar包,序列化后传递给对应的worker机器,同时Executor对相应的数据分区的任务进行处理。
2、Spark生态系统
整个生态系统称为BDAS,其核心框架是spark,同时包括SparkSQL,机器学习功能系统MLBase,分布式机器学习库Mlib,并行图计算框架GraphX,流计算框架SparkStreaming等,见图2
(1)Spark
BDAS的核心组件,大数据分布式编程框架,底层采用scala函数式编程语言书写而成,提供scala类似的编程接口。Spark将数据抽象成弹性分布式数据集RDD,不仅实现了mapreduce的算子map函数和reduce函数,以及filter、join、groupByKey等。Spark将数据在分布式环境下分区,将作业转化成有向无环图DAG,并分阶段进行DAG的调度和任务的分布式并行处理。
(2)Shark
构建在Spark和hive基础上的数据仓库,已经终止开发。提供了能够查询hive中所存储数据的一套SQL接口,兼容hive语法。
(3)Spark SQL
提供大数据上的SQL查询功能,类似于Shark在系统中的角色,统称为SQL on spark。可通过JDBC API和传统BI或可视化工具在spark上执行类似SQL查询。还可以用spark SQL对不同格式的数据(如JSON、Parquet以及数据库等)执行ETL,将其转化为查询输出
(4)SparkStreaming
将从数据源接收的数据转换成由spark RDD组成的DStream,负责实时处理数据流。
(5)Spark MLlib
spark机器学习库,通用学习算法和工具组成,包括二分类、线性回归、聚类、协同过滤、梯度下降以及底层优化。
(6)Spark Graphx
基于图计算和并行图计算的Spark API,通过弹性分布式属性图,一种顶点和边都带有属性的有向多重图,扩展了Spark RDD。
(7)Tachyon
分布式内存文件系统,可理解为内存中的HDFS。可以基于Tachyon实现RDD或者文件的跨应用分享,并提供高容错机制,保证数据的可靠性。
3、弹性分布式数据集(RDDs)
可并行操作的有容错机制的数据集合,有2种方式创建RDDs:从现有的集合创建,
scala> val distFile = sc.textFile(“data.txt”)
distFile: RDD[String] = MappedRDD@1d4cee08
或基于hadoop 的输入源创建(如:本地文件系统、HDFS和Amazon S3)。
创建RDD后,可供操作的分布式记录集,在spark编程模式下,所有的操作分为转换和执行两种。转换操作是对一个数据集里的所有记录执行某种函数,从而使记录发生改变;执行操作一般是运行某些计算或聚合操作,并将结果返回运行SparkContext的那个驱动程序。
常见的转换操作:
map(func) 每个元素经过func函数换换后输出一个元素
filter(func) 返回 func函数计算后返回值为true的输入元素组成的新数据集
flatMap(func) func返回一个序列,每个输入元素可以被映射为0或多个输出元素
reduceByKey(func,[numTasks]) 使用指定的reduce函数将相同的key值聚合到一起
groupByKey([numTasks]) 在一个键值对的数据集上调用,返回一个(k,Seq[v])对的数据集
除此之外,join 、union 、distinct、mapPartitions、cogroup、sortByKey也是转换操作
常见的动作操作:
reduce(func) 通过函数func聚集数据集中所有的元素
collect(func) 以数组的形式返回数据集的所有元素
count(func) 返回数据集元素的个数,一般在filter等操作后返回足够小的子集后
take(n) 返回前n个元素组成的数组
foreach(func) 对数据集的每个元素,运行函数func进行更新。
除此之外,takeOrdered、saveAsTextFile、countByKey都是动作操作。
RDD缓存和持久化:
将数据集持久化(或缓存)到内存中,以便在多个操作中重复使用。可以通过persist或cache方法来标记一个想要持久化的RDD。在第一次被计算产生后,它就会始终停留在内存中。spark缓存具有容错性(如果RDD的任意一个分片丢失了,spark会按照RDD的产生过程重算一遍)
使用以下两种方法可以标记要缓存的 RDD:
lineLengths.persist()
lineLengths.cache()
取消缓存则用:
lineLengths.unpersist()
4、共享变量
spark能够创建两种特殊类型的变量:广播变量和累加器
广播变量,为只读变量,由运行sparkContext的驱动程序创建后发送给参与计算的节点,可以通过 SparkContext.broadcast(v) 来从变量 v 创建一个广播变量。
累加器,在相关过程中只能被累加的变量,可以通过SparkContext.accumulator(v)来从变量v创建一个累加器。