Spark大数据分与实践笔记(第七章 Spark Streaming实时计算框架-01)

第七章 Spark Streaming实时计算框架

近年来,在Web应用、网络监控、传感监测、电信金融、生产制造等领域,增强了对数据实时处理的需求,而Spark中的Spark Streaming实时计算框架就是为了实现对数据实时处理的需求而设计的。在电子商务中,淘宝、京东等网站从用户点击的行为(如加入购物车)和浏览的历史记录中发现用户的购买意图和兴趣,然后通过SparkStreaming实时计算框架的分析处理,为之推荐相关商品,从而有效地提高商品的销售量,同时也增加了用户的满意度,可谓是“一举二得”。因此,本章将针对Spark Streaming实时计算框架相关的知识进行详细介绍。

7.1 实时计算概述

7.1.1 什么是实时计算

在传统的数据处理流程(离线计算)中,先是收集数据,然后将数据存储到数据库中。当需要某些数据时,则可以通过对数据库中的数据做操作,得到所需要的数据,再进行其它相关的处理。这样的处理流程会造成结果数据密集,结果数据密集则存在数据反馈不及时,若是在实时搜索的应用场景中,需要实时数据做决策,而传统的数据处理则并不能很好地解决问题,这就引出了一种新的数据计算——实时计算, 它可以针对海量数据进行实时计算,无论是在数据采集还是数据处理中,都可以达到秒级别的处理要求。
在大数据技术中,有离线计算、批量计算、实时计算以及流式计算,其中,离线计算和实时计算指的是数据处理的延迟;批量计算和流式计算指的是数据处理的方式。

7.1.2 常用的实时计算框架

目前,业内已经衍生出许多实时计算数据的框架,例如Apache Spark Streaming、Apache Storm、Apache Flink以及Yahoo! S4。
●Apache Spark Streaming
即Apache公司免费、开源的实时计算框架。Apache Spark Streaming主要是把输入的数据按时间进行切分,切分的数据块并行计算处理,处理的速度可以达到秒级别。Netflix公司通过Kafka和Spark Streaming构建了实时引擎,对每天从各种数据源接收到的数十亿数据进行分析,从而完成电影的推荐。
●Apache Storm
即Twitter公司免费、开源贡献给Apache的一 个分布式实时计算系统。Apache Storm可以简单、高效、可靠地实时处理海量数据,处理数据的速度达到毫秒级别,并将处理后的结果数据保存到持久化介质中(如数据库、HDFS) 。
阿里巴巴公司JStorm,参考的就是Apache Storm开发的实时计算框架,可以说是Strom的增强版本,在网络I/O、线程模型、资源调度、可用性及稳定性上都做了极大的改进,供很多企业使用。
●Apache Flink
即Apache公司开源的计算框架。Apache Flink不仅可以支持离线处理,还可以支持实时处理。由于离线处理和实时处理所提供的SLA (服务等级协议)是完全不相同的,所以离线处理一般需要支 持低延迟的保证,而实时处理则需要支持高吞吐、高效率的处理。
●Yahoo! S4 (Simple Scalable Streaming System)
即Yahoo公司开源的实时计算平台。Yahoo! S4是通用的、分布式的、可扩展的,并且还具有容错和可插拔能力,供开发者轻松地处理源源不断产生的数据。

7.2 Spark Streaming的概述

7.2.1 Spark Streaming简介

Spark Streaming是构建在Spark上的实时计算框架,且是对Spark Core API的一个扩展,它能够实现对流数据进行实时处理,并具有很好的可扩展性、高吞吐量和容错性。Spark Streaming具有如下显著特点:
●易用性
Spark Streaming支持Java、Python、 Scala等编程语言, 可以像编写离线程序一样编写实时计算的程序。
●容错性
Spark Streaming在没有额外代码和配置的情况下,可以恢复丢失的数据。对于实时计算来说,容错性至关重要。首先我们要明确一下Spark中RDD的容错机制, 即每一个RDD都是一个不可变的分布式可重算的数据集,其记录着确定性的操作继承关系(lineage) ,所以只要输入数据是可容错的,那么任意一个RDD的分区 (Partition) 出错或不可用,都是可以使用原始输入数据经过转换操作重新计算得出。
●易整合性
Spark Streaming可以在Spark上运行,并且还允许重复使用相同的代码进行批处理。也就是说,实时处理可以与离线处理相结合,进行交互式的查询操作。

7.2.2 Spark Streaming工作原理

Spark Streaming支持从多种数据源获取数据,包括Kafka、 Flume、 Twitter. ZeroMQ、 Kinesis 以及TCP Sockets数据源。当Spark Streaming从数据源获取数据之后,则可以使用诸如map、reduce、 join和window等高级函数进行复杂的计算处理,最后将处理的结果存储到分布式文件系统、数据库中,最终利用实时Web仪表板进行展示。SparkStreaming支持的输入、输出源如图所示。
在这里插入图片描述

为了可以深入的理解Spark Streaming,接下来,通过-张图对Spark Streaming的内部工作原理进行详细讲解,如图所示。
在这里插入图片描述

在图中,Spark Streaming先接收实时输入的数据流,并且将数据按照一定的时间间隔分成一 批批的数据, 每一段数据都转变成Spark中的RDD,接着交由Spark弓|擎进行处理,最后将处理结果数据输出到外部储存系统。

7.3 Spark的DStream流

7.3.1 DStream简介

Spark Streaming提供了-个高级抽象的流,即DStream (离散流)。DStream表示连续的数据流,可以通过Kafka、Flume和Kinesis等数据源创建,也可以通过现有DStream的高级操作来创建。DStream的内部结构如图所示。
在这里插入图片描述

从图可以看出,DStream的内部结构是由一系列连续的RDD组成,每个RDD都是- -小段时间分隔开来的数据集。实际上,对DStream的任何操作,最终都会转变成对底层RDDs的操作。

7.3.2 DStream编程模型

为了便于我们可以更好的使用DStream,接下来,通过一张图对DStream的编程模型进行详细讲解, 如图所示。
在这里插入图片描述

在图中,Spark Streaming将实时的数据分解成一系列很小的批处理任务。 批处理弓|擎Spark Core把输入的数据按照-定的时间片(如1s)分成一段一段的数据,每一段数据都会转换成RDD输入到Spark Core中,然后将DStream操作转换为RD算子的相关操作,即转换操作、窗口操作以及输出操作。RDD算子操作产生的中间结果数据会保存在内存中,也可以将中间的结果数据输出到外部存储系统中进行保存。

7.3.3 DStream转换操作

Spark Streaming中对DStream的转换操作会转变成对RDD的转换操作。为了更好的描述DStream是如何转换操作的,接下来,通过一-张图来进行描述DStream的转换操作, 具体如图所示。
在这里插入图片描述

在图中,lines表示转换操作前的DStream, words表示转换操作后生成的DStream。对lines做flatMap转换操作, 也就是对它内部的所有RDD做flatMap转换操作。因此,在Spark Streaming中,可以通过RDD的转换算子生成新的DStream (即words) 。下面,通过一张表来列举DStream API提供的与转换操作相关的方法。
表7-1 DStream API提供的与转换操作相关的方法

方法名称 相关说明
map(func) 将源DStream的每个元素,传递到函数func中进行转换操作,得到一个新的DStream
flatMap(func) 与map()相似,但是每个输入的元素都可以映射0或者多个输出结果
filter(func) 返回一个新的DStream,仅包含源DStream中经过func函数计算结果为true的元素
repartition(numPartitions) 用于指定DStream分区的数量
union(otherStream) 返回一个新的DStream,包含源DStream和其他DStream中的所有元素
count() 统计源DStream中每个RDD包含的元素个数,返回一个新DStream
reduce(func) 使用函数func将源DStream 中每个RDD的元素进行聚合操作,返回一个新DStream
countByValue() 计算DStream中每个RDD内的元素出现的频次,并返回一个新的DStream[(K,Long)],其中K是RDD中元素的类型,Long是元素出现的频次
join(otherStream,[numTasks]) 当被调用类型分别为(K,V)和(K,W)键值对的两个DStream 时,返回类型为(K,(V,W))键值对的一个新DStream
cogroup(otherStream,[numTasks]) 当被调用的两个DStream分别含有(K,V)和(K,W)键值对时,则返回一个新DStream
transform(func) 对源DStream中每个RDD应用RDD-to-RDD函数返回一个新DStream,在DStream中做任意RDD操作
updateStateByKey(func) 返回一个新状态DStream,通过在键的先前状态和键的新值上应用给定函数func更新每一个键的状态。该操作方法被用于维护每一个键的任意状态数据

DStream API提供的与转换操作相关的方法和RDD API有些不同,不同之处在于RDD API中没有提供transform()和update StateByKey()这两个方法。下面, 主要对transform()和update StateByKey0这两个方法进行详细讲解。

7.3.3.1 transform( )

通过对源DStream中的每个RDD应用RDD-to-RDD函数返回一个新DStream,这样就可以在DStream中做任意的RDD操作。
接下来,通过一个具体的案例来演示如何使用transform(方法将一行语句分割成多个单词,具体实现步骤如下:
(1)执行命令“nc -lk 9999”启动服务端且监听Socket服务(即Socket服务端口号9999),并输入数据"I am learningSpark Streaming now",具体命令如下:

[ root@hadoop01 servers]# nc -1k 9999
I am learning Spark Streaming now

注意:执行报错后解决方法:
重新执行
(2)打开IDEA开发工具,创建一个名称为“spark_ _chapter07 "的Maven项目(跳过原型模板的选择)。
(3)配置"pom.xml"文件,引入Spark Streaming相关依赖和设置源代码的存储路径。
引入Scala编程库、Spark核心库和Spark Streaming依赖主要用于编写Spark Streaming程序,具体内容如下:
文件7-1 pom.xml

<dependencies>
	<dependency>
		<groupId>org.scala-lang</groupId>
		<artifactId>scala-library</artifactId>
		<version>2.11.8</version>
	</dependency>
	<dependency>
		<groupId>org.apache.spark</groupId>
		<artifactId>spark-core_2.11</artifactId>
		<version>2.0.2</version>
	</dependency>
	<!--引入sparkStreaming依赖-->
	<dependency>
		<groupId>org.apache.spark</groupId>
		<artifactId>spark-streaming_2.11</artifactId>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妉妉师姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值