Spark Streaming

Spark Streaming
    概述
       

 


        Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力,以吞吐量高和容错能力强著称。
    SparkStreaming VS Storm
        在Spark老版本中,SparkStreaming的延迟级别达到秒级,而Storm可以达到毫秒级别。而在最新的2.0版本之后,SparkStreaming能够达到毫秒级。
        目前,sparkStreaming还不能达到一条一条记录的精细控制,还是以batch为单位。所以像Storm一般用于金融领域,达到每笔交易的精细控制。
        但是两者的基因不同,更具体地说就是核心数据抽象不同。这是无法改变的,而且也不会轻易改变,这样的基因也决定了它们各自最适合的应用场景。
        Spark Streaming的核心抽象是DSTream,里面是RDD,下层是Spark核心DAG调度,所以Spark Streaming的这一基因决定了其粒度是小批量的,无法做更精细地控制。
        数据的可靠性也是以批次为粒度的,但好处也很明显,就是有可能实现更大的吞吐量。
        核心数据抽象的不同导致了它们在计算模式上的本质区别
        另外,得益于Spark平台的良好整合性,完成相同任务的流式计算程序与历史批量处理程序的代码基本相同,而且还可以使用平台上的其他模块比如SQL、机器学习、图计算的计算能力,在开发效率上占有优势
       

 


        核心数据抽象的不同导致了它们在计算模式上的本质区别。Spark Streaming在本质上其实是像MR一样的批处理计算,但将批处理的周期从常规的几十分钟级别尽可能缩短至秒级(毫秒级),也算达到了实时计算的延时指标。而且,它支持各类数据源,基本可以实现流式计算的功能,但延时无法进一步缩短了。但Storm的设计初衷就是实时计算,毫秒级的计算当然不在话下,而且后期通过更高级别的Trident也实现了小批次处理功能。
    架构及原理
        SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kafka、Flume、Twitter、ZeroMQ和TCP 套接字)进行类似Map、Reduce和Join等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。
        Spark Streaming是将流式计算分解成一系列短小的批处理作业,也就是把Spark Streaming的输入数据按照batch size(如1秒)分成一段一段的数据DStream(Discretized-离散化 Stream),每一段数据都转换成Spark中的RDD(Resilient Distributed Dataset),然后将Spark Streaming中对DStream的Transformations操作变为针对Spark中对RDD的Transformations操作,将RDD经过操作变成中间结果保存在内存中。
        整个流式计算根据业务的需求可以对中间的结果进行叠加或者存储到外部设备。
        对DStream的处理,每个DStream都要按照数据流到达的先后顺序依次进行处理。即SparkStreaming天然确保了数据处理的顺序性。
        这样使所有的批处理具有了一个顺序的特性,其本质是转换成RDD的血缘关系。所以,SparkStreaming对数据天然具有容错性保证。
        为了提高SparkStreaming的工作效率,你应该合理的配置批的时间间隔, 最好能够实现上一个批处理完某个算子,下一个批子刚好到来
    基本概念
        1. StreamingContext
            StreamingContext是Spark Streaming编程的最基本环境对象,就像Spark编程中的SparkContext一样。StreamingContext提供最基本的功能入口,包括从各途径创建最基本的对象DStream(就像Spark编程中的RDD)。
            StreamingContext创建好之后,还需要下面这几步来实现一个完整的Spark流式计算:
                (1)创建一个输入DStream,用于接收数据;
                (2)使用作用于DStream上的Transformation和Output操作来定义流式计算(Spark程序是使用Transformation和Action操作);
                (3)启动计算,使用streamingContext.start();
                (4)等待计算结束(人为或错误),使用streamingContext.awaitTermination();
                (5)也可以手工结束计算,使用streamingContext.stop()。
        2. DStream抽象
            DStream(discretized stream)是Spark Streaming的核心抽象,类似于RDD在Spark编程中的地位。DStream表示连续的数据流,要么是从数据源接收到的输入数据流,要求是经过计算产生的新数据流。DStream的内部是一个RDD序列,每个RDD对应一个计算周期。比如,在上面的WordCount示例中,每5秒一个周期,那么每5秒的数据都分别对应一个RDD,
            所有应用在DStream上的操作,都会被映射为对DStream内部的RDD上的操作
            RDD操作将由Spark核心来调度执行,但DStream屏蔽了这些细节,给开发者更简洁的编程体验。当然,我们也可以直接对DStream内部的RDD进行操作
            我们希望能够每隔一段时间重新统计下一段时间的数据,并且能够对设置的批时间进行更细粒度的控制,这样的功能可以通过滑动窗口的方式来实现。
            window(windowLength, slideInterval)
            windowLength:窗口长度
            slideInterval:滑动区间
        Spark On Yarn搭建
            实现步骤:
            1)搭建好Hadoop(版本,2.7)集群
            2)安装和配置scala(版本,2.11)
            上传解压scala-2.11.0.tgz—>配置 /etc/profile文件
            3)在NodeManager节点(04,05,06节点)上安装和配置Spark
            4)进入Spark安装目录的Conf目录,配置:spark-env.sh 文件
            5)配置:slaves文件
            6)在HDFS上,创建一个目录,用来存放 spark的依赖jar包
            执行: hadoop  fs  -mkdir   /spark_jars
            7)进入spark 安装目录的jars目录,
            执行:hadoop fs  -put   ./*   /spark_jars
            8)进入spark安装目录的 conf目录,配置:spark-defaults.conf 文件
            9)至此,完成Spark-Yarn的配置。注意:如果是用虚拟机搭建,可能会由于虚拟机内存过小而导致启动失败,比如内存资源过小,yarn会直接kill掉进程导致rpc连接失败。
            10)启动Hadoop的yarn,进入Hadoop安装目录的sbin目录
            执行:sh start-yarn.sh
            11)启动spark shell,进入Spark安装目录的bin目录
            执行:sh spark-shell --master yarn-client
            至于spark的使用,和之前都是一样的。只不过资源的分配和管理是交给yarn来控制了。

posted @ 2019-03-19 12:53  Striver。  阅读(282)  评论(0编辑  收藏  举报