1.作用及其概念
(1)概念:是基于spark(RDD)之上流处理
作用:makes it easy to build scalable fault-tolerant streaming applications(使构建可伸缩的容错流应用程序变得容易)
流:source==>compute==>store(存储) 离线是特殊的流,一个批次一个批次的,断流。
(2)sparkStreaming:它不是一个真正的流处理框架,是min batch(时间)批次处理,如果生产的实时性很强,则选用Storm/Flink等框架。
(3)大致流程图:
从数据源得到数据,然后得到的实时数据是会分成n个batches(按秒来划分)
(4)Spark Streaming的编程模型:DStream (代表连续的流数据)
Core:的是RDD SQL:的是DF/DS
(5)Spark Streaming编程入口:StreamingContext
SQL:SparkSession Core:SparkContext
2.基本演示
(1)upstateBykey的应用
package SparkReview.Streaming1
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
object StreamingStateApp {
def main(args: Array[String]): Unit = {
val sparkConf=new SparkConf().setMaster("local[2]").setAppName("StreamingStateApp")
val ssc=new StreamingContext(sparkConf,Seconds(10))
ssc.checkpoint("hdfs://192.168.137.251:9000/streaming/checkold/")
val lines=ssc.textFileStream("hdfs://192.168.137.251:9000/streaming/input/")
lines.flatMap(_.split(" ")).map(x=>(x,1)).updateStateByKey(updateFunction).print()
ssc.start()
ssc.awaitTermination()
}
def updateFunction(currentValues:Seq[Int],preValues:Option[Int]):Option[Int]={
val curr = currentValues.sum
val pre=preValues.getOrElse(0)
Some(curr+pre)
//同一个批次进来很有可能有俩个(a,1)(a,1),对于undatefunction来说就是俩个(1,1),
//然后求和
}
}
//The checkpoint directory has not been set. Please set it by StreamingContext.checkpoint().
//这个错误是因为,我们做的是求长批次的,新的和老的相加,但是老的计算完成了放在那里呢?所以需要一个checkpoint
//这还会有啥权限错误,改成777就ok了
(2)Streaming基本HDFS操作
package SparkReview.Streaming1
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
object StreamingHDFSApp {
def main(args: Array[String]): Unit = {
val sparkConf=new SparkConf().setAppName("HDFS").setMaster("local[2]")
val ssc=new StreamingContext(sparkConf,Seconds(10))
val lines=ssc.textFileStream("hdfs://192.168.137.251:9000/streaming/input/")
//面试题:你自己写的MR中map类里面有几个参数?实现的map方法又有几个参数?
//streaming什么时候开始跑,他就什么时候开始计算,也就是你跑之前的数据是不会计算进来的
//监控目录下的所有文件必须是相同的格式
//hdfs://192.149.21.421/2000/axxxx
//val lines2=ssc.fileStream()
lines.flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+_).print()
//TODO...统计12点到20点的数据(updateByKey)
ssc.start()
ssc.awaitTermination()
}
}