Spark Streaming官方文档翻译Spark Streaming总览
Spark Streaming官方文档翻译基本概念之初始化与Dstream
Spark Streaming官方文档翻译基本概念之输入数据流和接收器
Spark Streaming官方文档翻译基本概念之转换操作
Spark Streaming官方文档翻译基本概念之输出操作
Spark Streaming官方文档翻译基本概念之sql与Mllib
Spark Streaming官方文档基本概念之缓存与检查点
Spark Streaming官方文档翻译基本概念之累加器、广播变量和检查点
Spark Streaming官方文档翻译Spark Streaming应用之部署,升级,监控
Spark Streaming官方文档翻译Spark Streaming性能调优
Spark Streaming官方文档翻译Spark Streaming容错
Spark Streaming官方文档翻译Spark Streaming +Kafka 集成指南
Spark Streaming官方文档翻译Spark Streaming自定义接收器
基本概念
接下来,我们将脱离简单的示例,并详细介绍Spark Streaming的基础知识。
链接(Linking)
与Spark相似,可以通过Maven Central使用Spark Streaming。要编写自己的Spark Streaming程序,您必须将以下依赖项添加到SBT或Maven项目中。
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.12</artifactId>
<version>2.4.4</version>
<scope>provided</scope>
</dependency>
libraryDependencies += "org.apache.spark" % "spark-streaming_2.12" % "2.4.4" % "provided"
要从Kafka、Flume和Kinesis等Spark Streaming核心API中没有的数据源中获取数据,您必须将相应的包 spark-streaming-xyz_2.12添加到依赖项中。例如,一些常见的例子如下。
Source | Artifact |
---|---|
Kafka | spark-streaming-kafka-0-10_2.12 |
Flume | spark-streaming-flume_2.12 |
Kinesis | spark-streaming-kinesis-asl_2.12 [Amazon Software License] |
要获得最新的列表,请参考Maven存储库,以获得受支持的源代码和包的完整列表。
初始化StreamingContext
要初始化一个Spark Streaming程序,必须创建一个StreamingContext
对象,该对象是所有Spark流功能的主要入口点。
scala
可以从SparkConf对象创建StreamingContext对象。
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、Kubernetes或YARN集群的URL,或者一个特殊的local[*]
字符串,在本地模式下运行。实际上,在集群上运行时,您不希望在程序中硬编码master,而是使用spark-submit启动应用程序并在那里接收它。但是,对于本地测试和单元测试,您可以通过local[*]
来运行Spark Streaming 进程(检测本地系统中的内核数量)。注意,这在内部创建了一个SparkContext(所有Spark功能的起点),它可以作为ssc.sparkContext访问。
批处理间隔必须根据应用程序的延迟需求和可用的集群资源来设置。有关更多细节,请参阅性能调优部分。
Streaming Context对象也可以从现有的SparkContext对象创建。
import org.apache.spark.streaming._
val sc = ... // existing SparkContext
val ssc = new StreamingContext(sc, Seconds(1))
- 定义上下文之后,您必须执行以下操作。
- 通过创建输入DStreams来定义输入源。
- 通过对DStreams应用转换和输出操作来定义流计算。
- 开始接收数据并使用streamingContext.start()进行处理。
- 使用streamingContext.awaitTermination()等待处理停止(手动或由于任何错误)。
- 可以使用streamingContext.stop()手动停止处理。
注意点:
- 一旦上下文(context)启动,就不能设置或添加新的流计算。
- 上下文(context)一旦停止,就不能重新启动。
- JVM中只能同时激活一个StreamingContext。
- StreamingContext上的stop()也会停止SparkContext。要仅停止StreamingContext,请将名为stopSparkContext的stop()的可选参数设置为false。
- 只要在创建下一个StreamingContext之前停止前一个StreamingContext(不停止SparkContext),就可以重用SparkContext来创建多个StreamingContext。
离散流(Discretized Streams(DStream))
Discretized Streams
或者 DStreams
是Spark流提供的基本抽象。它表示连续的数据流,可以是从数据源接收到的输入数据流,也可以是通过转换输入数据流生成的数据流。在内部,DStream由一系列连续的RDDs表示,这是Spark对不可变的分布式数据集的抽象(参见Spark编程指南了解更多细节。DStream中的每个RDD包含来自某个时间间隔的数据,如下图所示。
应用于DStream上的任何操作都转换为底层RDDs上的操作。例如,在前面将一个行流转换为单词的示例中,flatMap操作应用于行DStream中的每个RDD,以生成 words DStream的RDDs。如下图所示。
这些底层的RDD转换是由Spark引擎计算的。DStream操作隐藏了这些细节中的大部分,并为开发人员提供了更高级的API。这些操作将在后面的小节中详细讨论。