基本概念
接下来,我们在上一节例子的基础上,来阐述Spark Streaming的基本知识。
链接
和Spark类似,Spark Streaming也包含在maven的中央仓库中。为了写基于Spark Streaming的程序,你需要为你的SBT或Maven工程分别添加以下依懒:
Maven:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.10</artifactId>
<version>1.4.0</version>
</dependency>
SBT:
libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.4.0"
为了从Kafka, Flume, 和 Kinesis等源中提取数据,你需要添加额外的依懒。因为Spark Streaming的核心API并不直接支持。下面是一些常用的依懒:
Source | Artifact |
---|---|
Kafka | spark-streaming-kafka_2.10 |
Flume | spark-streaming-flume_2.10 |
Kinesis | spark-streaming-kinesis-asl_2.10 [Amazon Software License] |
spark-streaming-twitter_2.10 | |
ZeroMQ | spark-streaming-zeromq_2.10 |
MQTT | spark-streaming-mqtt_2.10 |
要获得最新的列表,请在maven中央仓库Maven repository查看支持的源和坐标。
初始化StreamingContext
为了初始化一个Spark Streaming程序,需要创建一个StreamingContext对象,它是所有Spark Streaming功能的主入口点。
可以从一个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或者YARN cluster 的URL,或者用"local[*]'字符串表示运行在本地模式。
在实践中,当在集群上运行程序时,你不希望硬编码master的值。你可以通过从spark-submit启动你的程序,并指明参数。然而,为了本地测试或者单元测试,你可以传递"local[*]”参数来运行Spark Streaming程序。注意,你可以通过ssc.SparkContext的方式来访问SparkContext.
批处理的间隔需要根据你的应用程序的延迟要求和可用的集群资源来设置。
SparkStreaming对象也可以由已经存在的SparkContext来创建:
import org.apache.spark.streaming._
val sc = ... // existing SparkContext
val ssc = new StreamingContext(sc, Seconds(1))
在创建了context之后,你需要做以下几步:
1.通过创建输入DStreams来定义输入源
2.通过对DStreams应用转变操作和输出操作来定义流计算。
3.用streamingContext.start()来开始接收数据和处理流程。
4.通过streamingContext.awaitTermination()方法来等待处理结束(手动结束或因为错误)
5.还可以通过streamingContext.stop()来手动结束进程。
需要记住的关键点:
1.一旦context启动后,就不能再添加新的streaming计算或操作。
2.一旦context停止后,就不能再重新启动它了。
3.在同一时间内,一个JVM上只能运行一个StreamingContext
4.在StreamingContext上的stop()操作也会将SparkContext停止。如果只想停止StreamingContext,对stop的可选参数stopSparkContext设置为false.
5.一个SparkContext可以用来创建多个StreamingContext,只要前一个StreamingContext已经停止了。