在sparkStreaming中,引入了checkpoint()机制,究竟是干嘛用的?
我们试想一下作为一个流式计算系统,通俗来说就是流水线,既然是流水线,万一中间出现什么故障该怎么办?可靠性怎么能够保证。亦或者对于流水线来说,之前的流水对下一个流水肯定是会影响的,如果不设置checkpoint,那么计算肯定不会考虑到之前的历史数据对其的影响,鉴于这两种考虑,sparkStreaming引入了checkpoint,不仅仅能够保证可靠性,而且 计算的时候考虑历史数据对其的影响。
那checkpoint是如何对其进行可靠性的保证的呢?说白了,就是备份,要想数据的流式计算中出了故障后能够恢复,数据从何而来?就是checkpoint中而来。不过,spark不是提供了cache()算子的吗?有它不就能够保证可靠性吗?单单用缓存肯定不行,因为我们知道缓存是放在内存当中,内存毕竟没有落地,说不好就没了数据。可靠性何从谈起?再者,流式计算通常是计算很长一段时间,在这么一段时间里如果仅仅是利用缓存,很难保证数据不丢失,没法保证可靠性。checkpoint就是需要我们手动定义一个路径,然后把重要的数据落地到该路径下,如果是单机环境,放在本机路径下就好了,如果是集群就放在HDFS上,这都是能够保证数据不丢失的。如果我们不手动删去,checkpoint下的数据是不会丢失的,哪怕是重新开机,说明checkpoint下的文件压根不是一个临时文件,这十分有利于数据的不丢失。我们来看一个具体的例子:
import org.apache.spark.streaming._
//设置每一秒进行DStream一次
val ssc = new StreamingContext(sc,Seconds(1));
//这就是我们落地的路径
ssc.checkpoint("file:///home/checkpointData");
//读取我们需要处理的文件夹
val lines = ssc.textFileStream("file:///home/checkpointData");
//这里我们具体要做啥,比如我们Wordcount
val wordCounts = lines.flatMap(_.split(" ")).map((_,1)).updateStateByKey{
(seq, op:Option[Int]) => { Some(seq.sum + op.getOrElse(0)) }
}
wordCounts.print();
//启动sparkstreaming
ssc.start();
这里做的需求就是无论什么时候的文件放进去都会统计字数,进行累计