我正在调用Scala的sys.process来从spark应用程序中执行AWS文件副本。
根据docs,Scala的sys.process.Process(cmd)返回的ProcessBuilder应该阻塞,直到代码在使用!
或!!
时完成
但是,当我执行下面的命令时,我看到AWS已收到命令的日志输出,然后SparkContext关闭,而副本没有完成。
这是main()
函数的最后三行。
val cmd = "aws s3 cp s3://bucket1/folder/ s3://bucket2/folder/ --recursive"
val aTemp = sys.process.Process(cmd)
val xCode = aTemp.!
我通常退出,我认为这可能是问题所在。但是,无论是否将此作为最后一行发生:
system.exit(0)
我觉得我错过了一些简单的东西,但我......好吧,我错过了它。 : - )
任何人都知道为什么在关闭Spark之前它没有等待命令完成?
问题发生在两个环境中,两个环境都运行在Amazon的EC2实例上。
使用Scala 2.10的Spark 1.6
使用Scala 2.11的Spark 2.0
潜在的tl; dr,
我确实在日志中看到我的aws命令已发送,但后来又发送了一秒 spark关闭:16/12/09 19:19:13 INFO amazonaws.request:收到了 成功回复:200,AWS Request ID:X 16/12/09 19:19:13 INFO spark.SparkContext:从shutdown hook调用stop()