一 .看小栗子,说说spark streaming程序构建流程
val ssc = new StreamingContext(args(0),"WordCount",Seconds(1))
val lines = ssc.socketTextStream(args(1),args(2).toInt)
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(x = > (x,1)).reduceBuKey(_+_)
wordCounts.print()
ssc.start()
ssc.awitTermination()
ssc.stop()
构建 Spark Streaming 程序主要分为以下几个步骤:
(1) 创建StreamingContext对象: 指明master,设定名称(即如上:WordCount)等.需要注意的是参数Seconds(1),spark Streaming 需要指定处理数据的时间间隔,如上设置1s,则spark streaming会以1s为时间窗口进行数据处理。此参数需要根据用户的需求和集群的处理能力进行适当设置。
(2)创建 InputDStream(数据源):如上 socketTextStream ,spark streaming将以套接字连接作为数据源读取数据。spark streaming支持多种不同的数据源,比如:
kafkaStream,
flumeStream,
fileStream,
networkStream等。
(3)操作Dstream:对于从数据源获得的Dstream,用户可以在其基础上进行各种操作,如上面小栗子中所示的操作就是一个典型的单词计数执行流程:
对当前时间窗口内从数据源得到的数据首先进行分词,然后使用mapreduce算法映射和计算,最后使用print()输出结果。
(4)启动spark streaming :之前所有步骤只创建了执行流程,程序没有真正连接上数据源,也没有对数据进行任何操作,只是设定好了所有的执行计划,当 ssc.start() 启动后,程序才真正进行所有预期的操作。
总结:
一个spark streaming应用程序与spark应用程序非常相似,用户构建执行逻辑、内部主驱动程序来调用用户实现的逻辑,持续不断的以并行的方式对输入的流式数据进行处理。
spark streaming 抽象了离散流 Dstream,它包含一组连续的RDD(分布式数据集),这一组连续的RDD代表了连续的流式数据。Dstream可以通过实时的输入数据(如从套接字接口或者从kafka消息队列中得到的数据)构建,也可以通过现有的Dstream转换得到。这些转换操作包括:
map,
reduce,
window等
Spark Streaming 的基本概念
(1)spark streaming 在0.9版本开始就将kafka、flume之类的输入接口从spark核心模块去除了,想要使用这些数据源必须将这些包依赖关系添加到maven工程中去:
Source | Artifact |
---|---|
kafka | spark-streaming-kafka_2.10 |
flume | spark-streaming-flume_2.10 |
在建立好依赖关系后,就可以创建 StreamingContext 来初始化应用程序。StreamingContext是Spark Streaming程序的总入口,因此需要创建StreamingContext:
new StreamingContext(master,appName,batchDuration,[sparkHome],[jars])
待续。。。。。