package com.sequenceiq.yarntest.client; import java.util.Random; import org.apache.commons.httpclient.HttpClient; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapred.YARNRunner; import org.apache.hadoop.mapreduce.JobID; import org.apache.hadoop.mapreduce.JobStatus; import org.codehaus.jackson.map.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sequenceiq.yarntest.monitoring.MRJobStatus; import com.sequenceiq.yarntest.monitoring.QueueInformation; import com.sequenceiq.yarntest.mr.QuasiMonteCarlo; import com.sequenceiq.yarntest.queue.QueueOrchestrator; public class JobClient { private static final Logger LOGGER = LoggerFactory.getLogger(JobClient.class); public static void main(String[] args) { try { JobClient jobClient = new JobClient(); QueueOrchestrator qo = new QueueOrchestrator(); HttpClient client = new HttpClient(); ObjectMapper mapper = new ObjectMapper(); String schedulerURL = "http://sandbox.hortonworks.com:8088/ws/v1/cluster/scheduler"; LOGGER.info("Starting YARN Capacity Queue Test"); LOGGER.info("yarn.scheduler.capacity.root.queues = default,highPriority,lowPriority"); LOGGER.info("yarn.scheduler.capacity.root.highPriority.capacity = 70"); LOGGER.info("yarn.scheduler.capacity.root.lowPriority.capacity = 20"); LOGGER.info("yarn.scheduler.capacity.root.highPriority.default = 10"); LOGGER.info("Scheduler URL: ", schedulerURL); MRJobStatus mrJobStatus = new MRJobStatus(); QueueInformation queueInformation = new QueueInformation(); //Create low priority setup - low priority root queue (capacity-scheduler.xml) Path tempDirLow = jobClient.createTempDir("lowPriority"); //Create high priority setup - high priority root queue (capacity-scheduler.xml) Path tempDirHigh = jobClient.createTempDir("highPriority"); String lowPriorityQueue = new String("lowPriority"); String highPriorityQueue = new String("highPriority"); // create YarnRunner to use for job status listing Configuration lowPriorityConf = qo.getConfiguration(lowPriorityQueue); // doesn't matter the configuration as we use YarnRunner only to retrieve job status info YARNRunner yarnRunner = new YARNRunner(lowPriorityConf); Configuration highPriorityConf = qo.getConfiguration(lowPriorityQueue); JobID lowPriorityJobID = qo.submitJobsIntoQueues(lowPriorityQueue, tempDirLow); JobID highPriorityJobID = qo.submitJobsIntoQueues(highPriorityQueue, tempDirHigh); // list low priority job status JobStatus lowPriorityJobStatus = mrJobStatus.printJobStatus(yarnRunner, lowPriorityJobID); // list high priority job status JobStatus highPriorityJobStatus = mrJobStatus.printJobStatus(yarnRunner, highPriorityJobID); // list job statuses & queue information until job(s) are completed for(;!lowPriorityJobStatus.isJobComplete();) { highPriorityJobStatus = mrJobStatus.printJobStatus(yarnRunner, highPriorityJobID); lowPriorityJobStatus = mrJobStatus.printJobStatus(yarnRunner, lowPriorityJobID); queueInformation.printQueueInfo(client, mapper, schedulerURL); Thread.sleep(1000); } } catch (Exception e) { LOGGER.error("Exception occured", e); } } private Path createTempDir(String priority) { long now = System.currentTimeMillis(); int rand = new Random().nextInt(Integer.MAX_VALUE); Path tempDir = new Path(QuasiMonteCarlo.TMP_DIR_PREFIX + "_" + now + "_" + rand+ "_" + priority); LOGGER.info("HDFS temp dir for" + priority.toUpperCase() + "is :", tempDir); return tempDir; } }