package com.neverwinterdp.scribengin.ScribeConsumerManager; import java.io.IOException; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.apache.hadoop.yarn.api.records.ApplicationReport; import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.YarnApplicationState; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.log4j.Logger; import com.neverwinterdp.scribengin.scribeconsumer.ScribeConsumerConfig; import com.neverwinterdp.scribengin.yarn.Client; public class YarnScribeConsumerManager extends AbstractScribeConsumerManager{ private class YarnInfo{ public Client client; public ScribeConsumerConfig conf; public YarnInfo(Client c, ScribeConsumerConfig cnf){ this.client = c; this.conf = cnf; } } private static final Logger LOG = Logger.getLogger(YarnScribeConsumerManager.class.getName()); //List<YarnInfo> yarnApps = new LinkedList<YarnInfo>(); List<YarnInfo> yarnApps = Collections.synchronizedList(new LinkedList<YarnInfo>()); public YarnScribeConsumerManager(){ super(); } @Override public boolean startNewConsumers(ScribeConsumerConfig conf, List<String> topics) { boolean retVal = true; for(String s: topics){ conf.topic = s; if(!this.startNewConsumer(new ScribeConsumerConfig(conf))){ retVal = false; } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } return retVal; } @Override public boolean startNewConsumer(ScribeConsumerConfig conf) { List<String> topics = new LinkedList<String>(); topics.add(conf.topic); Client client = null; try { client = new Client(conf.appname, conf.scribenginJarPath, conf.appMasterClassName, conf.defaultFs, conf.yarnSiteXml, conf.COMMIT_PATH_PREFIX, conf.PRE_COMMIT_PATH_PREFIX, conf.hdfsPath, topics, conf.getBrokerListAsListOfStrings(), conf.containerMem, conf.applicationMasterMem, conf.cleanStart ); } catch (Exception e) { e.printStackTrace(); } try { client.init(); client.run(); synchronized(yarnApps){ yarnApps.add(new YarnInfo(client, conf)); } return true; } catch (IOException | YarnException e) { e.printStackTrace(); } return false; } @Override public void monitorConsumers(){ LinkedList<ScribeConsumerConfig> toAdd = new LinkedList<ScribeConsumerConfig>(); synchronized(yarnApps){ Iterator<YarnInfo> it = yarnApps.iterator(); while (it.hasNext()) { YarnInfo yarnInfo = it.next(); ApplicationReport report = null; Client c = null; try { c = yarnInfo.client; report = c.getYarnClient().getApplicationReport(c.getAppId()); } catch (YarnException | IOException e) { e.printStackTrace(); }; YarnApplicationState state = report.getYarnApplicationState(); FinalApplicationStatus status = report.getFinalApplicationStatus(); if (state == YarnApplicationState.FINISHED || state == YarnApplicationState.KILLED ) { if (status == FinalApplicationStatus.SUCCEEDED) { LOG.info("Application completed successfully: "+c.getAppId().toString()); it.remove(); break; } else if(state == YarnApplicationState.ACCEPTED){ //Do nothing } else { LOG.info("Application finished but errored out. YarnState=" + state.toString() + ", finalStatue=" + status.toString() + ", AppId: "+c.getAppId().toString()); yarnInfo.conf.cleanStart = false; toAdd.add(new ScribeConsumerConfig(yarnInfo.conf)); it.remove(); break; } } else if (state == YarnApplicationState.FAILED) { LOG.info("Application errored out. YarnState=" + state.toString() + ", finalStatue=" + status.toString() + ", AppId: "+c.getAppId().toString()); it.remove(); break; } } } for(ScribeConsumerConfig sci: toAdd){ startNewConsumer(sci); } } @Override public boolean shutdownConsumers() { boolean retVal = true; synchronized(yarnApps){ Iterator<YarnInfo> it = yarnApps.iterator(); while(it.hasNext()){ YarnInfo yi = it.next(); try{ yi.client.getYarnClient().killApplication(yi.client.getAppId()); it.remove(); } catch(Exception e){ e.printStackTrace(); retVal = false; } } } return retVal; } @Override public int getNumConsumers() { synchronized(yarnApps){ return yarnApps.size(); } } @Override public boolean killConsumersUncleanly() { boolean retVal = true; synchronized(yarnApps){ Iterator<YarnInfo> it = yarnApps.iterator(); while(it.hasNext()){ YarnInfo yi = it.next(); try{ LOG.info("KILLING: "+yi.client.getAppId().toString()); yi.client.getYarnClient().killApplication(yi.client.getAppId()); } catch(Exception e){ e.printStackTrace(); retVal = false; } } } return retVal; } }