Apache Storm:将jar部署到remoteCluster时的ClassNotFoundException

时间:2015-10-15 19:51:25

标签: java classnotfoundexception apache-storm

我正在尝试将捆绑为胖jar的拓扑部署到远程Cluster。 jar可以成功部署但是在部署时,我在worker日志中看到以下错误:它说它无法找到JpaRepository的类,如下所示

enter image description here

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

enter image description here

如果你有任何人知道为什么这会失败,我真的很感激,因为我没有任何线索如何继续进行。我已经在使用类部署了jar,但它仍然说classNotFound :((。一切都在Local Cluster上运行良好。

还有一件事: - 我上传的Jar是68MB(比较重的一面)。这可以与此有关吗?

1 个答案:

答案 0 :(得分:2)

如果您通过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文件夹中。当然,您需要将它们复制到所有机器。您可能还需要重新启动群集。您可以将尽可能多的罐子复制到lib文件夹 - Storm将“拾取”所有罐子。

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