【问题标题】:Running Spark jobs on a YARN cluster with additional files使用附加文件在 YARN 集群上运行 Spark 作业
【发布时间】:2015-07-14 21:06:24
【问题描述】:

我正在编写一个简单的 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)

当我在本地机器上运行它时,它运行良好。但是当我通过

将它提交到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` 

异常失败。

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

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

有什么建议吗?

【问题讨论】:

  • 这方面有什么更新吗?

标签: apache-spark hdfs hadoop-yarn


【解决方案1】:

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

  • --py-files PY_FILES要放置在 Python 应用程序的 PYTHONPATH 上的 .zip、.egg 或 .py 文件的逗号分隔列表。 p>

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

  • --archives ARCHIVES要提取到每个执行器工作目录的档案的逗号分隔列表。

另外,你对spark-submit 的论点应该遵循这种风格:

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

【讨论】:

  • 同意。我想说--files FILES 是他将文件发送给每个执行者的实际需要。
  • 这不是我想要做的。我使用 --files 参数传递的文件成功上传到 HDFS 上的 .sparkStaging 目录。我想要的只是在我的作业在集群上运行时通过 SparkFiles.get() 从每个集群节点访问这个文件。
  • @AlexanderTokarev 对此有何更新?我也在尝试,但失败了。
  • 我希望能够将我的 --files 发送到同一个工作目录中
  • 我发布了一个可能感兴趣的answer to a similar question on how to send multiple files。它以 Java 为中心,使用 --files 参数实现发送多个属性文件
【解决方案2】:

要理解为什么,你必须熟悉spark的三种运行模式的区别,例如。独立、纱线客户端、纱线集群。

与独立和 yarn-client 一样,驱动程序在本地计算机的当前位置运行,而工作程序在其他地方运行(独立可能是 $SPARK_HOME 下的另一个临时目录,yarn-client 可能是集群中的随机节点),因此您可以使用驱动程序中指定的本地路径访问本地文件,而不是在工作程序中。

但是,当您使用 yarn-cluster 模式运行时,您的驱动程序和工作程序都在随机集群节点上运行,本地文件与其工作机器和目录相关,因此会抛出文件未找到异常,您需要在提交时使用 --files 或 --archive 归档这些文件,或者在提交之前将它们归档在 .egg 或 .jar 中,或者在驱动程序中使用 addFile api,如 this

【讨论】:

    【解决方案3】:

    您可能想尝试使用 local://$SPARK_YARN_STAGING_DIR 环境变量。

    例如以下应该可以工作:

    spark-submit \
        --master yarn \
        --deploy-mode cluster \
        --files /absolute/path/to/local/test.py \
        --class somepackage.PythonLauncher \
        local://$SPARK_YARN_STAGING_DIR/test.py
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-25
      • 2015-08-20
      • 1970-01-01
      • 2017-04-16
      • 2016-07-20
      • 2019-05-30
      • 1970-01-01
      • 2015-12-05
      相关资源
      最近更新 更多