Spark Streaming知识点总结

一、Spark Streaming概述

1.1 Spark Streaming是什么?

Spark Streaming用于流式数据的处理。Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的 TCP套接字等等。

数据输入后可以用 Spark 的高度抽象原语如:map、reduce、join、window等进行运算。而结果也能保存在很多地方,如HDFS,数据库等。

和Spark基于RDD的概念很相似,Spark Streaming使用离散化流(discretized stream)作为抽象表示,叫作DStream

DStream是随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为RDD存在,而DStream是由这些RDD所组成的序列(因此得名“离散化”)。

批量计算:也叫离线计算,往往计算全量数据;数据有边界,无论大小,总之有大小

流计算:数据是不断产生的,要求快速的处理,所以处理的是增量数据

1.2 特点

  1. 易用

    Spark Streaming具有类似RDD的API,易于使用,并可和现有系统公用相似代码;可以在流上使用基于Spark的机器学习和流式计算,是一个一个站式的平台

  2. 容错

    Spark Streaming是微批次处理模型,微批次处理的方式不会有长时间运行的Operator,所以更易于容错设计;能够避免运行过慢的服务,实行推测执行

  3. 易整合到Spark体系

    可以从kafka,flume,TCP等流和队列中获取数据,可以将处理过的数据写入文件系统中,常见的数据库中

二、DStream创建

2.1 文件数据源

Spark Streaming中创建SparkStreamingContext,通过监控端口创建DStream:ssc.socketTextStream("hostname", "port")

socket -> SparkStreaming -> Console

socketTextStream用于创建一个DStream,监听socket输入,当做文本来处理,DStream可以理解为一个流式的RDD

启动ssc应用程序:ssc.start()

因为main方法执行完毕后整个程序就会退出,所以需要阻塞主线程:ssc.awaitTermination()

调用stop,首先会停掉StreamingContext,参数默认为true,也会停掉SparkContext对象:ssc.stop(true)

注意:local[*]中 *的值一定要大于1,因为要有一个去监听,所以至少设置为2

2.2 RDD队列

测试过程中,可以通过使用 ssc.queueStream(queueOfRDDs)来创建DStream,每一个推送到这个队列中的RDD,都会作为一个DStream处理

2.3 自定义数据源

创建DStream时自定义数据源

2.4 Kafka数据源

SparkStreaming + Kafka集成,创建DStream以kafka作为数据源

Dstream中是RDD流,只是RDD的分区对应了kafka的分区是不行的,因为需要一套单独的机制来保证并行的读取外部的数据源,这套机制叫做Receiver

三、DStream转换

DStream上的原语与RDD的类似,分为Transformations(转换)和Output Operations(输出)两种

此外转换操作中还有一些比较特殊的原语,如:updateStateByKey()、transform()以及各种Window相关的原语

3.1 无状态转化操作

把简单的RDD转化操作应用到每个批次上,也就是转化DStream中的每一个RDD

无状态转化操作有:map(),flatMap(),filter(),repartition(),reduceByKey(),groupByKey()等

注意:针对键值对的DStream转化操作(如reduceByKey())要添加 import StreamingContext._ 才能在scala中使用

3.2 有状态转换操作

3.2.1 updateStateByKey()

用于记录历史记录,它提供了对一个状态变量的访问,用于键值对形式的DStream

它的结果会是一个新的DStream,其内部的RDD序列是由每个时间区间对应的(键,状态)对组成的

使用updateStateByKey需对检查点进行配置会使用检查点来保存状态

3.2.2 Window Operations

可以设置窗口的大小和滑动窗口的间隔来动态的获取当前Streaming的允许状态

基于窗口的操作会在一个比StreamingContext的批次间隔更长的时间范围内,通过整合多个批次的结果,计算出整个窗口的结果

注意:所有基于窗口的操作都需要两个参数,分别为窗口时长滑动步长,两者都必须是StreamingContext(batch)的批次间隔的整数倍

3.3 Transform

Transform原语允许DStream上执行任意的RDD-to-RDD函数

即使这些函数并没有在DStream的API暴露出来,通过该函数可以方便的扩展Spark API

该函数每一批次调度一次,其实就是对DStream中的RDD应用转化

3.4 Join

连接操作(leftOuterJoin。rightOuterJoin,fullOuterJoin也可以)

可以连接Stream-Stream,Windows-Stream to Windows-Stream,Stream-dataset

四、Lambda架构

Lambda架构:整合了离线计算和实时计算

4.1 Lambda架构分层

一般情况下Lambda架构分三层:

  1. 批处理层:批量写入,批量读取
  2. 服务层:分为两个部分,一部分对应批处理层,一部分对应速度层
  3. 速度层:随机读取,随机写入,增量计算

4.2 优点

兼顾优点,在批处理层可以全量查询和分析,在速度层可以查询最新的数据

速度很快,在大数据系统中,想要快速的获取结果是非常困难的,因为高吞吐量和快速返回结果往往很难兼得;例如ImpalaHive

Hive能进行非常大规模的数据量的处理,Impala能够快速的查询返回结果,但是很少有一个系统能够兼得两点

Lambda使用多种融合的手段从而实现

4.3 缺点

Lambda是一个非常反人类的设计,因为需要在系统中不仅维护多套数据层,还需要维护批量处理和流式处理两套框架,这非常难,一套都很难搞定,两套带来的运维问题是指数级提升的

4.4 容错手段

因为要长时间运行,对任何一个流式计算系统来说,容错都是非常致命也是非常重要的一环,在Spark Streaming中,大致提供了如下的容错手段:

  1. 热备(默认容错手段)

    StorageLevel.MEMORY_AND_DISK_SER:BlockManager不仅会在本机存储,也会发往其他的主机进行存储,本质就是冗余备份;如果失败,通过冗余的备份,再次进行计算

  2. 冷备(WAL预写日志)

    当Receiver获取到一份数据后,先不存,先写日志,之后写入BlockManager;如果失败,通过log日志,再次进行计算

  3. 重放

    如kafka,它可根据offset来获取数据

你可能感兴趣的:(Spark,大数据,spark)