// Run a job that will be killed and wait until it completes /// <exception cref="System.IO.IOException"/> public static RunningJob RunJobKill(JobConf conf, Path inDir, Path outDir) { conf.SetJobName("test-job-kill"); conf.SetMapperClass(typeof(UtilsForTests.KillMapper)); conf.SetReducerClass(typeof(IdentityReducer)); RunningJob job = UtilsForTests.RunJob(conf, inDir, outDir); long sleepCount = 0; while (job.GetJobState() != JobStatus.Running) { try { if (sleepCount > 300) { // 30 seconds throw new IOException("Job didn't finish in 30 seconds"); } Sharpen.Thread.Sleep(100); sleepCount++; } catch (Exception) { break; } } job.KillJob(); sleepCount = 0; while (job.CleanupProgress() == 0.0f) { try { if (sleepCount > 2000) { // 20 seconds throw new IOException("Job cleanup didn't start in 20 seconds"); } Sharpen.Thread.Sleep(10); sleepCount++; } catch (Exception) { break; } } return(job); }
// run a job which gets stuck in mapper and kill it. /// <exception cref="System.IO.IOException"/> private void TestKilledJob(string fileName, Type committer, string[] exclude) { JobConf jc = mr.CreateJobConf(); Path outDir = GetNewOutputDir(); ConfigureJob(jc, "kill job with abort()", 1, 0, outDir); // set the job to wait for long jc.SetMapperClass(typeof(UtilsForTests.KillMapper)); jc.SetOutputCommitter(committer); JobClient jobClient = new JobClient(jc); RunningJob job = jobClient.SubmitJob(jc); JobID id = job.GetID(); Counters counters = job.GetCounters(); // wait for the map to be launched while (true) { if (counters.GetCounter(JobCounter.TotalLaunchedMaps) == 1) { break; } Log.Info("Waiting for a map task to be launched"); UtilsForTests.WaitFor(100); counters = job.GetCounters(); } job.KillJob(); // kill the job job.WaitForCompletion(); // wait for the job to complete NUnit.Framework.Assert.AreEqual("Job was not killed", JobStatus.Killed, job.GetJobState ()); if (fileName != null) { Path testFile = new Path(outDir, fileName); NUnit.Framework.Assert.IsTrue("File " + testFile + " missing for job " + id, fileSys .Exists(testFile)); } // check if the files from the missing set exists foreach (string ex in exclude) { Path file = new Path(outDir, ex); NUnit.Framework.Assert.IsFalse("File " + file + " should not be present for killed job " + id, fileSys.Exists(file)); } }