'collect'操作不在Spark独立应用程序的驱动程序窗口中显示结果

时间:2015-07-25 23:50:10

标签: apache-spark rdd

我在本地系统上使用Spark 1.4.0。每当我创建一个RDD并通过Spark的Scala shell调用它时,它工作正常。但是当我创建一个独立的应用程序并在RDD上调用'collect'操作时,我没有看到结果,尽管运行期间的Spark消息说已经为驱动程序设置了一定数量的字节: -

INFO Executor: Finished task 0.0 in stage 0.0 (TID 0). 1991 bytes result sent to driver
INFO Executor: Finished task 1.0 in stage 0.0 (TID 1). 1948 bytes result sent to driver

这是代码: -

object Test
{   def main(args:Array[String]) 
    {
        val conf = new SparkConf()      
        val sc = new SparkContext(conf)
        val rdd1 = sc.textFile("input.txt")
        val rdd2 = rdd1.map(_.split(",")).map(x=>( (x(0),x(1)) ))
        rdd2.collect
    }   

}

如果我将最后一个语句更改为以下语句,它会显示结果: -

rdd2.collect.foreach(println)

所以问题是,为什么只调用'collect'不打印任何内容?

1 个答案:

答案 0 :(得分:2)

collect本身在控制台应用程序上不会显示任何内容,因为它只是返回数据。正如您使用foreach(println)一样,您必须做一些事情才能显示它。或者,通常使用它,例如将其保存到磁盘。

现在,如果您要在spark-shell(减去SparkContext创建)中运行该代码,那么您确实会看到输出*,因为shell始终调用对象的toString返回。

*注意toStringforeach(println)不同,因为shell会在某个时刻截断