【问题标题】:basedir must be absolute: ?/.ivy2/localbasedir 必须是绝对的:?/.ivy2/local
【发布时间】:2018-11-24 11:12:21
【问题描述】:

我在绝望中写到这里……

我有 2 个用户:

  • 1 个本地用户,在 Linux 中创建。工作 100% 正常,字数完美。 Kerberized 集群。有效票。
  • 1 Active Directory 用户,可以登录,但 pyspark 指令(相同字数)失败。与上述相同的 kdc 票。

线程“main”中的异常 java.lang.IllegalArgumentException: basedir 必须是绝对的:?/.ivy2/local 在 org.apache.ivy.util.Checks.checkAbsolute(Checks.java:48) 在 org.apache.ivy.plugins.repository.file.FileRepository.setBaseDir(FileRepository.java:135) 在 org.apache.ivy.plugins.repository.file.FileRepository.(FileRepository.java:44) 在 org.apache.spark.deploy.SparkSubmitUtils$.createRepoResolvers(SparkSubmit.scala:943) 在 org.apache.spark.deploy.SparkSubmitUtils$.buildIvySettings(SparkSubmit.scala:1035) 在 org.apache.spark.deploy.SparkSubmit$$anonfun$2.apply(SparkSubmit.scala:295) 在 org.apache.spark.deploy.SparkSubmit$$anonfun$2.apply(SparkSubmit.scala:295) 在 scala.Option.getOrElse(Option.scala:121) 在 org.apache.spark.deploy.SparkSubmit$.prepareSubmitEnvironment(SparkSubmit.scala:294) 在 org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:153) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我正在运行的代码。超级简单。

import findspark
findspark.init()
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("yarn")
sc = SparkContext(conf=conf)

它在最后一条指令中以错误结束,出现上述错误(见异常)。

?/.ivy2/local -> 这是问题所在,但我不知道发生了什么:(。

对于 Linux 用户,它可以完美运行...但是对于本地系统中不存在但具有 /home/userFolder 的 AD 用户...我有这个问题 :(

请帮助...我已经到了精神错乱的地步...我在互联网的每个角落都用谷歌搜索了,但我没有找到任何解决这个问题/错误的方法:(stackoverflow 是我最后的选择 heeeeeeeeeelp

【问题讨论】:

  • 这里有同样的问题,但在我的情况下,这是因为我使用的是 openshift,它为每个部署创建一个唯一的用户 ID。看起来 ivy 无法通过系统调用检索用户的详细信息。
  • @CarlF.:你解决了 OpenShift 的问题了吗?我们有同样的问题。
  • @KeyMaker00 是的。这有点麻烦,但解决方案是使 docker 映像中的 /etc/passwd 文件可由组 root 写入,然后在容器启动时为随机分配的用户添加一个条目。本指南很有帮助。 docs.openshift.com/container-platform/3.11/creating_images/…

标签: apache-spark pyspark ivy jupyterhub


【解决方案1】:

上下文

Ivy 需要一个名为.ivy2 的目录,通常位于主目录中。您还可以通过在 Spark 启动或执行 spark-submit 时提供配置属性来配置 .ivy2 的位置。

问题出在哪里

IvySettings.java(ant-ivy 2.2.0 版本的第 796 行)中有这一行:

if (getVariable("ivy.home") != null) {
   setDefaultIvyUserDir(Checks.checkAbsolute(getVariable("ivy.home"), "ivy.home"));
   Message.verbose("using ivy.default.ivy.user.dir variable for default ivy user dir: " + defaultUserDir);
} else {
   setDefaultIvyUserDir(new File(System.getProperty("user.home"), ".ivy2"));
   Message.verbose("no default ivy user dir defined: set to " + defaultUserDir);
}

如你所见,如果ivy.home没有设置,user.home也没有设置,那么你会得到错误:

线程“main”java.lang.IllegalArgumentException 中的异常:basedir 必须是绝对的:?/.ivy2/local

解决方案 1(spark-shell 或 spark-submit)

正如Rocke Yang 所提到的,您可以通过设置配置属性 spark.jars.ivy 来启动 spark-shell 或 spark-submit。示例:

spark-shell --conf spark.jars.ivy=/tmp/.ivy

解决方案 2(spark-launcher 或 yarn-client)

第二种解决方案是在以编程方式调用提交方法时设置配置属性:

sparkLauncher.setSparkHome("/path/to/SPARK_HOME")
  .setAppResource("/path/to/jar/to/be/executed")
  .setMainClass("MainClassName")
  .setMaster("MasterType like yarn or local")
  .setDeployMode("set deploy mode like cluster")
  .setConf("spark.executor.cores","2")
  .setConf("spark.jars.ivy","/tmp/.ivy")

票已打开

Spark-Community 打开了一个ticket

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。

    SparkSubmit 将直接寻找 ivy home。如果没有找到会报错。并且名称在途中略有变化。

    class SparkSubmitArguments {
        ivyRepoPath = sparkProperties.get("spark.jars.ivy").orNull
    }
    

    我们可以这样传递ivy.home目录

    spark-shell --conf spark.jars.ivy=/tmp/.ivy
    

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2013-09-24
      • 2022-12-15
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多