如何在集群上保存文件

How to save a file on the cluster

我使用 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")

但是,其中 none 个有效。程序结束,我在 myDir 中找不到文本文件。你知道我该怎么做吗?

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

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

你有任何错误吗?也许您可以检查您是否对该文件夹中的 write/read 具有正确的权限。

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

如果您想在本地机器上写入,您可以使用 file:///home/myDir/text_file.txt 指定路径。如果你使用像/user/hdfs/...这样的路径默认写在HDFS

由于分布式计算,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() 是一种替代方法。这会将所有数据作为一个数组放到驱动程序机器上,然后可以将其保存为一个文件。

要有一个唯一的文件(不是你想要的名字),你需要 .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。

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

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