计算框架对比:
1. SparkStreaming 简介
SparkStreaming 是流式处理框架,是 Spark API 的扩展,支持可扩展、高
吞吐量、容错的实时数据流处理,实时数据的来源可以是:Kafka, Flume,
Twitter, ZeroMQ 或者 TCP sockets,并且可以使用高级功能的复杂算子来
处理流数据。例如:map,reduce,join,window 。最终,处理后的数据可以
存放在文件系统,数据库等,方便实时展现。
2. SparkStreaming 与 Storm 的区别
- Storm 是纯实时的流式处理框架,SparkStreaming 是准实时的处理框
架(微批处理)。因为微批处理,SparkStreaming 的吞吐量比 Storm
要高。 - Storm 的事务机制要比 SparkStreaming 的要完善。
- Storm 支持动态资源调度。(spark1.2 开始和之后也支持)
- SparkStreaming 擅长复杂的业务处理,Storm 不擅长复杂的业务处理,
擅长简单的汇总型计算。
3. SparkStreaming 初始理解
4. SparkStreaming 代码
代码注意事项:
- 启动 socket server 服务器:nc –lk 9999
- receiver 模式下接受数据,local 的模拟线程必须大于等于 2,一个
线程用来 receiver 用来接受数据,另一个线程用来执行 job。 - Durations 时间设置就是我们能接收的延迟度。这个需要根据集群
的资源情况以及任务的执行情况来调节。 - 创建 JavaStreamingContext 有两种方式
(SparkConf,SparkContext) - 所有的代码逻辑完成后要有一个 output operation 类算子。
- JavaStreamingContext.start() Streaming 框架启动后不能再次添
加业务逻辑。 - JavaStreamingContext.stop() 无参的 stop 方法将 SparkContext
一同关闭,stop(false),不会关闭 SparkContext。 - JavaStreamingContext.stop()停止之后不能再调用 start。
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Durations, StreamingContext}
/**
* SparkStreaming 读取Socket中的数据进行实时wordcount统计。
* 注意:
* 1).nc -lk 9999 在linux中启动一个socke服务器
* 2).本地运行SparkStreaming程序需要设置 local[2] ,如果集群中运行,需要至少两个core
* 3).写SparkStreaming程序需要创建StreamingContext对象,创建StreamingContext对象有两种方式:
* ①.val ssc = new StreamingContext(sc,Durations.Seconds(xxx))
* ②.val ssc = new StreamingContext(conf,Durations.Seconds(xxx))
* 4).Durations.seconds(5) 代表batchInterval ,我们指定的可以接受的数据延迟度。可以设置:seconds,minutes,milliseconds
* 如何设置batchInterval 需要参照webui 调节。
*
* 5).SparkStreaming 启动之后,不能添加新的代码逻辑。
* 6).SparkStreaming.stop(stopSparkContext = true),在关闭StreamingContext时,需要不需要关闭parkContext对象
* 7).SparkStreaming.stop 之后不能再次调用SparkStreaming.start()重新将程序启动。
*/
object WordCount {
def main(args: Array[String]): Unit = {
val context: StreamingContext = new StreamingContext(new SparkConf()
.setAppName("WordCount")
.setMaster("local[2]"), Durations.seconds(5))
context.sparkContext.setLogLevel("Error")
val lines: ReceiverInputDStream[String] = context.socketTextStream("node4", 9999)
val words: DStream[String] = lines.flatMap(line => line.split(" "))
words.map(word => (word, 1))
.reduceByKey((v1, v2) => v1 + v2)
.print()
context.start()
context.awaitTermination()
}
}