spark streaming
1.SparkStreaming
1).SparkStreaming是流式处理框架,7*24小时不间断运行,微批处理。
2).与Storm的区别:
i).Storm是纯实时处理数据,SparkStreaming是微批处理数据
ii).Storm擅长处理汇总型业务,SparkStreaming擅长处理复杂的业务,可以使用SpakrCore,SparkSQL
iii).Storm可以动态调度资源,SparkStreaming1.2之后可以
v).Storm事务相对SparkStreaming比较完善
3).接受处理数据过程:
要使用一个task接受数据,SparkStreaming将一段时间内的接受来的数据当做一批次处理,这个一段时间就是BatchInterval,
将接受数据每隔BatchInterval封装到一个batch中,这个batch又被封装到一个RDD中,这个RDD又被封装到一个DStream中。
每隔batchInterval,就会产生一个DStream,后面要有task处理这个DStream。
假设产生一批次的时间是5s,集群处理这批次数据的时间是3s,集群休息了2s.
假设产生一批次的时间是5s,集群处理这批次数据的时间是8s,集群中就会有任务堆积。
参照WEBUI看有没有任务堆积。
2.SparkStreaming读取Socket端口数据
1.代码:
SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("WordCountOnline");
JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(5));
JavaReceiverInputDStream<String> lines = jsc.socketTextStream("node5", 9999);
// JavaSparkContext sc = new JavaSparkContext(conf);
// JavaStreamingContext jsc = new JavaStreamingContext(sc,Durations.seconds(5));
// JavaSparkContext sparkContext = jsc.sparkContext();
2.注意:
* 1、local的模拟线程数必须大于等于2 因为一条线程被receiver(接受数据的线程)占用,另外一个线程是job执行
* 2、Durations时间的设置,就是我们能接受的延迟度,这个我们需要根据集群的资源情况以及
监控每一个job的执行时间来调节出最佳时间。
* 3、 创建JavaStreamingContext有两种方式 (sparkconf、sparkcontext)
* 4、业务逻辑完成后,需要有一个output operator
* 5、JavaStreamingContext.start()straming框架启动之后是不能在次添加业务逻辑
* 6、JavaStreamingContext.stop()无参的stop方法会将sparkContext一同关闭,stop(false) ,默认为true,会一同关闭
* 7、JavaStreamingContext.stop()停止之后是不能在调用start
3.SparkStreaming 算子
Transformation类:
updateStateByKey:更新SparkSteaming程序启动以来所有的key的状态。
1).要设置checkpoint
2).多久往checkpoint中写一份数据
如果batchInterval小于10s,10s写一次,如果batchInterval大于10s,那么batchInterval写一次。
reduceByKeyAndWindow:
1).
window length:窗口长度
slide length:滑动间隔
2).普通:
i).代码:
JavaPairDStream<String, Integer> searchWordCountsDStream =
searchWordPairDStream.reduceByKeyAndWindow(new Function2<Integer, Integer, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;
}
}, Durations.seconds(15), Durations.seconds(5));
ii).不用设置checkpoint目录
3).优化:
i).代码:
JavaPairDStream<String, Integer> searchWordCountsDStream =
searchWordPairDStream.reduceByKeyAndWindow(new Function2<Integer, Integer, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;
}
},new Function2<Integer, Integer, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 - v2;
}
}, Durations.seconds(15), Durations.seconds(5));
ii).必须要设置checkpoint目录
transform:
1).transform 可以拿到DStream中的RDD,做DStream中RDD类型的转换
2).transform
算子内,拿到的RDD算子外,代码是在Driver端执行的,每个batchInterval执行一次,可以做到动态改变广播变量。
OutPutOperator类:
print:
foreachRDD:
1).拿到DStream中的RDD,对RDD要使用RDD的action类算子触发执行。
2).foreachRDD算子内,拿到的RDD的算子外的代码,是在Driver端执行的,可以做到动态改变广播变量。
saveAsTextFile:
saveAsHadoopFile:
saveAdObjectFile: