第一个问题: 我有一个带有 hadoop 的 2 节点虚拟集群。 我有一个运行 Spark 作业的 jar 。 此 jar 接受作为 cli 参数:commands.txt 文件的路径,该文件告诉 jar 运行哪些命令。
我使用 spark-submit 运行作业,我注意到我的从节点没有运行,因为它找不到主节点本地的 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 submit 时工作正常
-master local[]
但是,在运行时
-master yarn
我找不到文件,没有抛出异常,但我就是找不到文件。它不存在,就好像它从未被写过一样。有没有办法将结果写入本地驱动程序机器上的文件?或者我应该只将结果写入 HDFS 吗?
谢谢。
最佳答案
问题 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 上还有一个持久化方法。
关于scala - Spark(Scala)从驱动程序写入(和读取)本地文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38122039/