Java ApacheStorm:ClassNotFoundException将jar部署到remoteCluster时
我正在尝试将我的拓扑捆绑为胖jar部署到远程集群。jar可以成功部署,但部署后,我在worker日志中看到以下错误:它说它找不到JpaRepository的类,如下所示 不过,我提交给集群的jar已经包含了这个类。我从集群中复制了jar并查看了它的内容,下面是我看到的内容 如果你们中有人知道为什么会失败,我会非常感激,因为我不知道如何继续下去。我已经在用类部署jar了,但它仍然显示classNotFound:(。在本地集群上一切都很好Java ApacheStorm:ClassNotFoundException将jar部署到remoteCluster时,java,classnotfoundexception,apache-storm,Java,Classnotfoundexception,Apache Storm,我正在尝试将我的拓扑捆绑为胖jar部署到远程集群。jar可以成功部署,但部署后,我在worker日志中看到以下错误:它说它找不到JpaRepository的类,如下所示 不过,我提交给集群的jar已经包含了这个类。我从集群中复制了jar并查看了它的内容,下面是我看到的内容 如果你们中有人知道为什么会失败,我会非常感激,因为我不知道如何继续下去。我已经在用类部署jar了,但它仍然显示classNotFound:(。在本地集群上一切都很好 还有一件事:-我上传的Jar是68MB(重一点)。这与此
还有一件事:-我上传的Jar是68MB(重一点)。这与此有关系吗???如果您通过Eclipse提交,您应该提交以下内容:
public static void main(String[] args) {
TopologyBuilder b = new TopologyBuilder();
// build your topology
b.setSpout(...);
b.setBolt(...);
Config c = new Config();
c.put(Config.NIMBUS_HOST, "130.211.244.139");
// not sure you you use 6627; 6123 is default port; if you change the port, just use 6627 of course
c.put(Config.NIMBUS_THRIFT_PORT, new Integer(6123));
StormSubmitter.submitTopology("myTopolgyName", conf, b.createTopology());
}
此外,您需要指定JVM参数-Dstorm.jar=/Users/agarg/Documents/notificationRepo/apache storm/build/libs/apache storm SNAPSHOT ns.r134 boot.jar
如果您想避免将可传递依赖项包含到jar中,您还可以手动将它们复制到Storm的lib
文件夹中。当然,您需要将它们复制到所有计算机上。您可能还需要重新启动群集。您可以将任意多个jar复制到lib
文件夹中,Storm将“拾取”所有jar
此外,如果您构建一个胖jar,依赖jar不能嵌套到远jar中(即,依赖jar的提取内容必须包含在远jar中)。例如,您的依赖jar
dep.jar
包含一个文件DClass.class
;因此,您的胖jar不能包含“dep.jar”(无论是顶级还是“lib”)文件夹),但所有喷口类和螺栓类旁边的“DClass.class”(即,“DClass.class”必须包含在jar的顶层文件夹中。当然,您还需要尊重包结构,即,如果“dep.jar”包含一个文件dpackage.DClass2
(即,“dpackage”文件夹中的“DClass2.class”),则远jar必须包含一个目录“dpackage”(在jar的顶层文件夹中)包含“DClass2.class”。您可以通过storm jar
命令提交spring-data-jpa-1.6.4.RELEASE.jar
?作为构建胖jar的替代方法,您还可以手动将依赖项jar复制到storm_HOME/lib
(当然在集群的每台机器上)。您可能需要重新启动群集以使Storm拾取jar。我没有使用Storm jar命令提交…我使用Nimbus客户端从Eclipse提交:=>Map Storm_conf=Utils.readStormConfig();Storm_conf.put(Config.Nimbus_HOST,“130.211.244.139”);String jar=“/Users/agarg/Documents/notificationRepo/apache storm/build/libs/apache storm SNAPSHOT ns.r134 boot.jar”;NimbusClient nimbus=new NimbusClient(storm_conf,“130.211.244.139”,6627);String uploadedJarLocation=StormSubmitter.submitJar(storm_conf,jar);而且,我现在只有一个单节点群集。我有太多的依赖jar。提交所有jar可能很困难。我可以尝试手动推送这个jar。也就是说。storm会扫描libs文件夹中的所有jar吗。我的意思是,如果我将更多jar推送到libs文件夹中,会与fat jar一起。如果没有,storm也会扫描它们吗d不知怎的在胖罐子里?谢谢Matthias..所以现在我正在手动部署罐子,它似乎正在工作(我现在每次都得到不同的classNotFoundException:)…然而,这远不是理想的解决方案..理想情况下,我希望有一个胖罐子来为我做这项工作,因为在所有节点上重复相同的操作是一项乏味而痛苦的任务..那么,风暴是这样设计的还是一个可以修复的bug?你可以构建一个远罐子,并在其中包含所有依赖项,以避免手动将依赖的罐子复制到lib
文件夹。在您的示例中,所有依赖项都必须包含在apache storm SN中APSHOT ns.r134 boot.jar
。您只需确保胖jar不包含依赖项,因为jar
文件--Storm无法处理嵌套的jar。实际上,我无法理解您的观点…我相信我在做同样的事情。.胖jar与jar在单独的lib文件夹中有所有依赖项。让我给m附加一个图像阿帕奇风暴APSHOT-ns.r134-boot.jar来详细说明。也许到时候我会明白你的意思。我刚刚扩展了我的答案。啊,有点晚了。我也发布了这张照片。不管怎样,因为我现在已经发布了。请确认我的理解,我会删除它。非常感谢你在这里对我的帮助:)