SparkStreaming
一.简介
1.sparkstreaming简介
-
sparkstreaming是流式处理框架,是sparkAPI的扩展,支持可扩展,高吞吐量.容错的准实时数据流处理
-
数据来源可以是:kafka,flume,Twitter,ZeroMQ或者TCP sockets,并且可以使用高级功能的复杂算子来处理流数据
-
处理后的数据可以存放在文件系统,数据库等,方便实时展现
2.sparkstreaming与storm的区别
-
storm是纯实时的流式处理框架,sparkstreaming是准实时的处理框架(微批处理)
-
微批处理的吞吐量比storm的高
-
storm的事务机制要比sparkstreaming的完善
-
storm支持动态资源调度
-
sparkstreaming擅长复杂的业务处理,storm不擅长,只擅长简单的汇总型计算
二.sparkstreaming的认识
-
原理图
-
-
理解
-
receiver task是7*24小时一直在执行,一直接受数据,将一段时间内接收来的数据保存到batch中,可以设置batchInterval的参数.
-
假设batchInterval为5s,那么会将接收来的数据每隔5秒封装到一个batch中,batch没有分布式计算特性,这一个batch的数据又被封装到一个RDD中最终封装到一个DStream中。
-
每隔5秒通过SparkStreamin将得到一个DStream,在第6秒的时候计算这5秒的数据,假设执行任务的时间是3秒,那么第6~9秒一边在接收数据,一边在计算任务,9~10秒只是在接收数据。
-
如果job执行的时间大于batchInterval会有什么样的问题?
如果接受过来的数据设置的级别是仅内存,接收来的数据会越堆积越多,最后可能会导致OOM(如果设置StorageLevel包含disk, 则内存存放不下的数据会溢写至disk, 加大延迟 )。
-
-
代码实现
-
注意事项
-
启动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。
-
-
源码
-
SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("WordCountOnline");
/**
* 在创建streaminContext的时候 设置batch Interval
*/
JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(5));
JavaReceiverInputDStream<String> lines = jsc.socketTextStream("node5", 9999);
JavaDStream<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
/**
*
*/
private static final long serialVersionUID = 1L;
-
-