Spark Streaming实时流处理项目实战(八)Spark Streaming核心

核心概念

1. StreamingContext

两个常用的构造方法

def this(sparkContext: SparkContext, batchDuration: Duration) = {
    this(sparkContext, null, batchDuration)
  }
  
def this(conf: SparkConf, batchDuration: Duration) = {
    this(StreamingContext.createNewSparkContext(conf), null, batchDuration)
  }

官方样例

import org.apache.spark._
import org.apache.spark.streaming._

val conf = new SparkConf().setAppName(appName).setMaster(master)
val ssc = new StreamingContext(conf, Seconds(1))

该appName参数是您的应用程序显示在集群UI上的名称。 master是Spark,Mesos或YARN群集URL或特殊的 “local [*]” 字符串,以在本地模式下运行。实际上,当在集群上运行时,您将不希望master在程序中进行硬编码,而是希望在其中启动应用程序spark-submit并在其中接收。但是,对于本地测试和单元测试,您可以传递“ local [*]”以在内部运行Spark Streaming(检测本地系统中的内核数)。请注意,这会在内部创建一个SparkContext(所有Spark功能的起点),可以通过访问ssc.sparkContext。

The batch interval must be set based on the latency requirements of your application and available cluster resources.
batch interval:可以根据你的应用程序需求的延迟要求以及集群可用的资源情况来设置。

定义上下文后,你可以执行以下操作:

1、通过创建输入DStream定义输入源。
2、通过将转换和输出操作应用于DStream来定义流计算。
3、开始接收数据并使用进行处理streamingContext.start()。
4、等待使用停止处理(手动或由于任何错误)streamingContext.awaitTermination()。
5、可以使用手动停止处理streamingContext.stop()。

要记住的要点:

1、一旦启动上下文,就无法设置新的流计算或将其添加到该流计算中。
2、上下文一旦停止,就无法重新启动。
3、JVM中只能同时激活一个StreamingContext。
4、StreamingContext上的stop()方法,可以停止SparkContext。如果只想停止StreamingContext,设置可选的参数stopSparkContext 设置为false即可。
5、只要在创建下一个StreamingContext之前停止(而不停止SparkContext)上一个StreamingContext,即可将SparkContext重新用于创建多个StreamingContext。

2. DStreams

Discretized Streams (DStreams)
Discretized或DStream是Spark Streaming提供的基本抽象。它表示连续的数据流,可以是从源接收的输入数据流,也可以是通过对输入流进行转换而生成的已处理数据流。在内部,DStream由一系列连续的RDD表示,RDD是Spark里边的一个抽象,是不可变的分布式数据集(有关更多详细信息,请参见Spark编程指南)。DStream中的每个RDD都包含来自特定间隔的数据,如下图所示。
在这里插入图片描述
在DStream上执行的任何操作都转换为对基础RDD的操作。例如,在将行流转换为单词的较早示例中,该flatMap操作应用于linesDStream中的每个RDD,以生成DStream的 wordsRDD。(通俗的将:对Dstream操作算子。比如map/flatMap,其实底层会被翻译为对DStream中的每个RDD都做相同的的操作;因为一个DStream是由不同批次的RDD所构成的) 如下图所示。
在这里插入图片描述
这些基础的RDD转换由Spark引擎计算。DStream操作隐藏了大多数这些细节,并为开发人员提供了更高级别的API,以方便使用。

3. Input DStreams and Receivers

输入DStream是表示从流源接收的输入数据流的DStream。在快速示例中,lines输入DStream代表从netcat服务器接收的数据流。每个输入DStream(文件系统除外)都与一个Receiver对象关联,该对象从源接收数据并将其存储在Spark的内存中以进行处理。

Transformations

Transformations on DStreams
与RDD相似,transformations 允许修改来自输入DStream的数据。DStream支持普通Spark RDD上可用的许多转换(transformations )。一些常见的方法如下。

Transformation含义
map(func)通过将源DStream的每个元素传递给函数func来返回新的DStream 。
flatMap(func)与map相似,但是每个输入项都可以映射到0个或多个输出项。
filter(func)通过仅选择func返回true的源DStream的记录来返回新的DStream 。
repartition(numPartitions)通过创建更多或更少的分区来更改此DStream中的并行度。
union(otherStream)返回一个新的DStream,其中包含源DStream和otherDStream中的元素的并集。
count()通过计算源DStream的每个RDD中的元素数,返回一个新的单元素RDD DStream。
reduce(func)通过使用函数func(带有两个参数并返回一个)来聚合源DStream的每个RDD中的元素,从而返回一个单元素RDD的新DStream 。该函数应具有关联性和可交换性,以便可以并行计算。
countByValue()在类型为K的元素的DStream上调用时,返回一个新的(K,Long)对的DStream,其中每个键的值是其在源DStream的每个RDD中的频率。
reduceByKey(func, [numTasks])在(K,V)对的DStream上调用时,返回一个新的(K,V)对的DStream,其中使用给定的reduce函数汇总每个键的值。注意:默认情况下,这使用Spark的默认并行任务数(对于本地模式为2,而在集群模式下,此数量由config属性确定spark.default.parallelism)进行分组。您可以传递一个可选numTasks参数来设置不同数量的任务。
join(otherStream, [numTasks])当在(K,V)和(K,W)对的两个DStream上调用时,返回一个新的(K,(V,W))对的DStream,其中每个键都有所有元素对。
cogroup(otherStream, [numTasks])在(K,V)和(K,W)对的DStream上调用时,返回一个新的(K,Seq [V],Seq [W])元组的DStream。
transform(func)通过对源DStream的每个RDD应用一个RDD-to-RDD函数来返回一个新的DStream。这可用于在DStream上执行任意的RDD操作。
updateStateByKey(func)返回一个新的“状态” DStream,在该DStream中,通过在键的先前状态和键的新值上应用给定的函数来更新每个键的状态。这可用于维护每个键的任意状态数据。

Output Operations

Output Operations on DStreams
输出操作允许将DStream的数据推出到外部系统,例如数据库或文件系统。由于输出操作实际上允许外部系统使用转换后的数据,因此它们会触发所有DStream转换的实际执行(类似于RDD的操作)。当前,定义了以下输出操作:

Output Operation含义
print()在运行流应用程序的驱动程序节点上,打印DStream中每批数据的前十个元素。这对于开发和调试很有用。在Python API中称为 pprint()。
saveAsTextFiles(prefix, [suffix])将此DStream的内容另存为文本文件。基于产生在每批间隔的文件名的前缀和后缀:“前缀TIME_IN_MS [.suffix]”。
saveAsObjectFiles(prefix, [suffix])将此DStream的内容保存为SequenceFiles序列化Java对象的内容。基于产生在每批间隔的文件名的前缀和 后缀:“前缀TIME_IN_MS [.suffix]”。(在Python API中不可用。)
saveAsHadoopFiles(prefix, [suffix])将此DStream的内容另存为Hadoop文件。基于产生在每批间隔的文件名的前缀和后缀:“前缀TIME_IN_MS [.suffix]”。(在Python API中不可用。)
foreachRDD(func)最通用的输出运算符,将函数func应用于从流生成的每个RDD。此功能应将每个RDD中的数据推送到外部系统,例如将RDD保存到文件或通过网络将其写入数据库。请注意,函数func在运行流应用程序的驱动程序进程中执行,并且通常在其中具有RDD操作,这将强制计算流RDD。

实战案例

Spark Streaming处理socket数据

案例需求:通过在指定的机器上,指定端口发送数据,然后使用Spark Streaming把socket数据接收过来,进行相应的处理。

Spark Streaming处理HDFS文件数据

文件系统:本地文件系统和HDFS文件系统都可以。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

怒上王者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值