package com.neverwinterdp.demandspike.yarn.master ; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse; import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerStatus; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.client.api.AMRMClient.ContainerRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.text.TabularPrinter; public class DemandSpikeAppMasterContainerManager implements AppMasterContainerManager { protected static final Logger LOGGER = LoggerFactory.getLogger(DemandSpikeAppMasterContainerManager.class); public void onInit(AppMaster appMaster) { } public void onRequestContainer(AppMaster appMaster) { LOGGER.info("Start onInit(AppMaster appMaster)"); Configuration conf = appMaster.getConfiguration() ; int instanceMemory = conf.getInt("demandspike.instance.memory", 128) ; int instanceCores = conf.getInt("demandspike.instance.core", 1) ; int numOfTasks = 3 ; for (int i = 0; i < numOfTasks; i++) { ContainerRequest containerReq = appMaster.createContainerRequest(0/*priority*/, instanceCores, instanceMemory); appMaster.add(containerReq) ; } try { int allocatedContainer = 0 ; while(allocatedContainer < numOfTasks) { Thread.sleep(1000); AllocateResponse response = appMaster.getAMRMClient().allocate((float)allocatedContainer/numOfTasks); Resource resource = response.getAvailableResources() ; LOGGER.info("getAllocatedContainers() Avaiable Cores: " + resource.getVirtualCores()); LOGGER.info("getAllocatedContainers() Avaiable Memory: " + resource.getMemory()); List<Container> containers = response.getAllocatedContainers() ; LOGGER.info("Allocated " + containers.size() + " containers"); for(Container container : containers) { appMaster.startContainer(container) ; allocatedContainer++ ; } } } catch (Exception e) { LOGGER.error("Start container error", e); } LOGGER.info("Finish onInit(AppMaster appMaster)"); } public void onAllocatedContainer(AppMaster master, Container container) { } public void onCompleteContainer(AppMaster master, AppContainerInfoHolder containerInfo, ContainerStatus status) { 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 waitForComplete(AppMaster appMaster) { LOGGER.info("Start waitForComplete(AppMaster appMaster)"); AppInfo monitor = appMaster.getAppInfo() ; AppContainerInfo[] cinfos = monitor.getAppContainerInfos() ; try { boolean finished = false ; while(!finished) { synchronized(this) { this.wait(500); } 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)"); } 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 appInfo = appMaster.getAppInfo() ; AppContainerInfo[] info = appInfo.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)"); } }