您的位置:首页 > 其它

Spark 集群与数据集RDD

2016-05-06 16:33 92 查看
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创建一个累加器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: