【问题标题】:spark ClassNotFoundException for a dependency引发依赖项的 ClassNotFoundException
【发布时间】:2016-04-23 17:37:02
【问题描述】:

我在一些spark 项目中添加了第三方jar。问题是intelliJ 可以干净地编译和运行代码。但是,当我使用

在集群中提交它时
./bin/spark-submit --master yarn --class myClass my.jar input output_files 

我明白了

java.lang.NoClassDefFoundError: gov/nih/nlm/nls/metamap/MetaMapApi
    at metamap.MetaProcess$2.call(MetaProcess.java:46)
    at metamap.MetaProcess$2.call(MetaProcess.java:28)
    at org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction$1.apply(JavaPairRDD.scala:1027)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$mapValues$1$$anonfun$apply$41$$anonfun$apply$42.apply(PairRDDFunctions.scala:700)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$mapValues$1$$anonfun$apply$41$$anonfun$apply$42.apply(PairRDDFunctions.scala:700)
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328)
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13$$anonfun$apply$6.apply$mcV$sp(PairRDDFunctions.scala:1109)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13$$anonfun$apply$6.apply(PairRDDFunctions.scala:1108)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13$$anonfun$apply$6.apply(PairRDDFunctions.scala:1108)
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1285)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13.apply(PairRDDFunctions.scala:1116)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13.apply(PairRDDFunctions.scala:1095)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:63)
    at org.apache.spark.scheduler.Task.run(Task.scala:70)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: gov.nih.nlm.nls.metamap.MetaMapApi
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

我尝试将指定setJarjar 的第三方库添加到SparkContext 实例,但没有成功。然后我将依赖项添加为 Maven 依赖项,但它也没有多大帮助。最后,我尝试指定--jars 命令行选项但没有成功。有人可以帮忙吗

【问题讨论】:

    标签: java maven intellij-idea apache-spark


    【解决方案1】:

    以下是与命令一起可用的选项:-

    1. 创建一个包含所有依赖项的单个 fat jar 文件,并将其与 spark-submit 命令一起使用,如下所示:-

      ./bin/spark-submit --class <MAIN-CLASS> --master yarn --deploy-mode cluster <PATH TO APP JAR FIlE>
      
    2. 将 jar 文件复制到 http://FTP://HDFS://,然后利用 SparkConf.setJars并指定完整路径,例如 - SparkConf.setJars(Array("http://mydir/one.jar")),最后以相同的方式使用 spark-submit 命令,无需更改:-

      ./bin/spark-submit --class <MAIN-CLASS> --master yarn --deploy-mode cluster <PATH TO APP JAR FILE>
      
    3. 将 jar 文件复制到 http://FTP://HDFS:// 然后使用 带有 --jars 选项的 spark-submit 命令:-

      ./bin/spark-submit --class <MAIN-CLASS> --jars <http://mydir/one.jar,http://mydir/two.jar> --master yarn --deploy-mode cluster <PATH TO APP JAR FILE>
      
    4. SPARK_HOME/spark-default.conf文件中指定变量spark.driver.extraClassPathspark.executor.extraClassPath,其值作为相关jar文件的完整路径,然后使用相同的spark-submit #1 中使用的命令

    根据用例,任何一个选项都可以工作。如果没有工作,那么您可能需要重新检查提供的对 spark-submit 命令的依赖项

    欲了解更多信息,请参阅此处submitting the applcations

    【讨论】:

    • 谢谢我添加了--jar 选项,但它不起作用
    • 您是否也可以尝试使用 fat jar 选项并使用 --jars 选项的更新命令来更新问题
    • 我创建了一个胖 jar,但我仍然遇到完全相同的问题
    • 我们是否同意将setJar设置为SparkContext时,我必须添加第三方库?
    • 我是spark 的新手,所以我使用spark-submit。我试过:./bin/spark-class org.apache.spark.deploy.yarn.Client --addJars /_MetaMapApi.jar --jar my.jar --class metamap.MetaProces --args arg1 arg2我有两个问题:首先,我得到Unknown/unsupported param List(arg1 arg2),如果我删除arg2,我得到Exception in thread "main" org.apache.spark.SparkException: Application application_1452690985153_0007 finished with failed status
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2018-03-26
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多