【问题标题】:Passing files to application jar in spark in yarn cluster mode在纱线集群模式下将文件传递到火花中的应用程序jar
【发布时间】:2016-01-08 18:20:19
【问题描述】:

我使用以下命令以 yarn-cluster 模式部署我的 spark 应用程序

spark-submit --master yarn --deploy-mode cluster --class com.rocai.controller.Controller --jars <absolute-path-to-ojdbc6.jar> --driver-memory 1g --executor-memory 1g --num-executors 2 --executor-cores 2 <absolute-path-to-app.jar> <absolute-path-to-controller.xml>

controller.xml 是 app.jar 的参数。我总是以 controller.xml 文件的文件未找到异常结束。我什至尝试使用 --files 标签传递 controller.xml 文件,就像这样

spark-submit --master yarn --deploy-mode cluster --class com.rocai.controller.Controller --jars <absolute-path-to-ojdbc6.jar> --driver-memory 1g --executor-memory 1g --num-executors 2 --executor-cores 2 <absolute-path-to-app.jar> <absolute-path-to-controller.xml> --files <absolute-path-to-controller.xml>

这可能是因为 controller.xml 文件没有上传到应用程序容器。据我了解,yarn-cluster 模式下的驱动程序进程将在集群中的任意节点启动。查看日志,我看到 app.jar、ojdbc6.jar、hadoop_conf.zip 和 spark-assembly.jars 正在上传到容器中。如何确保 controller.xml 文件也被上传到 yarn 容器?

我可能在这里误解了一些东西,所以非常感谢任何帮助。

谢谢

【问题讨论】:

  • 作为一种可能的 WA,您可以将 .xml 文件打包为 jar,并通过资源位置引用它。
  • 这将涉及每次我有一个新的控制器文件时重建 app.jar,这对我来说是不可行的。 Yarn-client 模式工作得非常好。我想知道这是否是 yarn-cluster 模式下 spark-submit 不可用的功能。
  • 无需重建。您可以将它作为另一个 jar 添加到类路径中。

标签: apache-spark


【解决方案1】:

根据 Spark documentation,您的应用程序可以在本地打开文件,前提是每个节点都有文件的副本并且在相同的绝对路径中。

至于提交申请的时候上传文件,我觉得你提交的时候要在jar之前传递--files参数,所以是这样的:

spark-submit \
--master yarn \
--deploy-mode cluster \
--class com.rocai.controller.Controller \
--jars <absolute-path-to-ojdbc6.jar> \
--driver-memory 1g \
--executor-memory 1g \
--num-executors 2 \
--executor-cores 2 \
--files <absolute-path-to-controller.xml> \
<absolute-path-to-app.jar> <absolute-path-to-controller.xml> 

但是,当您的控制器 xml 被上传时,它将被上传到 HDFS 上的 ../.sparkStaging/applicationId/... 文件夹中。换句话说,您作为参数传递给 jar 的绝对路径不再有效,即使文件已被上传。您必须以编程方式获取上传路径。我相信您可以为此使用SparkFiles 类,尽管我自己没有使用过。

另一种解决方法是将控制器 xml 手动上传到 HDFS 上的固定路径。

【讨论】:

  • 感谢您指出必须如何将参数传递给 spark-submit 的顺序!我已经在使用 --files 参数,但是在传递了我的 app.jar 参数之后。所需文件现在正在上传到 yarn 应用程序容器。不过,我没有将 controller.xml 文件的绝对路径传递给应用程序 jar,而只是传递名称。 SparkContext 选择所需的文件,因为所有资源都在与应用程序 jar 相同的容器中可用。
  • 很高兴为您提供帮助。前段时间我也遇到了这个问题。就我而言,Spark 无法找到我的 Hive 元存储,问题是我通过 --files 参数传递了 hive-site.xml,但在 jar 之后。
【解决方案2】:

仅供参考,下面是我用来执行spark作业的命令

spark-submit \
--class com.rocai.controller.Controller \ 
--master yarn \
--deploy-mode cluster \
--jars /usr/hdp/current/spark-client/ojdbc6.jar,\
/usr/hdp/current/spark-client/lib/datanucleus-api-jdo-3.2.6.jar,\
/usr/hdp/current/spark-client/lib/datanucleus-core-3.2.10.jar,\
/usr/hdp/current/spark-client/lib/datanucleus-rdbms-3.2.9.jar \
--files controller.xml,/usr/hdp/current/spark-client/conf/hive-site.xml \
--driver-memory 1g --executor-memory 1G --num-executors 2 --executor-cores 1 \
app.jar \
controller.xml

似乎有必要包含 datanucleus jar 和 hive-site.xml 以避免“找不到类”异常。还要确保逗号分隔值之间没有空格。

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2023-03-09
    • 1970-01-01
    • 2015-10-18
    • 2018-02-22
    相关资源
    最近更新 更多