1、   Hadoop的MapReduce及Spark SQL等只能进行离线计算,无法满足实时性要求较高的业务需求,例如实时推荐,实时网站性能分析等,流式计算可以解决这些问题。

    目前有三种比较常用的流式计算框架,分别是storm,spark Streaming和Samza,,spark Streaming作为spark的五大核心组件之一,其原生地支持多种数据源的接入,而且可以与Spark MLLib、Graphx结合起来使用,具有高吞吐量,容错机制,数据可以从Kafka、flume、Twitter、zeroMQ、K inesis或者TCP的端口,同时能够被类似于使用map、reduce、join和window这种高级函数的算法所处理,最终,被处理过的数据能够被推送到磁盘、数据库。

spark主要与哪些组件进行交互 spark的五大组件_SparkStreaming

     sparkStreaming收到实时的输入数据流并且把数据分为多个批次,每个批次都会被spark的engine(引擎)所处理,然后合并各个批次的结果到最终的流中。

spark主要与哪些组件进行交互 spark的五大组件_kafka_02

     Spark Streaming提供了表示连续数据流的、高度抽象的被称为离散流的DStream。DStream本质上表示RDD的序列。任何对DStream的操作都会转变为对底层RDD的操作。

      Spark Streaming使用数据源产生的数据流创建DStream,也可以在已有的DStream上使用一些操作来创建新的DStream。

spark主要与哪些组件进行交互 spark的五大组件_SparkStreaming_03

2、实例:

StreamContext是sparkStreaming函数的main入口:

SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("streaming word count").set("spark.streaming.kafka.consumer.poll.ms", "60000");
   JavaStreamingContext ssc = new JavaStreamingContext(conf, Durations.seconds(2));//批次间隔时间为2秒

创建一个本地的JavaStreamingContext,拥有两个线程,批次间隔时间为2秒

将会展示在集群UI界面上。master是你的Spark、Mesos 或者Yarn集群的URL,或者指定“local[*]”字符串以本地模式去运行。在实际中,当你运行在集群上时,你不会把master硬编码在你的程序中(就是说你不能写死),使用spark-submit命令提交应用的时候把master作为参数加入其中。然而,为了本地测试或者单元测试,当运行sparkStreaming的时候你可以传递“local[*]”。

本lines代表了将要从数据服务器获取的数据流:

//通过KafkaUtils.createDirectStream(...)获得kafka数据,kafka相关参数由kafkaParams指定
	        JavaInputDStream<ConsumerRecord<Object,Object>> lines = KafkaUtils.createDirectStream(
	                ssc,
	                LocationStrategies.PreferConsistent(),
	                ConsumerStrategies.Subscribe(topicsSet, kafkaParams, offsets)
	            );//默认都是从最新的偏移量取数据
通过空格符来分割单词:
String words=lines.flatMap(_.split(" "))
spark Streaming仅仅会建立计算,当他开始的时候才回去运行,目前并没有实际的进程被开启。
当我们所有的transormations已经建立完毕以后,想要开启进程,我们最终调用:
ssc.start()             // Start the computation

ssc.awaitTermination()  // Wait for the computation to terminate