如何在群集上保存文件

问题描述 投票:11回答:4

我使用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的目录,里面我有很多文件,里面有部分结果。但是我想要一个包含最终结果的文件。我有什么想法可以做到这一点?

python apache-spark pyspark hdfs spark-submit
4个回答
6
投票

由于计算是分布式的,Spark会将结果保存在多个文件中。因此写作:

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

意味着将每个分区上的数据保存为文件夹text_file.csv中的单独文件。如果您希望将数据保存为单个文件,请首先使用coalesce(1)

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

这会将所有数据放入一个分区,因此保存的文件数将为1.但是,如果您拥有大量数据,这可能是一个坏主意。如果数据非常小,那么使用collect()是另一种选择。这会将所有数据作为数组放入驱动程序计算机,然后可以将其保存为单个文件。


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/*

0
投票

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

还要认为Spark默认会创建一个名为text_file.txt的文件夹,其中包含一些文件,具体取决于您拥有的分区数。

如果要在本地计算机上编写,可以使用file:///home/myDir/text_file.txt指定路径。如果你使用像/user/hdfs/...这样的路径默认是在HDFS中写的


-1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.