spark基本概念
spark基结构
目前Spark由四部分 构成 :Spark SQL、MLlib、Graph X、Spark Streaming.
Spark集群组成
Spark集群划分 ,主要有驱动程序、集群管理程序,以及各worker节点上的执行程序
Spark应用的主程序称为
1.驱动程序 (driver program),其中包含Spark Context对象,用于连接集群管理程序(cluster manager)。
集群管理程序用于分配集群中的资源。 目前有三 种 :Spark独自的集 群管理程 序、Mesos和YARN。
1.Spark应用的运行过程是 ,SparkContext对象首先连接集群管理程序 2.然后Spark获取集群中各个节点上的执行程序(executor),执行程序是用于计算和存储数据的进程
3.然后 Spark 把代码发送到执行程序
4.最后运行执行程序上的任务。
Spark 目前 支 持 3种 集 群 部 署 模 式 :Standalone 模 式 、ApacheMesos 模式、Hadoop YARN 模式。
(1)Standalone 模式 :即 独立模式 ,使用 Spark 自带的集群管理程序,好处是不需要额外的软件就能运行,配置简单。
(2)Apache Mesos 模式 :需要安装 Mesos资源 管理程序
,Spark 的集群管理就交 给 Mesos 处理了。使用Mesos 的好处是
,可以在 Spark 与其他框架之间或多个Spark 实例之间动态地划分。
(3)Hadoop YARN 模式 : 利用已有 的 Hadoop 集群,让Spark 在
Hadoop 集群中运行,访问 HDFS 文件系统 , 使 用 YARN 资 源 调 度 程 序 。Spark on YARN 是Spark 0.6.0 版本加入的,该模式需要额外的配置参数。
Spark 既可 以 在 单 机 上 运 行 ,也 可 以 在 AmazonEC2 上运行。 Spark 提供了相应的配置文件、启动脚本、结束脚本用于配置、启动、结束 Spark 集群中的 master和 slave。 也提供了相应的 Web 监控系统与日志系统,方便地监控与调试程序。 而且还可以配置 Zookeeper 以保证高可用性。
Spark编程模型
Spark最主要的抽象就是弹性分布式数据集 (Resilient Distributed Datasets,RDD)以及对RDD的并行操作(例如map、filter、groupBy、join)。而且,Spark还支持两种受限 的共享变 量 (shared variables): 广播变量(broadcast variables)和累加变量(accumulators)。
RDD
RDD是只读的对象集合 ,RDD分区分布在集群的节点中。如果某个节点失效, 或者某部分数据丢失,RDD都能重新构建。Spark将创建RDD的一系列转换记录下来, 以便恢复丢失的分区, 这称为血系(lineage)。每次对RDD数据集的操作之后的结果,都可以缓存到内存中,下一个操作可以直接从内存中输入,省去了Map Reduce大量的磁盘操作。RDD只支持粗粒度转换,即在大量记录上执行的单个操作。虽然只支持粗粒度转换限制了编程模型,但RDD仍然可以很好地适用于很多应用,特别是支持数据并行的批量分析应用,包括数据挖掘、机器学习、图算法等,因为这些程序通常都会在很多记录上执行相同的操作。
使用RDD的好处有:
RDD只能从持久存储或通过转换(transformation)操作产生 ,相比于分布式共享内存 (DSM) 可以更高效地实现容错, 对于丢失部分数据分区只需根据它的血系就可重新计算出来, 而不需要做特定的检查点(checkpoint)。
RDD的不变性,可以实现类Map Reduce的预测式执行。
RDD的数据分区特性,可以通过数据的本地性来提高性能,这与Map Reduce是一样的。
RDD是可序列化的,当内存不足时可自动改为磁盘存储,把RDD存储于磁盘上,此时性能会有大的下降但不会差于现有的Map Reduce。
在Spark中,RDD是一个Scala对象,对RDD的并行操作即是调用对象上的方法。有四种方法创建一个RDD:
(1)通过一个文件系统中的文件创建 ,例如常见的HDFS文件。
(2)通过并行化Scala集合 ,即把一个集合切分成很多片,然后发送到各种节点。
(3)通过对已有的RDD执行转换操作 ,可以得到一个新的RDD。例如通 过flat Map可以把类 型1的RDD转换成类型2的RDD。
(4)通过把RDD持久化。RDD默认是惰性的 ,即只有当RDD在执行并行操作时,RDD才被物化, 执行完后即被释放。用户可以通过显式的cache或save操作使RDD持久化。
2.2 并行操作
作用在RDD上的并行操作有两种:转换(transformation)和动作 (action),转换返回一个新的RDD,动作返回一个值或把RDD写到文件系统中。转换是惰性的, 即从一个RDD转换成另一个RDD不是马上执行的,Spark只是记录这样的操作,并不执行,等到有动作操作时才会启动计算过程。常见的转换(transformation)如表1所示,常见的动作(action)如表2所示。
注:有些操作只对 key 有效,例如 join、group By Key,reduce By Key。 除了 这些操作以外 ,用户还可以请求将RDD 缓存起来。 而且,用户还可以通过 Partitioner 类获取 RDD 的分区顺序, 然后将另一个 RDD 按照同样的方式分区。
2.3 共享变量
通常情况下,Spark中的map、filter、reduce等函数的参数是一个函数(闭包),运行时这些函数参数被复制到各个worker节点上,互不干扰。Spark还提供了共享变量用于其他用途,常见的有两种:
(1)广播变量 (broadcast variables): 对于大量的只读数据,当有多个并行操作时,最好只复制一次而不是每执行一次函数就复制一次到各个worker节点。广播变量就是用于这种情况, 它只是包装了一下原有的数据,然后只复制一次到各worker节点。
(2)累加变量(accumulators):累加变量只能用于关联操作,并且只有驱动程序才能读取。只要某个类型有“add”操作和“0”值都可以是累加变量。累加变量经常用于实现Map Reduce的计数器,而且由于是只加性的,所以很容易实现容错性。