2013-04-03 5 views
14

Mam do czynienia z problemem Must submit topologies using the 'storm' client script so that StormSubmitter knows which jar to upload podczas przesyłania topologii do klastra produkcyjnego przy użyciu IDE, podczas gdy to samo, jeśli wykonuję w wierszu poleceń przy użyciu polecenia storm jar, jego działanie jak w niebie. Widziałem przykłady tego samego z githublink.Jak przesłać topologię w klastrze produkcji burzowej za pomocą IDE

składania topologię używam te zestaw linii

conf.put(Config.NIMBUS_HOST, NIMBUS_NODE); 
    conf.put(Config.NIMBUS_THRIFT_PORT,6627); 
    conf.put(Config.STORM_ZOOKEEPER_PORT,2181); 
    conf.put(Config.STORM_ZOOKEEPER_SERVERS,ZOOKEEPER_ID); 
    conf.setNumWorkers(20); 
    conf.setMaxSpoutPending(5000); 
    StormSubmitter submitter = new StormSubmitter(); 
    submitter.submitTopology("test", conf, builder.createTopology()); 

Proszę zasugerować mi, czy to jest prawidłowe podejście do pracy?

Odpowiedz

21

Dobrze znalazłem rozwiązanie. Kiedy uruchomiliśmy "jar burzowy", wywołuje on flagę właściwości dla pliku storm.jar w przesłanym słoju. Więc jeśli chcemy programowo złożyć słoik po prostu ustawić flagę tędy

System.setProperty("storm.jar", <path-to-jar>);

na przykład:

System.setProperty("storm.jar", "/Users/programming/apache-storm-1.0.1/lib/storm-core-1.0.1.jar"); 
StormSubmitter.submitTopology("myTopology", config, builder.createTopology()); 
+1

Jak udało ci się pokonać następujący błąd 'java.lang.RuntimeException: znaleziono wiele zasobów defaults.yaml. Prawdopodobnie łączysz słoiki Storm ze słojem topologii. – manthosh

+2

"Znaleziono wiele domyślnych zasobów. Prawdopodobnie łączysz słoiki Storm ze słojem topologii." Nie włączaj słoików Storm do słoika topologii i aby to osiągnąć, jeśli używasz maven, dodaj tę linię pod warunkiem, że masz w swojej zależności od burzy. – abhi

+0

jego dawanie 'java.lang.RuntimeException: Topologia z nazwą' mytopology' już istnieje w klastrze' –

5

składania topologię do zdalnego klastra burzy, trzeba przesłać ten słoik na maszynę nimbus, a następnie przesłać ten jar do Cluster za pomocą NimbusClient.
można to zrobić tak:

Map storm_conf = Utils.readStormConfig(); 
storm_conf.put("nimbus.host", "<Nimbus Machine IP>"); 
Client client = NimbusClient.getConfiguredClient(storm_conf) 
           .getClient(); 
String inputJar = "C:\\workspace\\TestStormRunner\\target\\TestStormRunner-0.0.1-SNAPSHOT-jar-with-dependencies.jar"; 
NimbusClient nimbus = new NimbusClient(storm_conf, "<Nimbus Machine IP>", 
           <Nimbus Machine Port>); 
// upload topology jar to Cluster using StormSubmitter 
String uploadedJarLocation = StormSubmitter.submitJar(storm_conf, 
           inputJar); 

String jsonConf = JSONValue.toJSONString(storm_conf); 
nimbus.getClient().submitTopology("testtopology", 
         <uploadedJarLocation>, jsonConf, builder.createTopology()); 

Oto przykład praca: Submitting a topology to Remote Storm Cluster

3

mam rozwiązać ten problem na podstawie @abhi i odpowiedzi @Nishu Tayal za chciałabym aby umieścić mój kod tutaj:

public static void submitLocalTopologyWay1(String topologyName, Config topologyConf, 
     StormTopology topology, String localJar) { 
    try { 
     //get default storm config 
     Map defaultStormConf = Utils.readStormConfig(); 
     defaultStormConf.putAll(topologyConf); 

     //set JAR 
     System.setProperty("storm.jar",localJar); 

     //submit topology 
     StormSubmitter.submitTopology(topologyName, defaultStormConf, topology); 

    } catch (Exception e) { 
     String errorMsg = "can't deploy topology " + topologyName + ", " + e.getMessage(); 
     System.out.println(errorMsg); 
     e.printStackTrace(); 
    } 
} 

public static void submitLocalTopologyWay2(String topologyName, Config topologyConf, 
     StormTopology topology, String localJar) { 
    try { 
     //get nimbus client 
     Map defaultStormConf = Utils.readStormConfig(); 
     defaultStormConf.putAll(topologyConf); 
     Client client = NimbusClient.getConfiguredClient(defaultStormConf).getClient(); 

     //upload JAR 
     String remoteJar = StormSubmitter.submitJar(defaultStormConf, localJar); 

     //submit topology 
     client.submitTopology(topologyName, remoteJar, JSONValue.toJSONString(topologyConf), topology); 

    } catch (Exception e) { 
     String errorMsg = "can't deploy topology " + topologyName + ", " + e.getMessage(); 
     System.out.println(errorMsg); 
     e.printStackTrace(); 
    } 
} 

to tutaj jest test, i musisz najpierw zbudować swój kod do pliku JAR.

public void testSubmitTopologySubmitLocalTopologyWay1() { 
    Config config = new Config(); 
    config.put(Config.NIMBUS_HOST,"9.119.84.179"); 
    config.put(Config.NIMBUS_THRIFT_PORT, 6627); 
    config.put(Config.STORM_ZOOKEEPER_SERVERS, Arrays.asList("9.119.84.177","9.119.84.178","9.119.84.176")); 
    config.put(Config.STORM_ZOOKEEPER_PORT,2181); 

    config.put(Config.TOPOLOGY_WORKERS, 3); 

    RemoteSubmitter.submitLocalTopologyWay1("word-count-test-1", config, 
      WordCountTopology.buildTopology(), // your topology 
      "C:\\MyWorkspace\\project\\storm-sample-0.0.1-SNAPSHOT-jar-with-dependencies.jar");//the JAR file 
}