在spark local模式下从内部工作者写入文件不会写入?

时间:2017-03-05 23:29:28

标签: apache-spark pyspark

对于在纱线集群中运行之前在pyspark中的应用程序开发,我想在本地模式下测试它。为此,我需要从工作节点内部明确地写一些数据,我想我可以使用hadoop rest api来实现在集群模式下运行时将文件写入hdfs。但是在本地模式下运行代码时,如何从工作任务中写入文件?

例如: -

 sparkConf = SparkConf().setAppName("testing").setMaster("local[*]")
 sc= SparkContext(conf=sparkConf)

 rdd = sc.textFile("file://path to file")
 rdd.map(lambda x:x.split("\t")[0],1).reduce(func_to_reduce);

 def func_to_reduce(a,b):
    //how can i write value of a and b to a file from here
    return a+b;

为了澄清:如果我使用驱动程序端代码中的open()方法写入文件,它会起作用,但如果我使用相同的东西从reduce函数内部写入文件,则不行。任何方向或帮助都非常感谢!!

3 个答案:

答案 0 :(得分:0)

您必须实际调用save方法,就像通过textFile调用加载方法一样。像saveAsTextFile(path)

这样的东西

答案 1 :(得分:0)

请参阅rdd.reduce(f) soucre代码

Spark在使用reduce时调用python内置函数rdd.reduce()两次:一个在工作节点中通过rdd.mapPartitions(),另一个在驱动程序节点中rdd.collect()之后。

因此您无法在rdd.reduce函数

中写入数据

您似乎想在工作节点的本地路径上保存数据吗?

答案 2 :(得分:0)

好吧,我发布这个问题的原因是使用os模块创建目录,并且写入文件的open()方法不能在reduceByKey()函数内部工作。当我在本地模式下运行时,我认为应该可以访问我的驱动程序的本地路径并执行这些功能,就好像我运行的是普通的python脚本一样。之所以不是因为我完全忘记了reduceByKey更像是转换而不是动作的事实,因为reduceByKey()中的代码实际上并没有按照Spark的懒惰评估设计运行。因此,我使用collect()调用了对该引用的操作。现在它启动了reduce功能,并且正在编写文件。谢谢你的帮助!!!!