Apache Storm:将 jar 部署到 remoteCluster 时出现 ClassNotFoundException

Apache Storm : ClassNotFoundException when deploying jar to remoteCluster

我正在尝试将我的拓扑捆绑为一个 fat jar 部署到远程 Cluster 。 jar 可以成功部署,但部署后,我在工作日志中看到以下错误:它说找不到 JpaRepository 的 class,如下所示

虽然我提交给集群的 jar 已经包含这个 class。我从集群中复制了 jar 并查看了它的内容,这是我所看到的

如果你们中的任何人知道为什么会失败,我将非常感激,因为我不知道如何进一步处理这个问题。我已经在使用 class 部署 jar,但它仍然显示 classNotFound :(( 。在本地集群上一切正常。

还有一件事:- 我上传的 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-SN‌​APSHOT-ns.r134-boot.jar

如果你想避免将传递依赖项包含到你的 jar 中,你也可以手动将它们复制到 Storm 的 lib 文件夹中。当然,你需要将它们复制到所有台机器上。您可能还需要重新启动集群。您可以将任意数量的 jar 复制到 lib 文件夹——Storm 将 "pick up" 所有这些。

此外,如果构建一个fat jar,则依赖的jar不能嵌套到far jar中(即依赖jar的提取内容必须包含到far jar中)。比如你依赖的jardep.jar包含一个文件DClass.class;因此,你的 fat jar 不能包含 "dep.jar"(既不在顶层也不在 "lib" 文件夹中),而是 "DClass.class" 在你所有的 Spout 和 Bolt 类 旁边(即 "DClass.class" 必须包含在 jar 中的顶级文件夹中。当然,您还需要尊重包结构,即,如果 "dep.jar" 包含文件 dpackage.DClass2(即文件夹中的 "DClass2.class" "dpackage") 远 jar 必须包含一个目录 "dpackage"(在 jar 的顶级文件夹中),其中包含 "DClass2.class".