Spark Streaming
基本概念
SparkStreaming 是流式处理框架,微批次,准实时,支持可扩展、高吞吐量、容错的实时数据流处理,实时数据的来源可以是:Kafka,Flume,Twitter,ZeroMQ,或者是TCP Sockets,并且可以使用高级功能的复杂算子来处理流数据,最终没处理后的数据可以放在文件系统,数据库等
Spark Streaming 程序运行起来之后,是7*24小时运行的,task也是一直运行的,比如:task将监控到的5S数据封装到一个batch中,batch没有分布式计算特性,被封装到一个RDD中,最终这个RDD被封装到一个DStream中,DStream生成之后,可以进行算子(Transformation和OutputOperator)操作。
假设每5S一个批次,但是处理完数据需要6S,则会产生加压,积压的数据存储在内存中,时间长会造成OOM,如果存储在磁盘中,则过多的IO拉低程序性能
Spark Streaming 与 Storm
Storm 是纯实时流处理框架,Spark Streaming是准实时流式处理框架,效率高,吞吐量大。
Storm 的事务比Spark Streaming完善。
Storm支持动态资源调度,Spark 也支持动态资源调度,充分利用集群资源。
Spark Streaming擅长处理复杂的业务,可以使用sql查询微批数据。Storm处理简单的业务
DStream
算子
Transformation
transform
Return a new DStream by applying a RDD-to-RDD function to every RDD of the source DStream. This can be used to do arbitrary RDD operations on the DStream.
可以在算子中执行其他算子,返回新的DStream
Output Operations
Window Operations
Spark Streaming WC
下载netcat
运行命令winwods: nc -l -p 9999 #linux: nc -lk 9999
import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.{Duration, Durations, StreamingContext}
//这个单独导入一下,可能会造成DStream一些方法不可用,比如reduceByKey()找不到
import org.apache.spark.streaming.StreamingContext._
object TestStreaming {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
conf.setMaster("local[4]").setAppName("test")
val sc = new StreamingContext(conf, Durations.seconds(10))
val value = sc.socketTextStream("localhost" , 9999 , StorageLevel.MEMORY_ONLY)
val words = value.flatMap(_.split(",")).map((_,1)).reduceByKey(_+_)
words.print()
sc.start()
sc.awaitTermination()
sc.stop()
}
}