外部数据源
如果使用了基于receiver的数据源, 则receiver会占用一个进程来接受数据, 如果运行的环境上只有一个cpu核心, 那么SparkStreaming程序无法正常运行。
相关transformation算子
transform
将DStream中的rdd与其他rdd互操作。 例:wordcount中的黑名单, 黑名单上的单词不会被统计
val lines = ssc.socketTextStream("localhost", 23333)
val result = lines.flatMap(_.split(",")).map((_,1)).reduceByKey(_ + _)
val blackListRdd= sc.parallelize(Array("a", "b")).map((_, 1))
result.transform(rdd =>{
rdd.leftOuterJoin(blackListRdd).filter(x =>x._2._2.getOrElse(false) == false)
.map(x => (x._1, x._2._1))
}).print()
updateStateByKey
该算子可以统计从最开始到现在, 是有状态的,但是需要配置checkpoint, 会产生小文件问题。
不建议使用, 可以将每个时间段的统计插入数据库中, 再用聚合sql查询。
ssc.checkpoint(".")
val lines = ssc.socketTextStream("localhost", 23333)
val result = lines.flatMap(_.split(",")).map((_,1)).reduceByKey(_ + _)
def updateFunction(newValues: Seq[Int], runningCount: Option[Int]): Option[Int] = {
val newCount = newValues.sum
Some(newCount + runningCount.getOrElse(0))
}
result.updateStateByKey(updateFunction).print
相关action算子
foreachRDD
对DStream中的每个Rdd进行操作, 这是一个Driver操作。
在其中嵌套foreach/foreachPartition算子才是Executor操作。
须注意序列化问题。
详情参见我的另一篇博客
Spark中map、mapPartitions、foreach、foreachPartitions算子