一、Spark Streaming 简介
Spark Streaming是核心Spark API的扩展,可实现可扩展
、高吞吐量
、可容错
的实时数据流处理。数据可以从诸如Kafka,Flume,Kinesis或TCP套接字等众多来源获取,并且可以使用由高级函数(如map,reduce,join和window)开发的复杂算法进行流数据处理。最后,处理后的数据可以被推送到文件系统,数据库和实时仪表板。而且,您还可以在数据流上应用Spark提供的机器学习和图处理算法。
二、Spark Streaming 的特点
(1)易用性
:集成在Spark中
(2)容错性
:底层也是RDD,RDD本身具备容错机制
(3)支持多种语言
:Java Scala Python
三、Spark Streaming 的内部结构
在内部,它的工作原理如下:
Spark Streaming接收实时输入数据流,并将数据切分成批,然后由Spark引擎对其进行处理,最后生成“批”形式的结果流。
Spark Streaming将连续的数据流抽象为discretizedstream
或DStream
。
在内部,DStream 由一个RDD序列表示
。
四、开发小程序NetworkWordCount
注意:执行本程序,必须确保虚拟机CPU核数大于2
(1)由于在本案例中需要使用netcat网络工具,所以需要先安装。
在虚拟机端口输入命令:yum install nc
(2)启动netcat数据流服务器,并监听端口:1234
命令:nc -l 1234
(3)编写程序代码
import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* 知识点:
* 1、创建StreamingContext 核心:DStream 离散流
*
* 2、DStream的表现形式:就是RDD
*
* 3、使用DStream把连续的数据流变成不连续的RDD
*
* Spark Streaming 最核心的内容
*/
object MyNetworkWordCount {
def main(args: Array[String]): Unit = {
import org.apache.log4j.Logger
import org.apache.log4j.Level
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
// 保证CPU的核数大于等于2 local[2]代表开启两个线程
val conf = new SparkConf().setAppName("MyNetworkWordCount").setMaster("local[2]")
//接收两个参数,第一个conf,第二个是采样时间间隔
//spark streaming把连续的数据流变成不连续的RDD,所以就是定时采样 每隔3秒
val ssc = new StreamingContext(conf,Seconds(3))
//创建DStream 从netcat服务器上接收数据
val lines = ssc.socketTextStream("192.168.1.121",1234,StorageLevel.MEMORY_ONLY)
val words = lines.flatMap(_.split(" "))
val wordCount = words.map((_,1)).reduceByKey(_ + _)
wordCount.print()
ssc.start() //启动StreamingContext进行计算
ssc.awaitTermination() //等待任务结束
}
}
注意:
//local[2] 代表开启两个线程
val sparkConf =
new SparkConf().setAppName("NetworkWordCount").setMaster("local[2]")
官方的解释:
(4)执行程序测试
在虚拟机命令行输入测试单词:(随便输入几个单词就行)
采集结果:
注意:如果程序运行时,log 日志太多,可以
将 spark conf 目录下的 log4j 文件里面的日志级别改成WARN
。
(5) WordCount程序解析
1)Discretized Stream 是 Spark Streaming 的基础抽象,代表持续性的数据流和经过各种 Spark 原语操作后的结果数据流
。在内部实现上,DStream 是一系列连续的 RDD 来表示
。每个 RDD 含有一段时间间隔内的数据,如下图:
2)对数据的操作也是按照 RDD 为单位来进行的
3)计算过程由 Spark engine 来完成