Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark ExecutorPlugin:插件类捆绑在应用程序JAR中,在executor上找不到类 总结_Apache Spark - Fatal编程技术网

Apache spark ExecutorPlugin:插件类捆绑在应用程序JAR中,在executor上找不到类 总结

Apache spark ExecutorPlugin:插件类捆绑在应用程序JAR中,在executor上找不到类 总结,apache-spark,Apache Spark,我试着创造一个新的世界。我在我的应用程序JAR中实现了我的插件类,并将spark.executor.plugins设置为我的插件类的名称。但是,这不起作用,执行器无法启动,因为它们找不到插件类ClassNotFoundException。我让它工作的唯一方法是将我的应用程序JAR另外作为spark.executor.extraClassPath传递。为什么会这样?我希望appjar中的类对执行者可见。我更希望能够将插件捆绑在我的应用程序JAR中,以避免使用spark.executor.extra

我试着创造一个新的世界。我在我的应用程序JAR中实现了我的插件类,并将spark.executor.plugins设置为我的插件类的名称。但是,这不起作用,执行器无法启动,因为它们找不到插件类ClassNotFoundException。我让它工作的唯一方法是将我的应用程序JAR另外作为spark.executor.extraClassPath传递。为什么会这样?我希望appjar中的类对执行者可见。我更希望能够将插件捆绑在我的应用程序JAR中,以避免使用spark.executor.extraClassPath。谢谢

细节 这是一个非常简单的错误再现。插件类:

$ jar tf spark-word-count.jar | grep SimplePlugin
spark_word_count/SimplePlugin.class
spark_word_count/SimplePlugin.java
包装火花字计数; 公共类SimplePlugin实现org.apache.spark.ExecutorPlugin{ @凌驾 公共无效初始{ 系统输出打印你好!; } @凌驾 公共空间关闭{ 系统输出打印再见!; } } 我编译了我的应用程序的uberjar,spark-word-count.jar,并使用spark提交脚本提交:

火花提交\ -jars文件:/mnt/jars/spark-word-count.jar\ -部署模式群集\ -主人spark://master:7077 \ -conf spark.executor.plugins=spark\u word\u count.SimplePlugin\ 文件:/mnt/jars/spark-word-count.jar\ 文件:/data/hamlet.txt Spark日志中的错误 司机

19/10/28 19:29:35 ERROR [org.apache.spark.scheduler.TaskSchedulerImpl] Lost executor 0 on 10.128.99.2: Unable to create executor due to spark_word_count.SimplePlugin
19/10/28 19:29:35 WARN [org.apache.spark.scheduler.TaskSetManager] Lost task 0.0 in stage 0.0 (TID 0, 10.128.99.2, executor 0): ExecutorLostFailure (executor 0 exited caused by one of the running tasks) Reason: Unable to create executor due to spark_word_count.SimplePlugin
执行器日志

19/10/28 19:29:42 ERROR [org.apache.spark.executor.CoarseGrainedExecutorBackend] Executor self-exiting due to : Unable to create executor due to spark_word_count.SimplePlugin
java.lang.ClassNotFoundException: spark_word_count.SimplePlugin
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.spark.util.Utils$.classForName(Utils.scala:238)
    at org.apache.spark.util.Utils$.$anonfun$loadExtensions$1(Utils.scala:2682)
    at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:244)
    at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)
    at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)
    at scala.collection.TraversableLike.flatMap(TraversableLike.scala:244)
    at scala.collection.TraversableLike.flatMap$(TraversableLike.scala:241)
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:108)
    at org.apache.spark.util.Utils$.loadExtensions(Utils.scala:2680)
    at org.apache.spark.executor.Executor.$anonfun$executorPlugins$2(Executor.scala:148)
    at org.apache.spark.util.Utils$.withContextClassLoader(Utils.scala:249)
    at org.apache.spark.executor.Executor.<init>(Executor.scala:147)
    at org.apache.spark.executor.CoarseGrainedExecutorBackend$$anonfun$receive$1.applyOrElse(CoarseGrainedExecutorBackend.scala:83)
    at org.apache.spark.rpc.netty.Inbox.$anonfun$process$1(Inbox.scala:117)
    at org.apache.spark.rpc.netty.Inbox.safelyCall(Inbox.scala:205)
    at org.apache.spark.rpc.netty.Inbox.process(Inbox.scala:102)
    at org.apache.spark.rpc.netty.Dispatcher$MessageLoop.run(Dispatcher.scala:221)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我联系了一位开发Spark插件的开发人员,得到了这个有用的答案。为子孙后代在此自我回答:

嗨, 说得好。我相信对executor插件使用-jar只对测试过的纱线有效。它也不适用于测试过的K8S。另请参阅与最近为Spark 3.0扩展插件功能的工作相关的对此问题的评论:


我深入研究了Spark Executor类的代码。用户的应用程序JAR仅在启动第一个任务时通过调用此updateDependencies方法加载:而插件在构造executor时解析。

请添加您的代码和错误。@SarathChandraVema我添加了更多详细信息,谢谢。