使用其他文件在YARN群集上运行Spark作业

Ale*_*rev 9 hdfs hadoop-yarn apache-spark

我正在编写一个简单的spark应用程序,它使用一些输入RDD,通过管道将它发送到外部脚本,并将该脚本的输出写入文件.驱动程序代码如下所示:

val input = args(0)
val scriptPath = args(1)
val output = args(2)
val sc = getSparkContext
if (args.length == 4) {
  //Here I pass an additional argument which contains an absolute path to a script on my local machine, only for local testing
  sc.addFile(args(3))
}

sc.textFile(input).pipe(Seq("python2", SparkFiles.get(scriptPath))).saveAsTextFile(output)
Run Code Online (Sandbox Code Playgroud)

当我在我的本地机器上运行它时工作正常.但是当我通过提交给YARN集群时

spark-submit --master yarn --deploy-mode cluster --files /absolute/path/to/local/test.py --class somepackage.PythonLauncher path/to/driver.jar path/to/input/part-* test.py path/to/output` 
Run Code Online (Sandbox Code Playgroud)

它以一个例外而失败.

Lost task 1.0 in stage 0.0 (TID 1, rwds2.1dmp.ru): java.lang.Exception: Subprocess exited with status 2
Run Code Online (Sandbox Code Playgroud)

我尝试过管道命令的不同变体.例如,.pipe("cat")工作正常,行为符合预期,但.pipe(Seq("cat", scriptPath))也失败,错误代码1,因此似乎spark无法找出群集节点上脚本的路径.

有什么建议?

yjs*_*hen 7

我自己不使用python,但我发现一些线索可能对你有用(在Spark-1.3 SparkSubmitArguments的源代码中)

  • --py-files PY_FILES,逗号分隔的.zip,.egg或.py文件列表,放在Python应用程序的PYTHONPATH上.

  • --files FILES,逗号分隔的文件列表,放在每个执行程序的工作目录中.

  • --archives ARCHIVES,逗号分隔的档案列表将被提取到每个执行者的工作目录中.

而且,你的论据spark-submit应该遵循这种风格:

Usage: spark-submit [options] <app jar | python file> [app arguments]

  • 那不是我想要做的.我传递的文件--files参数成功上传到HDFS上的.sparkStaging目录.我想要的只是在我的作业通过SparkFiles.get()从每个集群节点在集群上运行时访问此文件. (2认同)