spark streaming介绍
Spark streaming是Spark核心API的一个扩展,它对实时流式数据的处理具有可扩展性、高吞吐量、可容错性等特点。我们可以从kafka、flume、witter、 ZeroMQ、Kinesis等源获取数据,也可以通过由 高阶函数map、reduce、join、window等组成的复杂算法计算出数据。最后,处理后的数据可以推送到文件系统、数据库、实时仪表盘中.
为什么使用spark streaming
很多大数据应用程序需要实时处理数据流。思考:
我们知道spark和storm都能处理实时数据,可是spark是如何处理实时数据的,spark包含比较多组件:包括
- spark core
- Spark SQL
- Spark Streaming
- GraphX
- MLlib
spark core中包含RDD、DataFrame和DataSet等,因此spark sql是为了兼容hive而产生的sql语句,GraphX提供的分布式图计算框架,MLlib提供的机器学习框架。因此spark所谓的实时处理数据则是通过spark streaming来实现的。
什么是StreamingContext
为了初始化Spark Streaming程序,一个StreamingContext对象必需被创建,它是Spark Streaming所有流操作的主要入口。一个StreamingContext 对象可以用SparkConf对象创建。StreamingContext这里可能不理解,其实跟SparkContext也差不多的。(可参考让你真正理解什么是SparkContext, SQLContext 和HiveContext)。同理也有hadoop Context,它们都是全文对象,并且会获取配置文件信息。那么配置文件有哪些?比如hadoop的core-site.xml,hdfs-site.xml等,spark如spark-defaults.conf等。这时候我们可能对StreamingContext有了一定的认识。下面一个例子
为了初始化Spark Streaming程序,一个StreamingContext对象必需被创建,它是Spark Streaming所有流操作的主要入口。
一个StreamingContext 对象可以用SparkConf对象创建。
import
org.apache.spark.
_
impoty org.apache.spark.streaming.
_
val
conf
=
new
SparkConf().setAppName(appName).setMaster(master)
val
ssc
=
new
StreamingContext(conf,Seconds(
1
))
一个进程内运行Spark Streaming。需要注意的是,它在内部创建了一个SparkContext对象,你可以通过 ssc.sparkContext访问这个SparkContext对象。
批时间片需要根据你的程序的潜在需求以及集群的可用资源来设定,你可以在性能调优那一节获取详细的信息.可以利用已经存在的 SparkContext 对象创建 StreamingContext 对象。
- 定义输入源;
- 准备好流计算指令;
- 利用 streamingContext.start() 方法接收和处理数据;
- 处理过程将一直持续,直到 streamingContext.stop() 方法被调用。
几点需要注意的地方:
- 一旦一个context已经启动,就不能有新的流算子建立或者是添加到context中。
- 一旦一个context已经停止,它就不能再重新启动
- 在JVM中,同一时间只能有一个StreamingContext处于活跃状态
- 在StreamingContext上调用 stop() 方法,也会关闭SparkContext对象。如果只想仅关闭StreamingContext对象,设
- 置 stop() 的可选参数为false
- 一个SparkContext对象可以重复利用去创建多个StreamingContext对象,前提条件是前面的StreamingContext在后面
- StreamingContext创建之前关闭(不关闭SparkContext)。
一个简单的基于Streaming的workCount代码如下:
package
com.debugo.example
import
org.apache.spark.streaming.{Seconds, StreamingContext}
import
org.apache.spark.streaming.StreamingContext.
_
import
org.apache.spark.SparkConf
object
WordCountStreaming {
def
main(args
:
Array[String])
:
Unit
=
{
val
sparkConf
=
new
SparkConf().setAppName(
"HDFSWordCount"
).setMaster(
"spark://172.19.1.232:7077"
)
//create the streaming context
val
ssc
=
new
StreamingContext(sparkConf, Seconds(
30
))
//process file when new file be found.
val
lines
=
ssc.textFileStream(
"file:///home/spark/data"
)
val
words
=
lines.flatMap(
_
.split(
" "
))
val
wordCounts
=
words.map(x
=
> (x,
1
)).reduceByKey(
_
+
_
)
//这里不是rdd,而是dstream
wordCounts.print()
ssc.start()
ssc.awaitTermination()
}
}
这段代码实现了当指定的路径有新文件生成时,就会对这些文件执行wordcount,并把结果print。具体流程如下:
代码诠释:
使用Spark Streaming就需要创建StreamingContext对象(类似SparkContext)。创建StreamingContext对象所需的参数与SparkContext基本一致,包括设定Master节点(setMaster),设定应用名称(setAppName)。第二个参数Seconds(30),指定了Spark Streaming处理数据的时间间隔为30秒。需要根据具体应用需要和集群处理能力进行设置。