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