1.什么是Spark Streaming

  Spark Streaming 也是Spark流式处理的解决方案之一.与结构化流相比, Streaming 应该算更早期的解决方案.但在实际工作中,Streaming 才是主流方案.而结构化流更多依然处于实验或者储备状态中.

        Spark Streaming 它也是支持弹性的, 高吞吐的, 容错的实时数据流的处理. 数据可以通过多种数据源获取, 例如 Kafka, Flume, Kinesis 以及 TCP sockets, 也可以通过例如 mapreducejoinwindow 等的高级函数组成的复杂算法处理,最终处理后的数据可以输出到文件系统, 数据库以及实时仪表盘中

  在内部, Spark Streaming依然是微批处理的思路. 接收实时输入数据流并将数据切分成多个 batch(批)数据, 然后由 Spark 引擎处理它们以生成最终分批流的结果(stream of results in batches)

2.离散化流(Discretized Streams (DStreams) )

  离散化流,是Spark Streaming 提供的基本抽象. 它代表了一个连续的数据流(无论是从 source(数据源)接收到的输入数据流, 还是通过转换输入流所产生的处理过的数据流).

  在内部,离散化流被表示为一系列的RDD,所以离散化流是一种不可改变的抽象.每个RDD代表一定时间间隔内的数据.

  如图所示:

    

streampark 托管spark_数据库

3.StreamingContext

   Spark Streaming 的主入口,是一个StreamingContext对象.

   StreamingContext 需要记住以下几点:

    i).一旦一个 context 已经启动,将不会有新的数据流的计算可以被创建或者添加到它

    ii).一旦一个 context 已经停止,它不会被重新启动

    iii).同一时间内在 JVM 中只有一个 StreamingContext 可以被激活

    iv).StreamingContext 上的 stop() 同样也停止了 SparkContext 。为了只停止 StreamingContext ,设置 stop() 的可选参数,名叫 stopSparkContext 为 false

    v).一个 SparkContext 就可以被重用以创建多个 StreamingContexts,只要前一个 StreamingContext 在下一个StreamingContext 被创建之前停止(不停止 SparkContext)

  构建StreamingContext完成后,可以按以下步骤构建一个 Streaming 应用

    i).通过创建输入 DStreams 来定义输入源.

    ii).通过应用转换和输出操作 DStreams 定义流计算(streaming computations).

    iii).开始接收输入并且使用 streamingContext.start() 来处理数据.

    iv).使用 streamingContext.awaitTermination() 等待处理被终止(手动或者由于任何错误).

    v).使用 streamingContext.stop() 来手动的停止处理

  以下是一个完整 Streaming 应用Demo