Spark:读取本地文件,文件应该存在于所有节点上?

时间:2016-10-31 14:31:51

标签: java apache-spark rdd

我有一个火花群,有2台机器说mach-1mach-2。 我在我的本地编码,然后将其导出到JAR,并将其复制到mach-1。 然后我使用mach-1spark-submit上运行代码。

代码尝试读取mach-1上存在的本地文件。 它大部分时间都运行良好,但有时它给了我File does not exist之类的错误。所以,我然后将文件复制到mach-2,现在代码可以正常工作。

类似地,在将文件写入本地时,有时它在输出文件夹仅在mach-1上可用时有效,但随后它出错,我在mach-2上创建了输出文件夹好。现在它在mach-1mach-2中创建了输出(mach-1中的某些部分和mach-2中的某些部分)。

这是预期的行为吗?任何解释此文本的指针。

P.S:在写入本地文件之前,我没有collect我的RDD(我在foreach中这样做)。如果我这样做,代码适用于只在mach-1上出现的输出文件夹。

1 个答案:

答案 0 :(得分:2)

您的输入数据必须存在于每个节点。您可以使用NFS或HDFS将数据复制到节点来实现此目的。

对于输出,您可以写入NFS或HDFS。或者你调用collect(),但只在你的数据集确实适合驱动程序的内存时才这样做。当它不适合时,你应该调用rdd.toLocalIterator()或take(n)。

是否可以在群集模式下运行代码而不是在客户端模式下运行代码?