2014-03-12 4 views
1

원격 스톰 클러스터를 만들었습니다 (폭풍 배포 Nathan). 나는 "패키지 의존성"을 가진 runnable 항아리를 만들기 전에 eclipse에서 빌드 경로에서 Storm jar를 제거했다. 내 토폴로지는 storm-kafka-0.9.0-wip16a-scala292.jar를 사용하는데, 이는 빌드 경로에 남겨두고 runnable jar를 만들기 전에 빌드 경로에서 제거했다.storm-deploy 토폴로지 제출 로컬 클러스터에서 토폴로지를 실행 한 후

./storm jar /home/ubuntu/Virtual/stormTopologia4.jar org.vicomtech.main.StormTopologia 

항상 대답 : 나는 다음과 같은 명령을 사용할 때이 토폴로지는 실행 가능한 항아리와 같은 단일 인스턴스에서 AWS에 잘 작동하기 때문에

Exception in thread "main" java.lang.NoClassDefFoundError: OpaqueTridentKafkaSpout 
    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: OpaqueTridentKafkaSpout 
    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) 

을, 어떻게 미안를 파악 할수 없어 여기 ... 누락하는 것은 내 주요 메서드 내 코드입니다 : 내가 사용할 수 OpaqueTridentKafkaSpout 할 수있는 방법이

 Config conf = new Config(); 

     OpaqueTridentKafkaSpout tridentSpout = crearSpout(
       kafkadir, "test"); 


     OpaqueTridentKafkaSpout logUpvSpout = crearSpout(kafkadir, 
       "logsUpv"); 

     OpaqueTridentKafkaSpout logSnortSpout = crearSpout(
       kafkadir, "logsSnort"); 

     try { 
      StormSubmitter.submitTopology(
        "hackaton", 
        conf, 
        buildTopology(tridentSpout, logUpvSpout, 
          logSnortSpout)); 
     } catch (AlreadyAliveException | InvalidTopologyException e) { 

      e.printStackTrace(); 
     } 



    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (TwitterException e) { 
     e.printStackTrace(); 
    } 

} 

private static OpaqueTridentKafkaSpout crearSpout(
     String testKafkaBrokerHost, String topic) { 
    KafkaConfig.ZkHosts hosts = new ZkHosts(testKafkaBrokerHost, "/brokers"); 

    TridentKafkaConfig config = new TridentKafkaConfig(hosts, topic); 
    config.forceStartOffsetTime(-2); 

    config.scheme = new SchemeAsMultiScheme(new StringScheme()); 
    return new OpaqueTridentKafkaSpout(config); 
} 


public static StormTopology buildTopology(OpaqueTridentKafkaSpout tridentSpout, 
     OpaqueTridentKafkaSpout logUpvSpout, 
     OpaqueTridentKafkaSpout logSnortSpout 
     ) throws IOException, 
     TwitterException { 

    TridentTopology topology = new TridentTopology(); 



    topology.newStream("tweets2", tridentSpout) 
      .each(new Fields("str"), new OnlyEnglishSpanish()) 
      .each(new Fields("str"), new WholeTweetToMongo()) 
      .each(new Fields("str"), new TextLangExtracter(), 
        new Fields("text", "lang")).parallelismHint(6) 
      .project(new Fields("text", "lang")) 
      .partitionBy(new Fields("lang")) 
      .each(new Fields("text", "lang"), new Analisis(), 
        new Fields("result")).parallelismHint(6) 
      .each(new Fields("result"), new ResultToMongo()); 


    return topology.build(); 

} 

있습니까? 당신은 단지-와 의존성을 생성 할 때 , 우리는 빌드 경로에 폭풍 항아리를 유지할 수

답변

1

이 필드에 내가 매우 안돼서, 사전

희망 키우면되지 바보 cuestion에 감사합니다 우리는 단지 (, 따라서 필요하지가 번들로 항아리가 런타임 환경에 의해 제공되는 것을 의미하는 "제공"범위를 참조) 받는다는이 같은를 번들로하지 말해야 :

<dependency> 
    <groupId>storm</groupId> 
    <artifactId>storm</artifactId> 
    <version>0.9.0-rc2</version> 
    <scope>provided</scope> 
    <exclusions> 
     <exclusion> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

카프카해야하지만 주둥이 jar-with-dependencies에 포함되어 있으므로, maven 선언은 다음과 같습니다 :

<dependency> 
     <groupId>storm</groupId> 
     <artifactId>storm-kafka</artifactId> 
     <version>0.9.0-wip16a-scala292</version> 
</dependency> 

물건의 유효성을 검사하려면 결과 병을 압축 해제하고 폭풍에 배치하기 전에 필요한 클래스가 존재하는지 여부를 수동으로 확인하십시오.

+0

감사합니다. @Svend, 나는 당신의 솔루션을 시도 할 것입니다! 그런데, 당신은이 분야에 대한 훌륭한 자습서를 가지고 있으며, 매우 유용합니다! – user3410473

+0

감사합니다. 기쁘게 생각합니다. :) – Svend