2017-06-07 2 views
0

Je travaille sur une application pour exécuter l'application batch spark à partir d'une application java.Démarrage et surveillance de l'application spark à partir d'une application Java

Il existe une classe principale qui démarre le thread pour démarrer l'application spark. Il utilise zookeeper pour trouver le leader parmi les machines qui démarrerait l'application spark. méthode Main ressemble à ceci:

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

     final int id = Integer.valueOf(args[0]); 
     final String zkURL = args[1]; 

     final ExecutorService service = Executors.newSingleThreadExecutor(); 

     final Future<?> status = service.submit(new ProcessNode(id, zkURL)); 
     try { 
      status.get(); 
     } catch (InterruptedException | ExecutionException e) { 
      LOG.fatal(e.getMessage(), e); 
      service.shutdown(); 
     } 

Une fois que le leader est sélectionné, le code suivant courrait sur elle pour démarrer l'application spark.

protected Boolean executeCommand() { 
    try { 
     final Runtime rt = Runtime.getRuntime(); 
     final Process proc = rt.exec("sh start-sparkapp.sh"); 
     final int exitVal = proc.waitFor(); 
     BufferedReader buf = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
     String line = ""; 
     while ((line=buf.readLine())!=null) { 
     System.out.println(line); 
     } 

     System.out.println(" commandToExecute exited with code: " + exitVal); 
     proc.destroy(); 

    } catch (final Exception e) { 
     System.out.println("Exception occurred while Launching process : " + e.getMessage()); 
     return Boolean.FALSE; 
    } 
     return Boolean.TRUE; 
} 

Mais cela commence une longue course spark travail. Donc, je crois que la prochaine partie du code ne sera exécutée que lorsque le travail spark sera terminé. Mon exigence est dès que l'application spark est lancée, le contrôle passe à la partie suivante du code, où je surveille l'état de la même application spark. je.je démarre l'application spark et de surveiller l'état de l'application spark à partir de la même application java. Supposons que j'ai une méthode montior qui surveille l'état d'application

public String monitor(ApplicationId id) 

Toute suggestion comment y parvenir?

+0

est l'étiquette 'apache-étincelle' justifiée? – suj1th

Répondre

0

Comme vous allez surveiller votre application Spark en utilisant la méthode public String monitor(ApplicationId id), je suppose que vous ne voulez pas que votre thread en cours d'attente sur le processus en utilisant proc.waitFor(). En outre, vous ne souhaitez pas imprimer la sortie normale du processus sur votre console. Ces deux opérations font attendre votre thread sur le processus généré. De plus, votre méthode de surveillance doit prendre l'ID de processus du processus engendré, plutôt que l'étincelle applicationId, comme entrée. Ainsi, le code modifié pourrait ressembler à:

protected Boolean executeCommand() { 
try { 
    final Runtime rt = Runtime.getRuntime(); 
    final Process proc = rt.exec("sh start-sparkapp.sh"); 

    /* 
    *Call to method monitor(ProcessId id) 
    */ 

    } catch (final Exception e) { 
     System.out.println("Exception occurred while Launching process : " + e.getMessage()); 
     return Boolean.FALSE; 
    } 
    return Boolean.TRUE; 
}