第一个问题: 我有一个带有hadoop的2节点虚拟集群。 我有一个运行火花工作的罐子。 这个jar接受一个cli参数:一个commands.txt文件的路径,它告诉jar运行哪些命令。
我使用spark-submit运行这个工作,我注意到我的从属节点没有运行,因为它无法找到master.lxt本地的commands.txt文件。
这是我用来运行它的命令:
./spark-1.6.1-bin-hadoop2.6/bin/spark-submit --class
univ.bigdata.course.MainRunner --master yarn\
--deploy-mode cluster --executor-memory 1g \
--num-executors 4 \
final-project-1.0-SNAPSHOT.jar commands commands.txt
我是否需要将commands.txt上传到hdfs并改为提供hdfs路径,如下所示? :
hdfs://master:9000/user/vagrant/commands.txt
第二个问题: 如何在cwd中写入驱动程序机器上的文件? 我使用普通的scala文件写入器将输出写入queries_out.txt,使用spark提交时它工作正常
-master local[]
但是,在
中运行时 -master yarn
我无法找到该文件,没有抛出异常,但我无法找到该文件。它不会像从未写过一样存在。有没有办法将结果写入驱动程序计算机上的文件?或者我应该只将结果写入HDFS?
感谢。
答案 0 :(得分:3)
问题1 :是的,将其上传到hdfs或任何网络可访问文件系统是您解决问题的方法。
问题2 :
这有点棘手。假设您的结果在RDD中,您可以调用collect(),它将聚合驱动程序进程上的所有数据。然后,您手中有一个标准集合,您可以简单地在磁盘上写入。请注意,您应该为驱动程序的进程提供足够的内存,以便能够将所有结果保存在内存中,不要忘记同时增加最大结果大小。参数是:
- 驱动程序内存16G --conf“spark.driver.maxResultSize = 15g”
这在通信复杂性和内存中都具有绝对差的缩放行为(两者都在结果RDD的大小中)。这是最简单的方法,对于玩具项目或数据集总是很小时都非常好。在所有其他情况下,它肯定会在某些时候爆炸。
正如您可能已经提到的,更好的方法是使用内置的“saveAs”方法来写入hdfs(或其他存储格式)。您可以查看相关文档:http://spark.apache.org/docs/latest/programming-guide.html#actions
请注意,如果您只想保留RDD,因为您在多个计算中重复使用它(比如缓存,但不是将其保存在内存中,而是将其保存在磁盘中),RDD上还有一个持久化方法。
答案 1 :(得分:0)
解决方案非常简单,我将--deploy-mode cluster更改为--deploy-mode客户端,然后在我运行驱动程序的机器上正确完成了文件写入。
答案 2 :(得分:0)
回答问题1: 使用--files标记提交spark作业,然后使用本地文件的路径将文件从驱动程序节点下载到所有工作节点的cwd,从而仅使用其名称进行访问。