KafkaSpout BrokerHosts错误

时间:2013-07-23 17:52:18

标签: maven apache-storm apache-kafka

我正在尝试编译并运行storm-kafka-starter项目 https://github.com/TheHydroImpulse/storm-kafka-starter

KafkaTopology的主要功能如下:

public class KafkaTopology {

  public static void main(String[] args) throws Exception {

    List<String> hosts = new ArrayList<String>();
    hosts.add("localhost");
    SpoutConfig kafkaConf = new SpoutConfig(StaticHosts.fromHostString(hosts,1),
                                        "test-topic","/kafkastorm","discovery");
    kafkaConf.scheme = new SchemeAsMultiScheme(new StringScheme());
    kafkaConf.forceStartOffsetTime(-2);
    TopologyBuilder builder = new TopologyBuilder();
    builder.setSpout("spout", kafkaSpout, 2);
    builder.setBolt("printer", new PrinterBolt()).shuffleGrouping("spout");

    Config config = new Config();
    config.setDebug(true);

    if(args!=null && args.length > 0) {
      config.setNumWorkers(3);
      StormSubmitter.submitTopology(args[0], config, builder.createTopology());
    } 
    else {        
      config.setMaxTaskParallelism(3);
      LocalCluster cluster = new LocalCluster();
      cluster.submitTopology("kafka", config, builder.createTopology());

      Thread.sleep(10000);

      cluster.shutdown();
    }
  }
}

jar使用maven编译。但是在运行拓扑时,我收到错误:

Exception in thread "main" java.lang.NoClassDefFoundError:      
storm/kafka/KafkaConfig$BrokerHosts
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.getMethod0(Class.java:2694)
at java.lang.Class.getMethod(Class.java:1622) 
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: storm.kafka.KafkaConfig$BrokerHosts
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 6 more

本地存储库确实在storm-kafka jar中有BrokerHosts,我已经在我的java文件中导入了KafkaConfig库。我无法弄清楚错误的原因。任何建议,将不胜感激。

5 个答案:

答案 0 :(得分:3)

我使用0.9.2_cububating版本的Apache Storm遇到了类似的问题。

引起的问题是因为实际的风暴分布在/ lib文件夹中没有kafka库。我能够通过将以下库(我用来编译和构建拓扑)复制到我运行Storm的/ lib文件夹来解决错误

  • 风暴卡夫卡-0.9.2-incubating.jar
  • kafka_2.10-0.8.1.1.jar
  • 阶库-2.10.1.jar

请记住,您案例中的实际版本可能会有所不同。拿你用来构建风暴拓扑的那些(即来自.m2或.gradle依赖文件夹)

注意:我没有使用上面提到的完全相同的启动项目,但修复程序类似。

答案 1 :(得分:1)

我经历了风暴用户组和storm-kafka-starter github页面上的问题。事实证明,错误是由于两个原因造成的:

  1. storm,kafka和kafka-storm版本之间的版本不兼容
  2. 在类路径上遗漏了罐子
  3. 即使在/ storm / lib文件夹中包含所有必需的依赖项jar,我的初始设置也无法正常工作。事实证明,提到的storm-kafka-starter项目仅适用于风暴0.9.x版本。

    另请参阅此处的帖子,了解哪种设置效果最佳 - https://groups.google.com/d/msg/storm-user/V_j_JZmFsb4/E4_II9ork3UJ

答案 2 :(得分:1)

我经历了同样的整合困境。最后得到了一个有效的例子。

欢迎您在此处查看&gt;   https://github.com/buildlackey/cep

(点击storm + kafka目录,查看应该启动并运行的示例程序。)

答案 3 :(得分:0)

我无法使用正确的maven构建命令。使用

mvn clean install assembly:assembly

并使用带有依赖关系的jar来形成它。

答案 4 :(得分:0)

更改了pom.xml
customer total_likes
1        2
2        1
3        1

<dependency>
   <groupId>org.apache.storm</groupId>
   <artifactId>storm-kafka</artifactId>
   <version>1.0.2</version>
   <scope>provided</scope>
</dependency>

现在它适合我!