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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值