basedir 必须是绝对的:?/.ivy2/local

Joa*_*eto 11 ivy apache-spark pyspark jupyterhub

我在完全绝望的状态下写在这里......

我有 2 个用户:

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

线程“main”中的异常 java.lang.IllegalArgumentException: basedir must be absolute: ?/.ivy2/local at org.apache.ivy.util.Checks.checkAbsolute(Checks.java:48) at 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(火花提交。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)
Run Code Online (Sandbox Code Playgroud)

它以上述错误的最后一条指令中的错误结束(参见异常)。

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

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

请帮忙...我已经到了疯狂的地步...我已经搜索了互联网的每个角落,但我还没有找到解决这个问题/错误的任何方法:( stackoverflow 是我最后的手段 heeeeeeeeeelp

Key*_*r00 10

语境

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

问题出在哪里

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);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,如果ivy.home未设置,并且user.home也未设置,则会出现错误:

线程“main”中的异常 java.lang.IllegalArgumentException: basedir must be absolute: ?/.ivy2/local

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

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

spark-shell --conf spark.jars.ivy=/tmp/.ivy
Run Code Online (Sandbox Code Playgroud)

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

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

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")
Run Code Online (Sandbox Code Playgroud)

已开票

一张由 Spark-Community 开的


Roc*_*ang 5

我遇到过类似的问题。

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

class SparkSubmitArguments {
    ivyRepoPath = sparkProperties.get("spark.jars.ivy").orNull
}
Run Code Online (Sandbox Code Playgroud)

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

spark-shell --conf spark.jars.ivy=/tmp/.ivy
Run Code Online (Sandbox Code Playgroud)