Spark (Scala) 从驱动程序写入(和读取)本地文件系统

2023-12-20

第一个问题:我有一个带有 hadoop 的 2 节点虚拟集群。 我有一个运行 Spark 作业的罐子。 该 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 文件编写器将输出写入 requests_out.txt,并且在使用 Spark Submit 时工作正常

 -master local[]

但是,当跑进去

 -master yarn

我找不到该文件,没有抛出异常,但我只是找不到该文件。它不存在,就好像它从未被写过一样。有没有办法将结果写入本地驱动程序计算机上的文件?或者我应该只将结果写入 HDFS ?

Thanks.


问题1:是的,将其上传到 hdfs 或任何网络可访问的文件系统就是解决问题的方法。

问题2:

这有点棘手。假设您的结果位于 RDD 中,您可以调用collect(),它将聚合驱动程序进程上的所有数据。然后,您手中就有了一个标准集合,您可以将其简单地写入磁盘上。请注意,您应该为驱动程序的进程提供足够的内存以能够容纳all结果在内存中,不要忘记还增加最大结果大小。参数为:

--驱动内存16G --conf“spark.driver.maxResultSize=15g”

这在通信复杂性和内存(结果 RDD 的大小)方面都具有绝对较差的扩展行为。这是最简单的方法,对于玩具项目或数据集总是很小的情况来说非常适合。在所有其他情况下,它肯定会在某个时候爆炸。

正如您可能已经提到的,更好的方法是使用内置的“saveAs”方法写入,即 hdfs(或其他存储格式)。您可以检查文档:http://spark.apache.org/docs/latest/programming-guide.html#actions http://spark.apache.org/docs/latest/programming-guide.html#actions

请注意,如果您只想持久化 RDD,因为您在多个计算中重用它(例如缓存,但不是将其保存在内存中,而是将其保存在磁盘中),RDD 上还有一个持久化方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark (Scala) 从驱动程序写入(和读取)本地文件系统 的相关文章

随机推荐