分享

白话文玩Spark

问题导读

1.为什么会出现Spark?
     1.1 什么是hadoop?
     1.2 什么是MapReduce计算模型?
     1.3 Spark比Mapreduce强在哪里?
2.Spark概述?
    2.1 Spark是什么?
    2.2 一个大一统的技术栈
    2.3 重中之重RDD
    2.4 RDD的两种操作
3.大数据实时计算架构?
    3.1 大数据实时计算原理
    3.2 spark streaming
    3.3 对比当下比较流行的两种实时计算框架Spark Streaming和Storm




1.为什么会出现Spark?
(1)什么是hadoop?
       当前存在的问题:
             身处大数据时代,数据量越来越大,数据结构也越来复杂,每天需要处理的数据量已经超过单台PC可以存储和处理的量。
       面对的挑战:
             大数据带来了两个挑战:如何存储大数据和处理大数据
       这个时候,hadoop横空出世来解决这些问题。
       解决策略:
       Hadoop对海量数据提供了有效的存储和计算的能力,填补了处理大数据市场的空白。主要靠三大组件:
       hdfs:用来解决如何将大量的文件存储在一个集群里。(很多PC组合成一个集群)
       mapreduce:用来解决如何计算这些数据。
       yarn:用来解决集群中资源调度的问题。
       其中和spark相关的组件是Mapreduce

(2)什么是MapReduce计算模型?
      主要思想:
            "三个臭皮匠能顶一个诸葛亮"
      举例说明:
            现在我们要把一副牌的四种花色区分开。
            常规情况下:一个人来清点可能需要4分钟。
            大数据中Mapreduce的做法是:我们把牌分成四份,分别给四个人,每个人清点自己的那一份,然后四个人都清点完成之后
                   把各自的相同花色放在一起进行汇总,这样的结果可能总共只会消耗1分钟。
            结合到Mapreduce计算模型里面,主要包含两个过程map和reduce。四个人每个人清点自己的牌相当于是map过程;
                   而reduce过程就是将四个人清点完的牌放到一起。
      对应到实际应用:
             现在我们有一个数据量特别大、计算逻辑特别复杂的任务需要执行,可能需要一台超级计算机(诸葛亮)来搞定。
              现在的问题是我们没有诸葛亮,或者这个诸葛亮很贵,怎么办?(可能把诸葛亮请来了都不一定能搞定)
      用Mapreduce的思想,
              我们多找几个普通的PC(臭皮匠),构建一个集群,用集群的能力来搞定这个任务,而且更牛逼的是,我们还能线性的往里面添加臭皮匠,
              来增加集群的能力从而适应数据量更大、计算逻辑更复杂的任务。

(3)Spark比Mapreduce强在哪里?
     速度上:
            MR分布式计算框架比较会偷懒,干一会活,就休息一会。因为MR的中间结果是放在hdfs中,数据流是hdfs->本地磁盘->hdfs,
            涉及到很多的IO操作,这也是为啥慢的原因;而Spark则不偷懒,不停的工作,随叫随到,从不犹豫,因为spark的中间结果一般
            是存放在内存中进行计算,所以快.
     效率上:
            MR接收到任务以后,不管3721,会把每个job转化成map和reduce进行计算,map任务完了之后才能进行reduce。
            Spark干活很讲究方法,喜欢动脑子。它底层会根据DAG把一个job划分成多个stage,每个stage又包含多个task,并行去执行,所以既快又有效率。
     易用性上:
            MR的抽象层次低,需要使用手工代码来完成程序编写,使用上难以上手;而Spark采用RDD计算模型,简单容易上手。
            举个例子:我们要计算单词计数,使用MR可能需要写很多代码实现,而spark使用RDD计算模型,
            [mw_shl_code=java,true]              JavaRDD<String> input=sc.textFile(“word.txt”);
                 input.flatmap((word)->word.split(" "))                                      
                        .mapToPair(splitword->(splitword,1))                     
                        .reduceByKey((v1,v2)->v1+v2)   
           [/mw_shl_code]
            就这短短几行代码,实现了单词计数,如果写MR程序的话可能要写一大段一大段吧。
     应用场景:
            MR的时延很高,更多的适合离线批处理,对于交互式处理和实时处理支持不够;而Spark技术栈中我们可以用spark core做离线批处理,
            用spark streaming做实时计算,spark sql可以直接操作hive里面的数据,可以实现交互式查询。
综上所述,Spark是来弥补Hadoop中的MR计算模型存在的缺陷。目前比较主流的大数据架构是将hadoop和spark结合起来使用。
使用spark的基于内存的计算模型,使用hadoop的hdfs分布式文件系统和yarn资源调度管理,实现双赢。

2.Spark概述
(1)Spark是什么?
      Spark是一个用来实现快速而通用的集群计算的平台
      Spark是专为大规模数据处理而设计的快速通用的计算引擎
      Spark是分布式计算框架
      牛就牛在内存这块

(2)一个大一统的技术栈
      Spark项目包含多个紧密集成的组件。因为Spark的核心引擎有着速度快和通用的特点,所以支持各种应用不同应用场景。
      针对离线批处理场景,我们可以使用Spark core来实现;
      针对交互式查询,我们可以使用Spark sql来实现;
      针对流式计算,我们可以使用Spark streaming来实现;
      针对机器学习应用,我们可以使用Spark mllib来实现;
      针对类似社交网络的朋友关系图这样的图式应用,我们可以使用Spark graphX来实现。
总的来说,Spark就是一个大一统的技术栈,来解决各种场景下的大数据应用。

(3)重中之重RDD
     RDD是Spark提供的核心抽象,全名叫做弹性分布式数据集(Resillient Distributed DataSet)。
     很抽象,很难懂,但是是核心。
     根据RDD这个名字,可以分解为三点:
     数据集:RDD在抽象上说就是一种元素集合,单从逻辑上的表现来说,它就是一个数据集合,
                 咱们就把它简单的理解成为java里面的list或者数据库里面的一张表。一个RDD就是一个hdfs文件。
     分布式:因为RDD是分区的,每个分区分布在集群中不同的节点上,从而让RDD中的数据可以并行的操作。
     弹性:RDD默认情况下是存放在内存中,但是在内存中资源不足时,spark会自动将RDD数据写入磁盘进行保存。对于用户来说,
               我不用去管RDD的数据存储在哪里,内存还是磁盘,这是spark底层去做的。我们只需要针对RDD来进行计算和处理就行了。
               RDD自动进行内存和磁盘之间权衡和切换的机制,是RDD的弹性的特点所在。
     RDD还有一个特性就是提供了容错性,可以自动从节点失败中恢复过来。即如果某个节点上的RDD partition因为节点故障,
             导致数据丢失了,不用担心,RDD会自动通过自己的数据来源重新计算该分区。当然,这是Spark底层自己做的,对用户透明

(4)RDD的两种操作
      RDD支持两种操作:转化操作(transformation)和行动操作(action)
      转化操作是针对已有的RDD创建一个新的RDD的操作。例如,map就是一种transformation操作,
            它用于将已有RDD的每个元素传入一个自定义的函数,并获取一个新的元素,然后将所有的新元素组成一个新的RDD。
      常用transformation介绍
      行动操作是对RDD进行最后的操作,比如遍历、保存到文件、数据库等,向驱动器程序返回结果或把结果写入外部系统,会触发实际的计算
      常用action介绍

3.大数据实时计算架构
(1)大数据实时计算原理
     主要包含三大块:实时数据的生产源头->消息中间件->实时计算程序APP
     针对公司里面的数据源头,主要包括各类日志(平台日志、终端日志和微信日志等)还有实时采集的GPS点;
     消息中间件:一般实时产生的数据都会发送到消息中间件里面去,比较常用的就是kafka,公司里面用的也是这个。
                        其核心就是作为实时大数据的一种缓冲,否则大数据系统直接处理实时数据,恐怕撑不住,会挂。
     实时处理程序:我们编写的大数据实时处理程序,通常会去kafka拉取数据。实时的拉取到了数据之后,我们编写的分布式程序就会实时的处理数据。
                          每个结点处理一部分数据,这样多个节点并行的处理数据,就可以增强我们大数据实时计算的能力。
     在整个过程中,
           其实咱们要做的就是开发大数据实时处理应用程序。
     通常情况下,我们不会去自己手动去开发基础的分布式实时计算平台,而是使用现成的、优秀的、开源的框架,比如:Spark Streaming或者Storm。
            它们底层就是分布式实时计算平台,其进程可以部署在多个节点,从而进行大数据的分布式实时处理。而我们自己编写的大数据实时计算程序,就是运行在这些平台之上。

(2)Spark streaming
    [1]Spark Streaming是啥?
        Spark Streaming是Spark的一种高级组件,主要应用于实时处理数据。
        Spark Streaming使用“微批次”的架构,把流式计算当做一系列连续的小规模批处理来对待。
    [2]Spark Streaming基本的工作原理
        Spark Streaming内部实时接收输入数据流,然后将数据根据时间间隔拆分成多个batch,这里的时间间隔根据不用的应用场景设置。
        比如每次收集1秒的数据封装为一个batch,每个batch转化成一个RDD,然后将每个batch交给Spark的计算引擎进行处理,最后会生产出一个结果数据流推向外部系统。

    [3]DStream(画个图)
         Spark Streaming的编程抽象是DStream。它底层还是RDD,只不过对RDD进行了一层封装,代表了一个持续不断的数据流。
         首先,spark streaming一定是有一个实时接收数据的源头。将接收到的数据按照时间划分成一个一个的batch,这里可以设置。如果我设置为1s,
                 则每个batch代表某一秒的数据,这个batch会转化为一个RDD。 我们都知道,RDD是分布式的,所以这一秒的数据会散落在各个节点的分区中。        
         然后,根据程序中编写函数执行算子操作。对DStream1执行的map操作,实质是对DStream1中的每个batch的RDD执行map操作。

(3)对比当下比较流行的两种实时计算框架Spark Streaming和Storm
       Spark Streaming与Storm都可以用于进行实时流计算,但是他们两者的区别是非常大的。
       Storm的优势在于:
       [1]Spark Streaming和Storm的计算模型完全不一样。Spark Streaming是基于RDD的,因此需要将一小段时间内的,
           比如1秒内的数据,收集起来,作为一个RDD,然后再针对这个batch的数据进行处理。而Storm却可以做到每来一条数据,
           都可以立即进行处理和计算。因此,Spark Streaming只能称作准实时的流计算框架,而Storm是真正意义上的实时计算框架;
       [2]Storm支持在流式计算程序运行过程中,可以动态地调整并行度,从而动态提高并发处理能力。而Spark Streaming是无法动态调整并行度的;
      Spark Streaming的优势在于:
      [1]由于Spark Streaming是基于batch进行处理的,在同等资源的情况下,因此相较于Storm基于单条数据进行处理,具有数倍甚至数十倍的吞吐量;
      [2]Spark Streaming由于身处于Spark生态圈内,因此可以和Spark Core、Spark SQL、Spark MLlib、Spark GraphX进行无缝整合。流式处理完的数据,
          可以立即进行各种map、reduce转换操作,可以立即使用sql进行查询,甚至可以立即使用machine learning或者图计算算法进行处理。
          这种一站式的大数据处理功能和优势,是Storm无法匹敌的。
综合上述来看,通常在对实时性要求特别高,而且实时数据量不稳定,比如在白天有高峰期的情况下,可以选择使用Storm。
但是如果是对实时性要求一般,允许1秒的准实时处理,而且不要求动态调整并行度的话,选择Spark Streaming是更好的选择。

已有(3)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条