1、直接用foreachRDD在这里面直接定义了对action操作,可以直接写对RDD处理的操作函数,如图:?2、从RDD的角度讲,操作DStream的print函数,其实是转过来操作foreachRDD的print:?在RDD中操作action不会产生新的RDD,DStream和它完全对应,在DStream中操作action不会产生新的DStream。?foreachDStream是transformation操作,在整个SparkStreaming的操作中,foreachDStream不一定会触发job的执行?,但会触发Job的产生。?Job产生由timer产生,根据业务逻辑代码产生,和foreachDStream没什么关系。?1、foreachDStream和Job的执行没有关系,不会触发Job执行。?2、有foreachDStream执行会产生Job是不对的,只根据框架来调度Job的执行。?foreachRDD的代码中对RDD的操作,如果没有action操作则不会执行action的操作。?foreachRDD是SparkStreaming的后门,直接对rdd的操作,背后封装成foreachRDD的操作。?总结:?在SparkStreaming的所有逻辑操作都是对DStream的操作,对DStream的操作其实就是对RDD的操作,DStream是RDD的模板。?后面的DStream对前面的DStream有依赖:?对map操作产生map的DStream:?基于DStream怎么产生rdd?通过batchInterval。研究DStream是怎么生成,看DStream的操作触发RDD的生成。?根据时间实例产生RDDs,和batchDuration对齐的,如:timer实例就是1秒,1秒生成一个RDD,?每个RDD对应一个Job,因为RDD就是DStream操作的时间间隔的最后一个RDD,后面的RDD对前面?的RDD有依赖关系,后面对前面有依赖可以推到出整个依赖链条。