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

标签 scala hadoop apache-spark hdfs

第一个问题: 我有一个带有 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/

相关文章:

parsing - 通用匹配Token的有效实现

scala - 即使在使用类型投影后为 Either 声明 Functor 时出现编译错误

postgresql - 如何为 Postgres DB 配置 Slick 3.0.0(使用或不使用 Hikari)Typesafe Play conf

ubuntu - java.io.IOException : All directories in dfs. datanode.data.dir 无效

Hadoop FileSystem.getFS() 暂停约 2 分钟

apache - 在 apache hadoop 中读取或复制到 hdfs 时出现校验和异常

python - Spark python 如何使用特殊标记对 RDD 项进行分组?

python - Pyspark 使用 AWS Glue 将 JSON 列写入 Postgres

scala - 将过滤器作为参数传递给 Dataframe.filter 函数

scala - 定义案例类的好地方?