package com.neverwinterdp.demandspike.yarn.master ; import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerStatus; import org.apache.hadoop.yarn.client.api.AMRMClient.ContainerRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.neverwinterdp.demandspike.yarn.worker.DemandSpikeAppWorker; import com.neverwinterdp.hadoop.yarn.app.AppConfig; import com.neverwinterdp.hadoop.yarn.app.AppContainerInfoHolder; import com.neverwinterdp.hadoop.yarn.app.AppInfo; import com.neverwinterdp.hadoop.yarn.app.protocol.AppContainerInfo; import com.neverwinterdp.hadoop.yarn.app.protocol.AppContainerStatus; import com.neverwinterdp.hadoop.yarn.app.protocol.ProcessStatus; import com.neverwinterdp.hadoop.yarn.app.master.AppMaster; import com.neverwinterdp.hadoop.yarn.app.master.AppMasterContainerManager; import com.neverwinterdp.util.JSONSerializer; import com.neverwinterdp.util.text.TabularPrinter; public class AsyncDemandSpikeAppMasterContainerManager implements AppMasterContainerManager { protected static final Logger LOGGER = LoggerFactory.getLogger(AsyncDemandSpikeAppMasterContainerManager.class); public void onInit(AppMaster appMaster) { } public void onRequestContainer(AppMaster appMaster) { LOGGER.info("Start onRequestContainer(AppMaster appMaster)"); AppConfig appConfig = appMaster.getAppConfig() ; appConfig.setWorkerByType(DemandSpikeAppWorker.class) ; System.out.println("AppInfo: " + JSONSerializer.INSTANCE.toString(appConfig)); for (int i = 0; i < appConfig.appNumOfWorkers; i++) { ContainerRequest containerReq = appMaster.createContainerRequest(0/*priority*/, appConfig.workerNumOfCore, appConfig.workerMaxMemory); appMaster.add(containerReq) ; } LOGGER.info("Finish onRequestContainer(AppMaster appMaster)"); } public void onAllocatedContainer(AppMaster appMaster, Container container) { try { LOGGER.info("onAllocateContainer(...), container id = " + container.getId()); appMaster.startContainer(container) ; } catch(Exception ex) { LOGGER.error("Start container error", ex); } } public void onCompleteContainer(AppMaster master, AppContainerInfoHolder containerInfo, ContainerStatus status) { try { AppConfig appConfig = master.getAppConfig() ; AppInfo appInfo = master.getAppInfo() ; int complete = appInfo.getCompletedContainerCount().intValue() ; master.getAMRMClient().allocate(complete/(float)appConfig.appNumOfWorkers) ; } catch (Exception e) { LOGGER.error("onCompleteContainer() report error", e); } LOGGER.info("on complete container " + status.getContainerId()); } public void onFailedContainer(AppMaster master, AppContainerInfoHolder containerInfo, ContainerStatus status) { LOGGER.info("on failed container " + status.getContainerId()); } public void onShutdownRequest(AppMaster appMaster) { LOGGER.info("Start onShutdownRequest(AppMaster appMaster)"); synchronized(this) { this.notify(); } LOGGER.info("Finish onShutdownRequest(AppMaster appMaster)"); } public void onExit(AppMaster appMaster) { LOGGER.info("Start onExit(AppMaster appMaster)"); AppInfo appMonitor = appMaster.getAppInfo() ; AppContainerInfo[] info = appMonitor.getAppContainerInfos() ; int[] colWidth = {20, 20, 20, 20} ; TabularPrinter printer = new TabularPrinter(System.out, colWidth) ; printer.header("Id", "Progress", "Error", "State"); for(AppContainerInfo sel : info) { AppContainerStatus status = sel.getStatus() ; printer.row( status.getContainerId(), status.getProgress(), status.getErrorStacktrace() != null, status.getProcessStatus()); } LOGGER.info("Finish onExit(AppMaster appMaster)"); } public void waitForComplete(AppMaster appMaster) { LOGGER.info("Start waitForComplete(AppMaster appMaster)"); AppConfig appConfig = appMaster.getAppConfig() ; try { boolean finished = false ; while(!finished) { synchronized(this) { this.wait(500); } AppInfo monitor = appMaster.getAppInfo() ; AppContainerInfo[] cinfos = monitor.getAppContainerInfos() ; if(cinfos.length < appConfig.appNumOfWorkers) continue ; finished = true; for(AppContainerInfo sel : cinfos) { ProcessStatus pstatus = sel.getStatus().getProcessStatus() ; if(!ProcessStatus.TERMINATED.equals(pstatus)) { finished = false ; break ; } } } } catch (InterruptedException ex) { LOGGER.error("wait interruption: ", ex); } LOGGER.info("Finish waitForComplete(AppMaster appMaster)"); } }