标签: scala apache-spark
因此,我在Spark上的每个map任务中都运行了以下类型的代码。
@volatile var res = (someProgram + fileName) ! var cmdRes = ("rm " + fileName) !;
每个地图任务的文件名都是唯一的。基本思想是第一个命令完成后,第二个命令删除文件。但是,我注意到该程序有时会抱怨该文件不存在。似乎子进程调用不是同步的,也就是说,它不等待子进程完成。那是对的吗。如果确实如此,我们如何纠正?
答案 0 :(得分:2)
正如您在docs中看到的那样,!方法会一直阻止,直到退出。文档说它:
!
启动此构建器表示的进程,阻塞直到它退出,并返回退出代码。
您应该检查退出代码以解释结果并处理特殊情况。
通过连接创建流程命令时,通常最好使用Seq扩展名(而不是String扩展名)来创建ProcessBuilder。 docs甚至包括这个帮助器,它可能会帮助你:
Seq
String
ProcessBuilder
// This uses ! to get the exit code def fileExists(name: String) = Seq("test", "-f", name).! == 0