我有一个需要存储上次运行到文本文件的spark作业。 这既适用于HDFS,也适用于本地fs(用于测试)。
然而,看起来这似乎并不像看起来那么直接。
我一直在尝试删除目录并获取“无法删除”错误消息。 试图将一个简单的刺痛值存储到数据框中,然后再回到原地。
这一切都令人费解,以至于让我退后一步。
通过覆盖字符串将字符串(在我的情况下最后执行的时间戳)存储到文件中的最佳方法是什么?
修改
我现在使用它的讨厌方式如下:
sqlc.read.parquet(lastExecution).map(t => "" + t(0)).collect()(0)
和
sc.parallelize(List(lastExecution)).repartition(1).toDF().write.mode(SaveMode.Overwrite).save(tsDir)
答案 0 :(得分:0)
这听起来像存储简单的应用程序/执行元数据。因此,保存文本文件不需要由“Spark”完成(即,不应该在分布式火花作业中,由工作人员完成)。
您可以将驱动程序代码放在驱动程序代码中,通常是在构建RDD之后。话虽这么说,你不会使用Spark API来做这件事,你宁愿做一些像使用编写器或文件输出流一样简单的事情。这里唯一的问题是你将如何阅读它。假设您的驱动程序在同一台计算机上运行,应该没有问题。
如果工作人员在将来的工作中读取此值(这可能是您希望在hdfs中使用的原因),并且您不想直接使用Hadoop API,那么您必须确保只有一个分区,这样你就不会得到多个具有普通值的文件。但是,这不能说是本地存储(它存储在执行任务的工作人员正在运行的机器上),管理它只会过度。
我最好的选择是使用驱动程序并在运行驱动程序的机器上创建文件(假设它与下次使用的相同),或者更好的是将它放在数据库中。如果作业中需要此值,则驱动程序可以简单地通过它。