标签:
一、什么是 Spark
Spark 是开源的类 Hadoop MapReduce 的通用的并行计算框架, Spark 基于 map reduce 算法实现的分布式计算,拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出和结果可以保存在内存中,从而不再需要读写 HDFS ,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 map reduce 的算法。其架构如下图所示:
二、Spark 与 Hadoop 的对比
Spark 的中间数据放到内存中,对于迭代运算效率更高。
Spark 更适合于迭代运算比较多的 ML 和 DM 运算。因为在 Spark 里面,有 RDD 的抽象概念。
Spark 比 Hadoop 更通用
Spark 提供的数据集操作类型有很多种,不像 Hadoop 只提供了 Map 和 Reduce 两种操作。比如 map , filter , flatMap , sample , groupByKey , reduceByKey , union , join , cogroup , mapValues , sort , partionBy 等多种操作类型, Spark 把这些操作称为 Transformations 。同时还提供 Count , collect , reduce , lookup , save 等多种 actions 操作。
这些多种多样的数据集操作类型,给给开发上层应用的用户提供了方便。各个处理节点之间的通信模型不再像 Hadoop 那样就是唯一的 Data Shuffle 一种模式。用户可以命名,物化,控制中间结果的存储、分区等。可以说编程模型比 Hadoop 更灵活。
不过由于 RDD 的特性, Spark 不适用那种异步细粒度更新状态的应用,例如 web 服务的存储或者是增量的 web 爬虫和索引。就是对于那种增量修改的应用模型不适合。
容错性
在分布式数据集计算时通过checkpoint来实现容错,而checkpoint有两种方式,一个是checkpoint data,一个是logging the updates。用户可以控制采用哪种方式来实现容错。
可用性
Spark通过提供丰富的 Scala , Java , Python API 及交互式 Shell 来提高可用性。
Spark与Hadoop的结合
Spark 可以直接对 HDFS 进行数据的读写,同样支持 Spark on YARN 。 Spark 可以与 MapReduce 运行于同集群中,共享存储资源与计算,数据仓库 Shark 实现上借用 Hive ,几乎与 Hive 完全兼容。
三、Spark 的适用场景
Spark 是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小(大数据库架构中这是是否考虑使用 Spark 的重要因素)
总的来说 Spark 的适用面比较广泛且比较通用。
四、弹性分布式数据集 RDD
RDD 英文全称 Resilient Distributed Dataset ,即弹性分布式数据集。 RDD 是只读的、分区记录的集合。 Spark 中的一切都是基于 RDD 的,我们通过以下几个方面来了解它:
1.创建
1)从集合转换而来;
2)基于文件系统(本地文件、 HDFS 、 HBase 等)的输入创建;
3)从父 RDD 转换而来.
2.计算类型
1) Transformation (转换):延迟执行,也就是通过转换生成一个新的 RDD 时候并不会立即执行,只有等到 Action (行动)时,才触发操作。常用操作有 map 、 filter 等。
2) Action (行动):提交 Spark 作业,启动计算操作,并产生最终结果(向用户程序返回或者写入文件系统)。
3.容错
Lineage : RDD 含有如何从父 RDD 衍生出本 RDD 的相关信息,出错时 RDD 可以通过 Lineage 恢复。
4.内部属性
1)分区列表
2)计算每个分片的函数
3)对父 RDD 的一组依赖
4)对 Key-Value 数据类型 RDD 的分区器,用户可以指定分区策略和分区数
5)每个数据分区的地址列表(如 HDFS 上的数据块的地址)
五、MapReduce
MapReduce 是 Google 提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念“ Map (映射)”和“ Reduce (归纳)”,及他们的主要思想,都是从函数式编程借来的,还有从矢量编程借来的特性。
当前的软件实现是指定一个 Map (映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的 Reduce (归纳)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
1.映射和归纳
简单来说,一个映射函数就是对一些独立元素组成的概念上的列表的每一个元素进行指定的操作。事实上,每个元素都是被独立操作的,而原始列表没有被更改,因为这里创建了一个新的列表来保存新的答案。这就是说,Map操作是可以高度并行的,这对高性能要求的应用以及并行计算领域的需求非常有用。
而归纳操作指的是对一个列表的元素进行适当的合并。虽然他不如映射函数那么并行,但是因为归纳总是有一个简单的答案,大规模的运算相对独立,所以归纳函数在高度并行环境下也很有用。
2.分布和可靠性
MapReduce 通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性;每个节点会周期性的把完成的工作和状态的更新报告回来。如果一个节点保持沉默超过一个预设的时间间隔,主节点记录下这个节点状态为死亡,并把分配给这个节点的数据发到别的节点。每个操作使用命名文件的不可分割操作以确保不会发生并行线程间的冲突;当文件被改名的时候,系统可能会把他们复制到任务名以外的另一个名字上去。
归纳操作工作方式很类似,但是由于归纳操作在并行能力较差,主节点会尽量把归纳操作调度在一个节点上,或者离需要操作的数据尽可能近的节点上了。
标签:
原文地址:http://www.cnblogs.com/YaolongLin/p/5095652.html