spark streaming 里面在做 foreach 操作时要注意数据与节点与进程「jvm」之间的关系;「这一点往往大家比较容易混淆」
我总结了一下,供大家参考
dstream.foreachRDD { rdd => do something.....// 在driver内执行 rdd.foreach { recordsinworker => do something // 在worker上执行 「作用域是一个node」 } rdd.foreachPartition{ recordsintask => do someting // 在task上执行 「作用域是一个进程一个jvm」 }
}
所以如果你的spark streaming code 在 dstream.foreachrdd 里面直接处理业务数据就是把所有的数据都拉到driver端进行处理,
1:dirver的生命周期是伴随程序的,也就是说它会固定在某个节点运行
2: hdfs client 读写优先local
这样就会导致数据在当前节点肯定会有一份,从而导致数据分散不开。