我有一个火花群,有2台机器说mach-1
和mach-2
。
我在我的本地编码,然后将其导出到JAR,并将其复制到mach-1
。
然后我使用mach-1
在spark-submit
上运行代码。
代码尝试读取mach-1
上存在的本地文件。
它大部分时间都运行良好,但有时它给了我File does not exist
之类的错误。所以,我然后将文件复制到mach-2
,现在代码可以正常工作。
类似地,在将文件写入本地时,有时它在输出文件夹仅在mach-1
上可用时有效,但随后它出错,我在mach-2
上创建了输出文件夹好。现在它在mach-1
和mach-2
中创建了输出(mach-1中的某些部分和mach-2中的某些部分)。
这是预期的行为吗?任何解释此文本的指针。
P.S:在写入本地文件之前,我没有collect
我的RDD(我在foreach
中这样做)。如果我这样做,代码适用于只在mach-1
上出现的输出文件夹。
答案 0 :(得分:2)
您的输入数据必须存在于每个节点。您可以使用NFS或HDFS将数据复制到节点来实现此目的。
对于输出,您可以写入NFS或HDFS。或者你调用collect(),但只在你的数据集确实适合驱动程序的内存时才这样做。当它不适合时,你应该调用rdd.toLocalIterator()或take(n)。
是否可以在群集模式下运行代码而不是在客户端模式下运行代码?