先说说SparkStream是什么呢?
它是一个准流式计算框架,是微批处理的;说到流式计算框架,就会想到storm流式计算框架,所以下面来看下两者的区别:
1、storm实时流计算框架,是一条一条处理数据;SparkStream是准实时流计算框架,是微批处理,所以延迟度要比storm高,但吞吐量也比storm高;
2、SparkStream支持事物,storm也支持事物,但storm事物机制要更完善一些;
3、SparkStream支持动态调整资源,storm也支持;
4、SparkStream支持复杂的业务逻辑,storm业务逻辑相对简单一些;
它们各有优缺点,具体用哪个还得具体看业务需求情况。看完了区别,再来具体看下SparkStream的一个具体流程,看下它是怎么运行的:
SparkStream的receiver task会7*24小时的一直在运行,将接收到的数据保存起来。每隔batchInterval的时间内(比如5s)将数据封装成一个batch,继而再封装成RDD,最后变成一个Dstream。
在这里要注意具体的数据计算时间,时间不同会产生不一样的场景;假设:计算一批数据时间需要3s ,0~5s的时候,处于接收数据状态;5~10s,一边接收第二批数据,一边计算第一批数据;以此类推。再假设:计算一批数据的时间要6s,0~5的时候,处于接收数据的状态;5~10s,一边接收第二批数据,一边计算第一批数据;10~15s,一边接收第三批数据,一边计算第一批数据和第二批数据,那么这情况下随着时间的增长,数据的推挤会越来越严重,如果说数据保存在内存中,就会导致OOM,并且会影响性能。这里的解决方法会另外找时间写,接下来下说sparkstream它的一些算子,今天先罗列下有哪些算子:
转换算子有:transform,updateStateByKey,reduceByKeyAndWindow(窗口操作);
触发算子有:foreachRDD,print,SaveAsHadoopFile,SaveAsTextFile
这些算子如果展开也是有的看了,今天是想先把sparkstream的一个框架先理清楚,具体的算子代码和注意事项,后面会专门写一篇spark算子的整合的,到时候具体讲;
最后再说说sparkstream跟kafka的整合,既然是计算框架,拿就是计算数据的,就跟跟存储数据的进行整合,才能更高效;
sparkstream跟kafka的整合有两种模式,receiver模式和direct模式:
receiver模式在SparkStreaming程序运行起来后,Executor中会有receiver tasks接收kafka推送过来的数据。数据会被持久化,默认级别为MEMORY_AND_DISK_SER_2,这个级别也可以修改。receiver task对接收过来的数据进行存储和备份,这个过程会有节点之间的数据传输。备份完成后去zookeeper中更新消费偏移量,然后向Driver中的receiver tracker汇报数据的位置。最后Driver根据数据本地化将task分发到不同节点上执行。
receiver模式要注意,当Driver进程挂掉后,Driver下的Executor都会被杀掉,当更新完zookeeper消费偏移量的时候,Driver如果挂掉了,就会存在找不到数据的问题,相当于丢失数据。所以为了解决数据丢失,要开启WAL(write ahead log)预写日志机制,在接受过来数据备份到其他节点的时候,同时备份到HDFS上一份(我们需要将接收来的数据的持久化级别降级到MEMORY_AND_DISK),这样就能保证数据的安全性。不过,因为写HDFS比较消耗性能,要在备份完数据之后才能进行更新zookeeper以及汇报位置等,这样会增加job的执行时间,这样对于任务的执行提高了延迟度。
但开启WDL机制又会造成数据重复消费。
还有receiver的并行度,receiver的并行度是由spark.streaming.blockInterval来决定的,默认为200ms,假设batchInterval为5s,那么每隔blockInterval就会产生一个block,这里就对应每批次产生RDD的partition,这样5秒产生的这个Dstream中的这个RDD的partition为25个,并行度就是25。如果想提高并行度可以减少blockInterval的数值,但是最好不要低于50ms。限流配置是:spark.streaming.receiver.maxRate
而Driect模式就是将kafka看成存数据的一方,不是被动接收数据,而是主动去取数据。消费者偏移量也不是用zookeeper来管理,而是SparkStreaming内部对消费者偏移量自动来维护,默认消费偏移量是在内存中。Direct模式的并行度是由读取的kafka中topic的partition数决定的。限流配置:spark.streaming.kafka.maxRatePerPartiton。
嗯,到这里大概把sparkstream的情况都讲了,刚开始写,感觉完全不会写,看心情写了,你们也看心情看吧,有哪不对的欢迎指教哈哈。