Spark Streaming运行流程及基本使用

Spark Streaming介绍

       Spark Streaming是Spark核心API的一个扩展,可以实现高吞吐量的、具备容错机制的实时流数据的处理。支持从多种数据源获取数据,包括Kafk、Flume、Twitter、ZeroMQ、Kinesis以及TCP sockets,从数据源获取数据之后,可以使用诸如map、reduce、join和window等高级函数进行复杂算法的处理。最后还可以将处理结果存储到文件系统,数据库和现场仪表盘。在“One Stack rule them all”的基础上,还可以使用Spark的其他子框架,如集群学习、图计算等,对流数据进行处理。

Spark Streaming处理的数据流图:

clip_image002

       Spark的各个子框架,都是基于核心Spark的,Spark Streaming在内部的处理机制是:接收实时流的数据,并根据一定的时间间隔拆分成一批批的数据,然后通过Spark Engine处理这些批数据,最终得到处理后的一批批结果数据。对应的批数据,在Spark内核对应一个RDD实例,因此,对应流数据的DStream可以看成是一组RDDs,即RDD的一个序列。通俗点理解的话,在流数据分成一批一批后,通过一个先进先出的队列,然后 Spark Engine从该队列中依次取出一个个批数据,把批数据封装成一个RDD,然后进行处理。

Spark Streaming有以下特点:

  • 高可扩展性,可以运行在上百台机器上(Scales to hundreds of nodes)
  • 低延迟,可以在秒级别上对数据进行处理(Achieves low latency)
  • 高可容错性(Efficiently recover from failures)
  • 能够集成并行计算程序,比如Spark Core(Integrates with batch and interactive processing)

Spark Streaming工作原理

        对于Spark Core其核心部分就是RDD,对于Spark Streaming来说,它的核心是DStream(Discretized Stream),其作为Spark Streaming的基础抽象,它代表持续性的数据流。这些数据流既可以通过外部输入源赖获取,也可以通过现有的Dstream的transformation操作来获得。在内部实现上,DStream类似于RDD,其是由一组时间序列上连续的RDD来表示。每个RDD都包含了自己特定时间间隔内的数据流。如下图所示:

 

DStream中在时间轴下生成离散的RDD序列:

 

其基本工作原理为:Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark Core,也就是把Spark Streaming的输入数据按照batch size(如1秒)分成一段一段的数据(Discretized Stream),每一段数据都转换成Spark中的RDD(Resilient Distributed Dataset),然后将Spark Streaming中对DStream的Transformation操作变为针对Spark中对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加或者存储到外部设备。其Spark Streaming的基本工作原理及运行架构如下:

        对比与Spark Core,Spark Core在初始化时会生成一个SparkContext对象来对数据进行后续的处理,相对应的Spark Streaming会创建一个Streaming Context,它的底层是SparkContext,也就是说它会将任务提交给SparkContext来执行,这也很好的解释了DStream是一系列的RDD。当启动Spark Streaming应用的时候,首先会在一个节点的Executor上启动一个Receiver接受者,然后当从数据源写入数据的时候会被Receiver接收,接收到数据之后Receiver会将数据Split成很多个block,然后备份到各个节点(Replicate Blocks 容灾恢复),然后Receiver向StreamingContext进行块报告,说明数据在那几个节点的Executor上,接着在一定间隔时间内StreamingContext会将数据处理为RDD并且交给SparkContext划分到各个节点进行并行计算。

Spark Streaming基本示例

基本示例如同Spark Streaming官方网站中的示例如下:

import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.StreamingContext._ // not necessary since Spark 1.3

// Create a local StreamingContext with two working thread and batch interval of 1 second.
// The master requires 2 cores to prevent from a starvation scenario.

val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(conf, Seconds(1))
// Create a DStream that will connect to hostname:port, like localhost:9999
val lines = ssc.socketTextStream("localhost", 9999)
// Split each line into words
val words = lines.flatMap(_.split(" "))
// Count each word in each batch
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)

// Print the first ten elements of each RDD generated in this DStream to the console
wordCounts.print()
ssc.start()             // Start the computation
ssc.awaitTermination()  // Wait for the computation to terminate

一个基本的Spark Streaming创建流程如下:

  1. 创建StreamingContext对象:同Spark初始化需要创建SparkContext对象一样,使用Spark Streaming就需要创建StreamingContext对象。创建StreamingContext对象所需的参数与SparkContext基本一致,包括指明Master,设定名称。Spark Streaming需要指定处理数据的时间间隔,如上例所示的1s,那么Spark Streaming会以1s为时间窗口进行数据处理。此参数需要根据用户的需求和集群的处理能力进行适当的设置;
  2. 创建InputDStream:Spark Streaming需要指明数据源。如socketTextStream,Spark Streaming以socket连接作为数据源读取数据。当然Spark Streaming支持多种不同的数据源,包括Kafka、 Flume、HDFS/S3、Kinesis和Twitter等数据源;
  3. 操作DStream:对于从数据源得到的DStream,用户可以在其基础上进行各种操作,如上例所示的操作就是一个典型的WordCount执行流程:对于当前时间窗口内从数据源得到的数据首先进行分割,然后利用Map和ReduceByKey方法进行计算,当然最后还有使用print()方法输出结果;
  4. 启动Spark Streaming:之前所作的所有步骤只是创建了执行流程,程序没有真正连接上数据源,也没有对数据进行任何操作,只是设定好了所有的执行计划,当ssc.start()启动后程序才真正进行所有预期的操作。

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark Streaming 执行流程如下: 1. 数据源输入:Spark Streaming 支持多种数据源输入,包括 Kafka、Flume、HDFS、Socket 等。 2. 数据切分:Spark Streaming 将输入的数据流按照时间间隔切分成一系列的小批次数据。 3. 数据处理:对每个小批次数据进行处理,可以使用 Spark 的各种 API 进行数据转换、过滤、聚合等操作。 4. 数据输出:将处理后的数据输出到各种存储系统,如 HDFS、数据库、Kafka 等。 5. 容错机制:Spark Streaming 具有容错机制,可以在节点故障时自动恢复。 6. 监控和管理:Spark Streaming 提供了丰富的监控和管理工具,可以实时监控应用程序的运行状态,进行调优和管理。 ### 回答2: Spark Streaming是一个实时处理框架,它可以从数据源获取实时数据,并将其实时处理成有意义的结果。Spark Streaming框架的执行流程一般可以分为四个步骤,包括数据源接入、数据分析、数据处理和生成结果。 首先,Spark Streaming需要从数据源获取实时数据,数据源可以是文件系统、Kafka、Flume、Twitter等不同的来源。当数据源接入之后,Spark Streaming会将数据流分成若干个批次,每个批次时间间隔由用户自定义。每个批次的数据会被收集到一个RDD。 接着,Spark Streaming将收集到的数据流转换成DStream,然后进行数据分析。这个步骤是执行实时数据处理任务的关键步骤。Spark Streaming提供了许多支持数据分析的API,例如map、filter、reduce、count等API,可以根据合适的API函数对DStream的数据进行操作和处理。 接下来是数据处理的步骤,数据处理通常包括数据清洗、数据过滤、特征提取、模型训练等,Spark Streaming可以使用Spark的多个API实现这些数据处理任务。例如,可以使用Spark SQL通过Spark Streaming操作一个表来进行数据清洗和数据过滤。 最后一步是生成结果,Spark Streaming通过foreachRDD API将处理好的数据输出到指定的存储系统,如HDFS、Kafka等。此外,还可以使用Spark Streaming提供的一些可视化工具来监控处理结果。 综上所述,Spark Streaming的执行流程具体如下:数据源接入、数据分析、数据处理和生成结果。这个流程可以帮助用户实现准实时、高性能的流式数据处理应用程序。 ### 回答3: Spark StreamingSpark 提供的一种对流式数据进行处理的框架,它提供了一种高级别抽象(Discretized Stream或DStream),使用户可以像处理静态数据一样轻松处理连续的数据流。Spark Streaming 的执行流程可以分为以下几个步骤: 1.数据输入:Spark Streaming 支持多种数据输入源,包括 Kafka、Flume、Twitter、Hadoop 文件系统等。Spark Streaming 的输入源机制提供了容错机制,保证了在数据流处理过程的数据丢失的最小程度。输入的数据被 Spark Streaming 原始分散到多个节点上,这些节点构成了 StreamingContext。 2.数据转换:在原始数据被分散到各个节点上后,Spark Streaming 将它们按照一定时间间隔分成一个个小的批次(batch),并将这些批次转换成一个个 RDD。这个过程被称为 DStream 的生成。DStream 可以看做是一系列时间片(RDD)的集合。这个过程的用户代码通常是使用 Spark Streaming 提供的高级别接口(如map、flatMap 等)编写的。 3.数据处理:Spark Streaming 提供了一系列转换算子,如 map、window、reduceByKeyAndWindow、updateStateByKey 等,用来对 DStream 进行各种转换操作,进行数据处理并产生一个新的 DStream。数据处理这一步的用户代码通常是使用这些算子来实现的。 4.数据输出:经过转换后的结果 RDD 可以通过 Spark Streaming 的操作输出(直接存储到 Hadoop 文件系统、数据库等)、打印、对外部系统发送 HTTP 请求、写到 Kafka、发送邮件等多种方式输出。用户代码通常使用 Spark Streaming 内置的输出算子(如 saveAsTextFiles、foreachRDD 等)来实现。 这些步骤是在整个程序执行周期不断重复的,直到接收数据源的数据结束。Spark Streaming 的程序执行过程是基于 Spark 引擎进行的,因此它拥有 Spark 处理批处理的所有优点,如高性能、易扩展、 容错性强,同时又可用于对流处理分析。 以上是 Spark Streaming 执行流程的简单介绍,通过以上几步 Spark Streaming 可以高效、稳定地处理海量实时数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值