SparkStreaming算子分为两类:transformation算子和outputOperator算子
transformation算子:flatMap、count、mapToPair、map、countByValue、repartition、filter、join、union、Reduce、reduceByKey、updataStateByKey、Window、transform
outputOperator算子:print、foreachRDD、saveAsTextFile、saveAsHadoopFile、saveAsObjectFile
outputoperator类的算子
print:显示DStream结果
foreachRDD:可以遍历DStream中的RDD,对RDD使用RDD的算子去转换,一定要有RDD的action类算子触发RDD的transformation类算子执行
foreachRDD中除了RDD算子之内的代码在Executor中执行,其他在Driver端执行,可以在foreachRDD中动态改变广播变量的值,因为每隔batchInterval会执行foreachRDD中的代码一次
saveAsTextFile
saveAsHadoopFile
saveAsObjectFile
可以触发transformation类算子去执行,可以拿到SparkStreaming中的RDD进行处理
foreachRDD算子
注意:
1、foreachRDD是DStream中outputoperator类算子
2、foreachRDD可以遍历得到DStream中的RDD,可以在这个算子内对RDD使用RDD的Transformation类算子进行转换,但是一定要使用RDD的Action类算子触发执行
3、foreachRDD可以得到DStream中的RDD,在这个算子内,RDD算子外执行的代码是在Driver端执行的,RDD算子内的代码是在Driver端执行的
counts.foreachRDD(new VoidFunction<JavaPairRDD<String,Integer>>() {
private static final long serialVersionUID = 1L;
@Override
public void call(JavaPairRDD<String, Integer> arg0)
throws Exception {
System.out.println("*****************");
//转换为RDD,需要Action算子触发
JavaRDD<String> maprdd = arg0.map(new Function<Tuple2<String,Integer>, String>() {
private static final long serialVersionUID = 1L;
@Override
public String call(Tuple2<String, Integer> arg0)
throws Exception {
//这个里面在Executor端执行,外面在Driver端执行,包括上一层的call方法也是在Driver端执行
System.out.println("--------------");
return arg0._1+"---"+arg0._2;
}
});
maprdd.collect();
}
});
updateStateByKey算子
/**
* UpdateStateByKey的主要功能:
* 1、为Spark Streaming中每一个Key维护一份state状态,state类型可以是任意类型的, 可以是一个自定义的对象,那么更新函数也可以是自定义的。