java - 为依赖项引发 ClassNotFoundException

标签 java maven intellij-idea apache-spark

我在某个 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 命令行选项但没有成功。有人可以帮忙吗

最佳答案

以下是随命令可用的选项:-

  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-以相同的方式提交命令,无需更改:-

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

    ./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 文件的完整路径,然后使用与 #1 中使用的相同的 spark-submit 命令

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

有关更多信息,请参阅此处的 submitting the applcations

关于java - 为依赖项引发 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856591/

相关文章:

java - Akka Actors unstashAll() 与 Java 中的谓词

java - 使用 sshj 时为 "JCE cannot authenticate the provider BC"

java - 将 JMS 消息转换为 TextMessage 时出现问题

java - 在 Intellij Idea 13 中呈现为包的目录?

java - 菜单打开时覆盖后退按钮

java - 抽屉导航 : how to make the item direct you to a website. Android Studio

maven - 如何在不将执行附加到 maven 阶段的情况下调用 maven-antrun-plugin 目标?

maven - 如何在 Gradle 中使用不同的分类器下载多个依赖项?

java - 重新排列 IntelliJ 中的方法 : visibility first, 依赖项 2nd

java - 两个线程共享静态 boolean 字段,但第一个线程仍然不退出