大数据专题

为什么使用Spark?

  Apache Spark是一个集群计算引擎,它抽象了底层分布式存储和集群管理,,使它可以插入plugin大量的专门的存储和集群管理工具。Spark支持HDFS, Cassandra, local storage, S3, 甚至传统的关系数据库作为存储层,也可以和集群管理工具YARN, Mesos一起工作,相对集群模式它还有单机模型,Spark已经打破了由Hadoop创造的排序记录,本文介绍Spark的优点以及和MarReduce相比具有的性能优势。

下面看看Spark细节:

  • 它取代现有生态系统中的什么?

    实际上Spark不能代替任何传统的Hadoop生态系统。因为Hadoop 2,它只是另一个运行在YARN容器的应用程序。因此它非常适合在Hadoop生态系统。它提供可测试 可阅读 可维护等方式编程,解放了我们编写大量MapReduce工作的痛苦,而且提高性能

  • "大数据"性质

    大数据本质上是不变的,这意味着它一次生成以后不应该再更新。

    数据本身主要是结构化或半结构化的。

    因为巨大规模的数据分布在分布式集群机器,而分布式特性使得编程变得复杂。

  • 不变性和MapReduce模型

    Map Reduce模型缺乏利用数据的不可变的天然性质。一个不普通的MapReduce(MR)工作包含一系列MR段,为了容错的名义,中间结果被保存到磁盘造成很多IO操作,引起了严重的性能下降。

  • MapReduce模型痛点

    MR代码需要大量的样板。

    程序员不仅需要考虑Map和Reduce的基本操作概念,而且还需要知道MR的每个问题,这是很不平凡,常见的操作,比如加入两个数据集需要大量的工作。

    MR模型不适合迭代处理。

    程序员对于分布式特性数据是不透明的,需要经常考虑优化,如Map边的reduce,Map边的join操作。

    虽然有很多工具来解决上述的问题,提供基于MR编程更高层次的抽象,如Cascading Scalding Hive等等,但是它们并没有提高性能,还是绑定在底层MR工作上。

    Hadoop的本意是为批处理操作而诞生。

让我们看看Spark编程模型是如何解决上述问题:

  • Spark编程模型看起来像什么?

    Spark中主要的计算抽象是弹性分布式数据集(RDD)。由于其简化的编程接口,它统一了分散在其他传统Hadoop堆栈上的计算方式。

    如。通过SparkSQL等提供了SQL接口,来自Spark Streaming的流处理。类似机器学习的迭代处理,可能通过MLib graphX的图形处理。火花还提供编程接口的语言包括Scala、Java、Python。RDD的抽象,由于其属性也是一个原因更引发性能的本质提高。让我们看看如何提高的。

  • RDD是什么?

    RDD代表弹性分布式数据集。它形成Spark编程模型的基本抽象。

    RDD是不可变的。

    这是一个非常重要一点,因为即使HDFS在存储上是编写一次,多次读/追加,,这让它是不变的,但是MapReduce模式使得它不可能利用这一情况以提升性能。

    RDD是懒赋值

    RDD并不会真正动作,,除非一个动作(终端操作)真正调用它。这意味着当一个终端操作被调用时,Spark会注意到它对数据进行转换的DAG,使它在失败情况下可重复操作,这样容错方面就变得很平常了,。它还允许有一些优化计算步骤。

    它可以被认为是分布式的集合。编程接口几乎使底层数据透明的分布式特性。

    它可以通过并行一个值集合被创建,通过应用新的转换函数转换一个存在的RDD,能从HDFS中读出持久性存储数据。

  • 操作RDD与传统MapReduce有什么区别吗?

    RDD抽象使我们远离传统的Map-reduce模型,给了我们的集合(分布)接口,,因此在MR中需要的很多样板操作现在变成了集合操作,例如groupBy、join、count, distinct max, min等等。它还允许我们很容易通过共享RDD之间的操作进行迭代处理。

    RDD也可以选择性缓存,从而给予相当大的性能提升。

  • 和MapReduce计算模型相比如何?

    MR模型由以下阶段组成:

    Map - >可选combine结合(Map边reduce)- >洗牌和排序- >Reduce

    它还允许我们利用分区数据的性质自定义分割者。

    欢迎来到Spark模型,Spark的优点是,它并没有限制我们进行传统的Map和reduce操作。它允许我们应用像操作集合一样操作RDD,因为只是一个RDD,它可以通过SQL接口查询,应用机器学习算法,还有很多花哨的东西。让我们看看一个字数统计的例子:

    val input = sparkContext.textFile("path/to/input/file")
    val words = input.flatMap(line => line.split(" "))
    val wordsMappedToOne = words.map(word => (word, 1))
    val wordOccrCount = wordsMappedToOne.reduceByKey((a, b) => a + b)
    wordOccrCount.saveAsTextFile("path/to/output/file")

     

更多案例见here.。

  我们可以使用Scala作为Spark界面。代码看起来很容易读懂。请注意 sparkContext是你指定Spark配置的方式,规定如何连接到集群。剩下的代码只是包含集合操作。这里很重要的一点需要注意的是,由于RDD是懒赋值,直到我们实际上向Spark要求结果之前是没有代码是在集群上执行的。它会在这种情况下将输出结果保存到目的地的路径中。RDD允许有两种类型的操作:第一个是转换集合,这些操作不赋值,而是产生新的RDD,,转换会应用到这里。Spark创建可以创建转换的代数DAG,这些转换是map flatmap reduceByKey groupByKey join等等。第二个是一个动作,这些都是终端操作,将触发DAG上的实际计算,比如count collect max等才真正被执行。

  • 对于一个普通程序员意味着什么呢?

    • 代码是充分可读的,直至可质疑。

    • 代码是可测试的,它只是正常的scala代码,一个Spark集群可以在本地模式下运行测试。这是非常重要的,而传统MR代码很难测试。

    • Spark还支持Python,java。

    • 代码可以在需要时由领域模型组成

    • Spark计算模型还提供了显著的性能提升,比传统MR模型降低了延迟。

    • Spark统一了处理数据不同的方法。SparkSQL是一个可以通过SQL查询所需的数据的接口,可以使用正常的集合操作。

    • Map边reduce或捆绑再也不需要,因为reduce操作在默认情况下在每个map边有一个本地聚合。

    • 代码是可测试的,这对于二次维护很重要

    • 统一各种计算需求合并在一起变得轻松,不需要在不同持久存储之间分享数据或做一些特殊处理。

    • Spark提供一个shell,这对于编写工作任务之前勘探数据很有用。

    • 我们在我们的代码中可以使用很多现有库包,像Algebird,做一些花哨的东西。

    • 接下来我们将讨论Spark的调试工作。

       

  • 什么不使用Cascading Scalding?

    这种比较是不公平的,Cascading Scalding是库包,而Spark是框架。这些库包实际上是基于MR模型推出更新、丰富的抽象模型。他们不提供任何性能优势。

    Spark成为一个完整的计算引擎,它并不使用MR框架,但是有自己基于RDD的计算模型,而且提供了性能优势。

    它还允许我们可选择在内存中处理RDD,这样能提供令人难以置信的速度。除此之外,正如我们之前所讨论的,它与存储无关,这意味着它可以用来计算任何数据源:本地文件,S3存储,HDFS,JDBC数据源,Cassandra等等。

     

  • 正常的开发流程是怎样的?

    • Spark-shell通常是方便在这里。

    • 从持久存储加载数据。

    • 使用正常的函数遍历数据,也可以探索取样数据理解数据结构,了解数据的方差等

    • 对RDD建模各种对取样数据的操作流程。

    • 理解可能的分区方案,比如数据是日期分区,因此数据洗牌操作可以减少所需的网络IO的需要,一个恰当的分区能解决这一问题。

    • 在各种操作中可共享的数据集应该被缓存,当然如果需要的话。

    • 测试输出的正确性,测试业务逻辑

    • 在恰当的数据上运行程序,以确保它足够性能。

    • 无论什么时候尽可能使用本地聚合(正如MR中所做)尽可能(即。避免使用groupBy,替代是使用reduceByKey。

  • Spark是内存计算?

    通常,,人们疑惑Spark是内存计算引擎吗?Spark不仅in-memeory,它还提供基于内存可选的存储,主要用于提高性能。引用官方文档,当数据超过内存时Spark会执行额外操作。更为普遍的是,Spark操作是符合MapReduce规范,可以指定TORAGE_LEVELs为memory-only, memory-and-disk和disk-only等,从内存到磁盘都可以。

  • Spark是如何比Hadoop MR提供更好性能?

    MR的中间结果总是要持久保存,这是为了容错,但是会有很高IO操作代价,而Spark不会将这些结果持久化,除非用户明确指定,激活操作的管道化会大大提升速度。

    通常繁重网络IO变成分布式系统的瓶颈。Spark采取code-parallel模型,将代码带给数据,比如关闭序列化,,减少了网络操作,当地聚合结果有助于减少网络IO的操作。

    Spark也允许在内存中保存RDD和在不同操作中分享RDD,这是一个巨大的性能提升,前提是数据没有填满内存情况下,数据超过内存泄漏到磁盘,这完全是对程序员是透明的。在这种情况下,性能与传统处理差不多。

 

总结:

标准 Map Reduce Spark
简洁 复杂 需要样本 几乎没有样本
性能 高延迟 非常快
可测试性 通过库包,但很麻烦 非常容易
迭代处理 非微不足道 直接
数据探索性 不容易 Spark shell允许快速和简单的数据探索
SQL接口等 通过Hive 建立在SparkSQL
容错 每个阶段的处理结果存盘保障容错 利用RDD的不变性激活容错
生态系统 很多工具,但并不完全无缝集成,需要很多的努力使他们的无缝集成 统一的接口和SQL一样,流处理等单一抽象的RDD
在内存中计算 不可能的 可能的

Spark介绍

Apache Spark: 是大数据领域的下一个大家伙吗?