package com.neverwinterdp.scribengin; import java.util.LinkedList; import java.util.List; import org.apache.log4j.Logger; import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterException; import com.neverwinterdp.scribengin.ScribeConsumerManager.AbstractScribeConsumerManager; import com.neverwinterdp.scribengin.ScribeConsumerManager.ClusterScribeConsumerManager; import com.neverwinterdp.scribengin.ScribeConsumerManager.YarnScribeConsumerManager; import com.neverwinterdp.scribengin.hostport.CustomConvertFactory; import com.neverwinterdp.scribengin.scribeconsumer.ScribeConsumerConfig; public class ScribeMaster { private AbstractScribeConsumerManager manager; private List<String> topics; private ScribeConsumerConfig commonConf; private Thread scribeMasterThread; private static final Logger LOG = Logger.getLogger(ScribeMaster.class.getName()); public ScribeMaster(List<String> topics, ScribeConsumerConfig conf){ this.topics = topics; this.commonConf = conf; } public void setScribeConsumerManager(AbstractScribeConsumerManager ascm){ manager = ascm; } public void start(){ try{ manager.startNewConsumers(commonConf,topics) ; } catch(Exception e){ e.printStackTrace(); } } public void stop(){ try{ scribeMasterThread.interrupt(); } catch(Exception e){} manager.shutdownConsumers(); } public void checkOnConsumers(){ manager.monitorConsumers(); } public void checkOnConsumersThreaded(final int refresh){ scribeMasterThread = new Thread() { public void run() { while(true){ checkOnConsumers(); try { Thread.sleep(refresh); } catch (InterruptedException e) { e.printStackTrace(); } } } }; scribeMasterThread.start(); } public int getNumConsumers(){ return manager.getNumConsumers(); } public boolean killConsumersForceRestart(){ return manager.killConsumersUncleanly(); } public static void main(String[] args){ ScribeMasterCommandLineArgs p = new ScribeMasterCommandLineArgs(); JCommander jc = new JCommander(p); jc.addConverterFactory(new CustomConvertFactory()); try{ jc.parse(args); } catch (ParameterException e){ LOG.error(e.getMessage()); jc.usage(); System.exit(-1); } List<String> topics = new LinkedList<String>(); String[] split = p.topic.split(","); for(String x: split){ topics.add(x); } ScribeConsumerConfig c = new ScribeConsumerConfig(); c.PRE_COMMIT_PATH_PREFIX = p.preCommitPrefix; c.COMMIT_PATH_PREFIX = p.commitPrefix; c.partition = p.partition; c.commitCheckPointInterval = p.commitCheckPointInterval; c.hdfsPath = p.hdfsPath; c.brokerList = p.brokerList; c.cleanStart = p.cleanstart; c.appname = p.appname; c.scribenginJarPath = p.scribenginjar; c.appMasterClassName = p.appMasterClassName; c.containerMem = p.containerMem; c.applicationMasterMem = p.applicationMasterMem; c.date_partitioner = p.date_partitioner; final ScribeMaster sm = new ScribeMaster(topics, c); if(p.mode.equals("dev") || p.mode.equals("distributed")){ sm.setScribeConsumerManager(new ClusterScribeConsumerManager()); } else if(p.mode.equals("yarn")){ sm.setScribeConsumerManager(new YarnScribeConsumerManager()); } else{ LOG.error("Invalid mode: "+p.mode); LOG.error("Valid modes: dev, distributed, yarn"); System.exit(-1); } //This is so when we hit ctrl+c it kills app cleanly Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { sm.stop(); } }); sm.start(); while(true){ sm.checkOnConsumers(); try { Thread.sleep(5000); if(sm.getNumConsumers() < 1){ break; } } catch (InterruptedException e) { e.printStackTrace(); } } } }