在foreachRDD中执行rdd.count()会将结果返回给Driver或Executor吗?

时间:2017-07-10 21:05:45

标签: apache-spark spark-streaming

对于下面的代码,.count()是将值返回给驱动程序还是只返回执行程序?

JavaPairDStream<String, String> dstream ...  
stream.foreachRDD(rdd -> {
        long count = rdd.count();
        // some code to save count to Datastore
});

我知道通常count()会将值返回给驱动程序,但我不确定当它在foreacRDD中时会发生什么?

对于将来的其他相关问题,是否有一种简单的方法可以验证代码块是否在驱动程序或执行程序上执行?

1 个答案:

答案 0 :(得分:1)

允许访问RDD的操作(例如transform(rdd => ...)foreachRDD(rdd => ...)在驱动程序的上下文中执行。令人困惑的思维扭曲是RDD上的操作将在集群中的执行程序上执行。

例如:

stream.foreachRDD(rdd -> {
    long count = rdd.count(); // the count is executed on the cluster, the result it brought back to the driver, like in core Spark
    RDD<> richer = rdd.map(elem => something(elem)) // executes distributed
    db.store(richer.top(10)) // executes in the driver

});