SparkStreaming

1、SparkStreaming概述

  • 数据处理类型分类
    • 静态数据
      • 数据源是不变的、有限的、显式离散的
      • 多适用于批量计算、离线计算
    • 流数据
      • 数据是变动的、无限的、连续的
      • 多适用于实时计算,能在秒级、秒内处理完成
        • 实时数据分类
          • 小时级
          • 分钟级
          • 秒级
    • sparkstreaming是什么
      • 一句话总结:微批处理的流式(数据)实时计算框架。
      • 原理:是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,即可用于处理实时数据流。
      • 优点
        • 可以和spark core、sparksql等无缝集成
        • 支持从多种数据源获取数据,包括Kafka、Flume、Twitter、ZeroMQ、Kinesis以及TCP sockets,然后可以使用诸如map、reduce、join等高级函数进行复杂算法的处理,最后可以将处理结果存储到HDFS文件系统,数据库等。
    • 重要概念说明
      • StreamingContext
        • 类比于SparkContext,SparkSqlContext
        • 流计算框架中的中枢类,负责各种环境信息、分发调度等任务。
      • 数据源
        • 简称:Source,意为DataSource的缩写
        • 指流数据的来源是哪里,如文件,Socket输入、Kafka等。
      • 离散流
        • 英文称Discretized Stream,简称DStream,即为sparkstreaming微批处理当中的数据抽象单位。
        • 是继spark core的RDD、spark sql的DataFrame和DataSet后又一基础的数据类型,是spark streaming特有的数据类型。
      • 输入离散流
        • 英文简称:Input DStream
        • 将Spark Streaming连接到一个外部Source数据源来读取数据的统称
      • 批数据
        • 英文称Batch Data
        • 连续数据离散化的步骤:将流式实时连续的数据整体转化成以时间片为单位进行分批,即将流式数据转化成时间片为单位数据进行批数据处理,随着时间推移,这些处理结果即形成结果数据流,即流处理引擎形成。
      • 时间片或批处理时间间隔
        • 英文称 batch interval
        • 人为对流数据进行定量的标准,以时间片作为拆分流数据的依据。
        • 一个时间片的数据对应一个RDD实例。
      • 窗口长度
        • 英文称window length
        • 一个窗口覆盖的流数据的时间长度,必须是批处理时间间隔的倍数。
        • 窗口分类
          • 滑动窗口
          • 滚动窗口
      • 滑动窗口时间间隔
        • 滑动窗口:简称Sliding window
        • 前一个窗口到后一个窗口所经过的时间长度间隔。必须是批处理时间间隔的倍数
  • 处理流程图示说明
    • 框架处理总流程图
    • SparkStreaming

     

  • 框架内部工作流程图

Spark Streaming接收实时输入数据流并将数据分成批处理,然后由SparkCore引擎处理,以批量生成最终结果流。

SparkStreaming

 

2、scala快速构建SparkStreaming应用

  • scala构建SparkStreaming应用步骤
    • sbt构建空eclipse项目(done)
    • build.sbt中添加spark-streaming依赖
    • 以StreamingContext为起点,而向Dstream编程
    • 测试运行、效果查看
  • 步骤实现
    • build.sbt中添加spark-streaming依赖
    • <!--    spark-stream依赖-->
          <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_${scala.compat.version}</artifactId>
            <version>2.3.2</version>
            <scope>provided</scope>
          </dependency>

      代码实现

    • def main(args: Array[String]): Unit = {
          //创建配置文件
          val conf=new SparkConf()
            .setAppName("stream")
            .setMaster("local[*]")
            .set("spark.testing.memory","512000000")
          //创建streamingContext,指定间隔时间
          val streamingContext=new StreamingContext(conf,Seconds(5))
          //连接到数据源
          val lines=streamingContext.socketTextStream("192.168.1.114",9999)
          //后续编写spark处理world count
          val wordKV=lines.flatMap(_.split("\t")).map(word=>(word,1))
      
          val wc=wordKV.reduceByKey(_+_)
          wc.print()
          //开启streaming
          streamingContext.start()
          streamingContext.awaitTermination()
        }

    • netcat介绍
      • Linux版本
        • 启动netcat命令
          • nc -lk 9999 :意为开启本机的9999端口作为对外的TCP数据服务端口
          • 开启本机的9999作为TCP服务端口
      • 基本介绍
        • netcat是一个通过TCP/UDP在网络中进行读写数据工具(命令),被称为“瑞士军刀”,主要用于网络调试领域、传输领域甚至黑客攻击领域。
        • 简称nc,linux自带该命令, windows需要下载netcap的应用程序才行。
        • [root@localhost ~]# nc -lk 9999
          sfaf
          dads
          dsfd
          gfgf
          

        • 开启sparkStreaming程序,读取来自9999端口的输入的TCP流数据
          • 注意要先开启指定端口的TCP服务,否则streaming会报读取异常。
          • 右击-run as application即可,开启后ss将一直以1秒为时间间隔,以行为输入单位监控传入的流数据,进行代码当中的flatMap、WordCount的处理
          • 每隔1秒,输出一次针对当前DStream的WC计算结果
        • SparkStreaming实现WordCount的流程抽象说明(经典流程)
          • SparkStreaming代码的开发流程
            • 初始化StreamingContext
            • 通过创建输入DStreams来定义输入源。
            • 通过将转换和输出操作应用于DStream来定义流式计算。
            • 开始接收数据并使用它进行处理streamingContext.start()。
            • 等待处理停止(手动或由于任何错误)使用streamingContext.awaitTermination()。
            • 可以使用手动停止处理streamingContext.stop()。
          • SparkStreaming代码开发注意
            • 一旦启动(start)了上下文,就不能设置或添加新的流式计算。
            • 上下文停止后,无法重新启动。
            • 在JVM中只能同时激活一个StreamingContext。
            • StreamingContext上的stop()也会停止SparkContext。要仅停止StreamingContext,请将stop()的可选参数设置stopSparkContext为false。
            • 只要在创建下一个StreamingContext之前停止前一个StreamingContext(不停止SparkContext),就可以重复使用SparkContext来创建多个StreamingContexts。
          • SparkStreaming的流数据专用数据抽象DStream,内部均为指定时间间隔内生成数据的RDD形式。
          • SparkStreaming

           DStream内部即为RDD持续的离散序列,RDD内部均是以文本行为基本元素,对DStream的处理即映射转化为对内部RDD的处理,故对RDD的算子操作大多数情况下适配于DStream使用,同时DStream提供了更高级别的算子API方便使用。

        • SparkStreaming

           

上一篇:ScheduledExecutorService


下一篇:【转载】【必会】SparkStreaming的窗口操作及实战