如何在群集上保存文件

时间:2017-12-15 09:01:50

标签: python apache-spark pyspark hdfs spark-submit

我使用ssh连接到群集,然后使用

将程序发送到群集
spark-submit --master yarn myProgram.py

我想将结果保存在文本文件中,我尝试使用以下行:

counts.write.json("hdfs://home/myDir/text_file.txt")
counts.write.csv("hdfs://home/myDir/text_file.csv")

但是,它们都不起作用。程序结束,我在myDir中找不到该文本文件。你知道我怎么能这样做吗?

另外,有没有办法直接写入我的本地机器?

编辑:我发现home目录不存在,所以现在我将结果保存为: counts.write.json("hdfs:///user/username/text_file.txt") 但是这会创建一个名为text_file.txt的目录,而且里面有很多文件,里面有部分结果。但是我想要一个包含最终结果的文件。我有什么想法可以做到这一点吗?

4 个答案:

答案 0 :(得分:6)

Spark will save the results in multiple files since the computation is distributed. Therefore writing:

counts.write.csv("hdfs://home/myDir/text_file.csv")

means to save the data on each partition as a separate file in the folder text_file.csv. If you want the data saved as a single file, use coalesce(1) first:

counts.coalesce(1).write.csv("hdfs://home/myDir/text_file.csv")

This will put all the data into a single partition and the number of saved files will thus be 1. However, this could be a bad idea if you have a lot of data. If the data is very small then using collect() is an alternative. This will put all data onto the driver machine as an array, which can then be saved as a single file.

答案 1 :(得分:2)

您可以从命令行将结果连接到一个文件中:

hadoop fs -cat hdfs:///user/username/text_file.txt/* > path/to/local/file.txt

这应该比使用coalesce更快 - 根据我的经验,所有collect()类型操作都很慢,因为所有数据都通过主节点汇集。此外,如果您的数据超出主节点上的内存,则可能会遇到collect()的问题。

然而,这种方法的潜在缺陷是您必须显式删除先前运行的文件(因为当前运行可能不会产生完全相同数量的文件)。每次运行都可能有一个标志,但我不确定。

删除:

hadoop fs -rm -r hdfs:///user/username/text_file.txt/*

答案 2 :(得分:0)

你有任何错误吗?也许您可以检查您是否具有从该文件夹中写入/读取的正确权限。

另外认为Spark默认会创建一个名为text_file.txt的文件夹,里面有一些文件,具体取决于你拥有的分区数。

如果要在本地计算机上写入,可以使用file:///home/myDir/text_file.txt指定路径。如果您使用默认情况下/user/hdfs/...之类的路径在HDFS中写入

答案 3 :(得分:-1)

要拥有一个唯一的文件(不是您想要的名称),您需要.repartition(1)look here,通过管道传输到您的RDD。 我想你的hdfs路径是错误的。在Spark HDFS中,文本文件是默认的,在Hadoop中(默认情况下)根目录中没有主目录,除非您之前已创建它。 如果你想要一个csv / txt文件(带有这个扩展名),写它的唯一方法是没有RDD或DF函数,但是在使用.collect()收集后,使用python csv和io的常用库,你的RDD在martix中(数据集并不大)。

如果您想直接在文件系统上编写(而不是在HDFS上),请使用

counts.write.csv("file:///home/myDir/text_file.csv")

但是这不会写一个带有csv扩展名的文件。它将创建一个文件夹,其中包含数据集的n个分区的part-m-0000n。