Spark Streaming是一个基于Spark核心的流式计算的扩展。
主要有以下两个特点:
1. 高吞吐量
2. 容错能力强
Spark Streaming支持多种数据源的输入,向Flume,Kafka,HDFS,ZeroMQ,Twitter以及原始的TCP sockets。
数据可以使用Spark的RDD的Transformation,也可以应用很多Spark内置的机器学习算法,还有图计算。
以下是Spark官方截图:
1.1主要实现原理
Spark Streaming会接收线上的数据流,然后将数据流分成独立的批次。
然后Spark Streaming Engine就会分别处理这些独立的批数据,最后生成分批的结果。
Spark Streaming 提出了一种高度的抽象叫 DStream(discretized stream)离散流,代表了一段持续的数据流。
创建DStream可以从文件创建,也可以从Kafka或者Flume,代表了一个RDD的序列。
package org.apache.spark.streaming.examples
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.StreamingContext._
import org.apache.spark.storage.StorageLevel
object NetworkWordCount {
def main(args: Array[String]) {
if (args.length < 3) {
System.err.println("Usage: NetworkWordCount \n" +
"In local mode, should be 'local[n]' with n > 1")
System.exit(1)
}
StreamingExamples.setStreamingLogLevels()
// Create the context with a 1 second batch size
val ssc = new StreamingContext(args(0), "NetworkWordCount", Seconds(1),
System.getenv("SPARK_HOME"), StreamingContext.jarOfClass(this.getClass))
// Create a NetworkInputDStream on target ip:port and count the
// words in input stream of \n delimited text (eg. generated by 'nc')
val lines = ssc.socketTextStream(args(1), args(2).toInt, StorageLevel.MEMORY_ONLY_SER)
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
wordCounts.print()
ssc.start()
ssc.awaitTermination()
}
}
nc -lk 9999
进程会阻塞,当我们输入数据的时候,会向9999这个端口发送我们的数据。
val ssc = new StreamingContext(args(0), "NetworkWordCount", Seconds(1),
System.getenv("SPARK_HOME"), StreamingContext.jarOfClass(this.getClass))
val lines = ssc.socketTextStream(args(1), args(2).toInt, StorageLevel.MEMORY_ONLY_SER)
ssc.start()
ssc.awaitTermination()
# nc -lk 9999
what is your name ?
my name is sheng li ~ haha
-------------------------------------------
Time: 1397470893000 ms
-------------------------------------------
(is,1)
(what,1)
(your,1)
(?,1)
(name,1)
-------------------------------------------
Time: 1397470894000 ms
-------------------------------------------
Time: 1397470962000 ms
-------------------------------------------
(haha,1)
(my,1)
(is,1)
(~,1)
(li,1)
(sheng,1)
(name,1)
4.最后计算完成,输出wordCounts.print()。
总结:
实际上每次的input都是一个RDD@time N
每个RDD@time N 都可以被transform成其它的RDD进行处理。
看起来相当简单。
再来看下官方的解释图,会很好的理解:
参考文献:http://spark.apache.org/docs/0.9.1/streaming-programming-guide.html
原创文章,转载注明出处http://blog.csdn.net/oopsoom/article/details/23692079