2013-04-03 9 views
14

Sono di fronte a un problema Must submit topologies using the 'storm' client script so that StormSubmitter knows which jar to upload durante l'invio di una topologia a un cluster di produzione utilizzando IDE, mentre la stessa cosa se eseguo in riga di comando utilizzando il comando storm jar, funziona come paradiso. Ho visto esempi della stessa da githublink.Come inoltrare una topologia nel cluster di produzione tempesta utilizzando IDE

per la presentazione delle topologia sto usando queste serie di linee

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()); 

Si prega di suggerire me, se questo è l'approccio corretto per l'esecuzione?

risposta

21

Ben trovato la soluzione. Quando abbiamo lanciato "storm storm" attiva una flag di proprietà per storm.jar nel jar inviato. Quindi, se vogliamo inviare a livello di codice un barattolo poi semplicemente impostare il flag in questo modo

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

Ad esempio:

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

Come siete riusciti a superare il seguente errore 'java.lang.RuntimeException: trovati più risorse defaults.yaml. Probabilmente stai raggruppando i barattoli di Storm con il tuo barattolo di topologia. – manthosh

+2

"Trovato più risorse defaults.yaml. Probabilmente stai raggruppando i barattoli di Storm con il tuo jar di topologia." Non includere i barattoli di Tempesta nel vaso della topologia e per ottenere questo risultato se si utilizza Maven, aggiungere la riga fornita nella dipendenza dalla tempesta a. – abhi

+0

dando 'java.lang.RuntimeException: la topologia con il nome' mytopology' esiste già nel cluster' –

4

non aver corso il codice Java per la presentazione di me stesso, ma il comando tempesta ho controllato - e si tratta di un file di pitone, che corre Java e http://nathanmarz.github.com/storm/doc/backtype/storm/StormSubmitter.html classe

L'unica cosa che penso che si dovrebbe preoccupare - è quella di includere tutte le librerie necessarie, durante l'esecuzione.

+0

grazie alex per il suggerimento +1 – abhi

5

per la presentazione di una topologia a grappolo Tempesta remoto, è necessario caricare quel vaso alla macchina nimbus e quindi inviare quel jar a Cluster utilizzando NimbusClient.
si può fare in questo modo:

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()); 

Ecco l'esempio di lavoro: Submitting a topology to Remote Storm Cluster

3

ho risolto questo problema sulla base di @abhi e le risposte di @Nishu Tayal, mi piacerebbe pubblicare la mia il codice qui:

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(); 
    } 
} 

allora qui è una prova, e si deve costruire il vostro codice in un file JAR prima.

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 
} 
Problemi correlati