spark0.9.1 foreach println无法正常工作

时间:2014-07-02 08:32:12

标签: java apache-spark println

我使用spark-assembly_2.10-0.9.0-cdh5.0.2-hadoop2.3.0-cdh5.0.2.jar编写一个应用程序,如下所示:

JavaRDD<String> lines = sc.textFile(fdfileString);
    System.out.println("line: " + lines.count());
    JavaRDD<String> l2 = lines.map(new Function<String, String>() {

        @Override
        public String call(String arg0) throws Exception {
            System.out.println(arg0);
            TestUsable.count++;
            return arg0;
        }

    });
    System.out.println("finished");
    System.out.println(TestUsable.count);

运行命令使用java:java -classpath $ {spark_lib} 它有效,但不输出内容:

line: 84498
finished
0

任何人都可以帮助我。谢谢

1 个答案:

答案 0 :(得分:3)

看起来你并不真正理解分布式函数式编程的工作方式。你不能改变静态变量!这就是你的计数为0的原因。你不能在RDD上的地图操作中运行printlns - 它们会将值打印到数据碰巧所在的任何节点上的日志中。

接下来,看起来你理解Spark的错误执行范例 - Spark除非需要,否则不会执行代码。在您的情况下,它不需要执行地图,因为您没有要求它对结果做任何事情。您需要调用操作:http://spark.apache.org/docs/latest/programming-guide.html#actions

我认为您要使用foreach操作。

另一点是你将最终迭代数据两次(一次计数,一次在本地节点上打印),所以你可能只想toArray它并在本地处理它(这有点使用火花毫无意义)。你想对你的数据做什么?如果你更具体,那么我可以解释更多关于如何以分布式FP方式做到这一点。

还强烈建议你做Scala,当程序开始变得复杂时,它在Java中极其冗长。在Scala中,做你想做的就是:

lines = sc.textFile(fdfileString)
println("lines count = " + lines)
lines.foreach(println)
println("finished")