SparkStreaming----复习

一、SparkStreaming概述

  1. 数据处理类型分类
  • 静态数据
    数据源是不变的、有限的、显式离散的
    多适用于批量计算、离线计算
  • 流数据
    数据是变动的、无限的、连续的
    多适用于实时计算,能在秒级、秒内处理完成
    实时数据分类:小时级、分钟级、秒级
  1. sparkstreaming是什么
  • 简单来说微批处理的流式(数据)实时计算框架。
  • 原理:是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,即可用于处理实时数据流。
  • 优点
    可以和spark core、sparksql等无缝集成
    支持从多种数据源获取数据,可以使用诸如map、reduce、join等高级函数进行复杂的处理,最后可以将处理结果存储到HDFS文件系统,数据库等。
  1. 重要概念说明
  • StreamingContext
    类比于SparkContext,SparkSqlContext
    流计算框架的中枢类,负责各种环境信息、分发调度等任务
  • 数据源
    简称Source,意味DataSource的缩写,指流数据的来源是哪里,比如文件,Kafka等
  • 离散流
    简称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)
    前一个窗口到后一个窗口所经过的时间长度间隔。必须是批处理时间间隔的倍数
  1. 框架内别工作流程图
    SparkStreaming----复习_第1张图片
    Spark Streaming接收实时输入数据流并将数据分成批处理,然后由SparkCore引擎处理,以批量生成最终结果流。
    SparkStreaming----复习_第2张图片

二、scala快速搭建SparkingStreaming应用

  1. scala构建SparkStreaming应用步骤
    sbt构建空eclipse项目(done)
    build.sbt中添加spark-streaming依赖
    以StreamingContext为起点,而向Dstream编程
    测试运行、效果查看
  2. 步骤实现
  • build.sbt中添加spark-streaming依赖
name := "FirstSparkStreaming4Sbt"
scalaVersion := "2.11.11"
autoScalaLibrary := false
organization := "com.xxx"
libraryDependencies ++= Seq(
   //spark-core依赖 ,注意版本group对应通过%%实现
   "org.apache.spark" %% "spark-core" % "2.3.2" % "provided",
   "org.apache.spark" %% "spark-sql" % "2.3.2" % "provided",
   "org.apache.spark" %% "spark-streaming" % "2.3.2" % "provided"
)

  • 以StreamingContext为起点,而向Dstream编程
import org.apache.spark._
import org.apache.spark.streaming._
//SparkStreaming测试类
object SparkStreamingTest {
  def main(args: Array[String]): Unit = {
    //    要初始化Spark Streaming程序,必须创建一个StreamingContext对象,
    //它是所有Spark Streaming功能的主要入口点。
    //一切都从SparkConf开始
   val conf = new SparkConf().setMaster("local[2]")
.setAppName("NetworkWordCount")
    //指定时间间隔的ssc初始化
    val ssc = new StreamingContext(conf, Seconds(1))
   
    //ssc指定来自TCP源作为输入数据源,即链接一个指定主机的已打开的TCP端口,从该端口中读取文本数据,每行以”\n”作为每行的结尾。
    val lines = ssc.socketTextStream("localhost", 9999)
   
    //将DStream进行打平处理,实际是对其内部的离散的rdd进行打平处理
    val words = lines.flatMap(_.split(" "))
   
    // 将单列的word转化为双列的kv结构,用于后边的wc操作
    val pairs = words.map(word => (word, 1))
   
    //对kv的输出进行wc计算
    val wordCounts = pairs.reduceByKey(_ + _)
    //打印wc结果到控制台
    wordCounts.print()
   
    //正式开始计算
    ssc.start()
    //等待计算结束,一般流式计算没有异常或人为干预是一直保持运行状态的
    ssc.awaitTermination()
  }
}

  • 测试运行
    在Linux上测试就启动netcat命令:nc -lk 9999端口作为对外的TCP数据服务端口
    在Windows上测试需要下载Windows netcat,下载好后在bash里找到nc64.exe所在的目录,启动后输入命令./nc64.exe -lp 9999来进行数据测试

  • 开启sparkStreaming程序,读取来自9999端口的输入的TCP流数据
    开启后一指定时间来处理输入进来的数据,此案例是来进行统计wordCount

  • 开发流程说明
    初始化StreamingContext
    通过创建输入DStreams来定义输入源。
    通过将转换和输出操作应用于DStream来定义流式计算。
    开始接收数据并使用它进行处理streamingContext.start()。
    等待处理停止(手动或由于任何错误)使用streamingContext.awaitTermination()。
    可以使用手动停止处理streamingContext.stop()。

你可能感兴趣的:(SparkStreaming----复习)