Hadoop笔记汇总系列第四篇-Spark

340 阅读5分钟

这是我参与更文挑战的第10天,活动详情查看: 更文挑战

背景

这是Hadoop笔记汇总系列的第四篇,昨天说了Hadoop的不足,今天把Spark相关笔记汇总一下.

可惜当时做大数据项目的时候,Spark还没有成熟,所以只能玩玩Hadoop了.

Spark

简介

  1. Spark拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
  2. Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。 -- 交互性好
  3. Spark基于内存的RDD模型、对机器学习算法的支持
  4. RDD是种编程抽象,代表可以跨机器进行分割的只读对象集合
  5. 由于RDD可以被缓存在内存中,Spark对迭代应用特别有效,因为这些应用中,数据是在整个算法运算过程中都可以被重用。大多数机器学习和最优化算法都是迭代的,使得Spark对数据科学来说是个非常有效的工具

Spark的弹性分布数据集RDD

  1. RDD是Spark中对数据和计算的抽象,是Spark中最核心的概念,它表示已被分片(partition),不可变的并能够被并行操作的数据集 合。对RDD的操作分为两种transformation和action。Transformation操作是通过转换从一个或多个RDD生成新的 RDD。Action操作是从RDD生成最后的计算结果。在Spark最新的版本中,提供丰富的transformation和action操作,比起 MapReduce计算模型中仅有的两种操作,会大大简化程序开发的难度
  2. RDD的生成方式只有两种,一是从数据源读入,另一种就是从其它RDD通过transformation操作转换。一个典型的Spark程序就是通 过Spark上下文环境(SparkContext)生成一个或多个RDD,在这些RDD上通过一系列的transformation操作生成最终的 RDD,最后通过调用最终RDD的action方法输出结果

Spark编程模式

驱动程序可以在数据集上执行两种类型的操作:动作和转换。动作会在数据集上执行一个计算,并向驱动程序返回一个值;而转换 会从现有数据集中创建一个新的数据集。动作的示例包括执行一个Reduce操作使用函数)以及在数据集上进行迭代(在每个元素上运行一个函数,类似于Map操作)。转换示例包括Map操作和Cache操作(它请求新的数据集存储在内存中)

本质上,驱动程序创建一个或多个RDD,调用操作来转换RDD,然后调用动作处理被转换后的RDD,步骤大体如下:

  1. 定义一个或多个RDD,可以通过获取存储在磁盘上的数据(HDFS,Cassandra,HBase,Local Disk),并行化内存中的某些集合,转换(transform)一个已存在的RDD,或者,缓存或保存。
  2. 通过传递一个闭包(函数)给RDD上的每个元素来调用RDD上的操作。Spark提供了除了Map和Reduce的80多种高级操作。
  3. 使用结果RDD的动作(action)(如count、collect、save等)。动作将会启动集群上的计算。

Hadoop和Spark的对比

  1. 作为Data Pipeline引擎来说,MapReduce每个步骤都会存盘,而Spark和Tez可以直接网络发送到下一个步骤,速度上是相差很多的,但是存盘的好处是允许继续在失败的数据上继续跑,所以直观上说MapReduce作为pipeline引擎更稳健。但理论上来说,如果选择在每个完成的小步骤上加CheckPoint,那Tez和Spark完全能和现在的MapReduce达到一样的稳健
  2. 在Hadoop的世界里,做迭代计算是非常耗资源,它每次的IO 序列化代价很大,所以每次迭代需要差不多的等待。而Spark第一次启动需要载入到内存,之后迭代直接在内存利用中间结果做不落地的运算
  3. 原生语言:hadoop-JAVA,Spark-scala
  4. 计算模型:hadoop-MapReduce,Spark-DAG(有向无环图); 经常有人说Spark就是内存版的MapReduce,实际上不是的。Spark使用的DAG计算模型可以有效的减少Map和Reduce人物之间传递的数据,尤其适合反复迭代的机器学习场景。而Hadoop则更擅长批处理。不过Tez也是使用的DAG计算模型,他也是Hadoop,明眼人都知道DAG计算模型比MR更好。
  5. 存储:hadoop-HDFS, Spark-RDD,HDFS; spark既可以仅用内存存储,也可以在HDFS上存储,即使Spark在HDFS上存储,DAG计算模型在迭代计算上还是比MR的更有效率。

个人理解

我个人觉得这两个大数据处理框架并不冲突,应该是互补的一种关系,只不过Spark一直宣称比hadoop快而已。实际上从应用场景上区分,Hadoop更适合做批处理,而Spark更适合做需要反复迭代的机器学习