blob: dc1e8e676737d2542bea8821d2ebca9fa451628c [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.mapred;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Map;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapred.JobHistory.*;
import junit.framework.TestCase;
public class TestJobHistoryParsing extends TestCase {
ArrayList<PrintWriter> historyWriter = new ArrayList<PrintWriter>();
/**
* Listener for a test history log file, it populates JobHistory.JobInfo
* object with data from log file.
*/
static class TestListener implements Listener {
JobHistory.JobInfo job;
TestListener(JobHistory.JobInfo job) {
this.job = job;
}
// JobHistory.Listener implementation
public void handle(RecordTypes recType,
Map<JobHistory.Keys, String> values)
throws IOException {
if (recType == JobHistory.RecordTypes.Job) {
job.handle(values);
}
}
}
public void testHistoryParsing() throws IOException {
// open a test history file
Path historyDir = new Path(System.getProperty("test.build.data", "."),
"history");
JobConf conf = new JobConf();
conf.set("hadoop.job.history.location", historyDir.toString());
FileSystem fs = FileSystem.getLocal(new JobConf());
JobHistory.init(null, conf, "localhost", 1234);
Path historyLog = new Path(historyDir, "testlog");
PrintWriter out = new PrintWriter(fs.create(historyLog));
historyWriter.add(out);
// log keys and values into history
String value1 = "Value has equal=to, \"quotes\" and spaces in it";
String value2 = "Value has \n new line \n and " +
"dot followed by new line .\n in it ";
String value3 = "Value has characters: " +
"`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./" +
"~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:\"'ZXCVBNM<>?" +
"\t\b\n\f\"\n in it";
String value4 = "Value ends with escape\\";
String value5 = "Value ends with \\\" \\.\n";
StringBuilder sb = new StringBuilder("Longer value with many escaped "+
"chars, which tends to overflow the stack of brittle regex parsers");
for (int i = 0; i < 1000; ++i) {
sb.append(",");
sb.append("\\split.");
sb.append(i);
}
String value6 = sb.toString();
// Log the history version
JobHistory.MetaInfoManager.logMetaInfo(historyWriter);
JobHistory.log(historyWriter, RecordTypes.Job,
new JobHistory.Keys[] {Keys.JOBTRACKERID,
Keys.TRACKER_NAME,
Keys.JOBNAME,
Keys.JOBCONF,
Keys.USER,
Keys.SPLITS},
new String[] {value1, value2, value3, value4, value5,
value6});
// close history file
out.close();
historyWriter.remove(out);
// parse history
String jobId = "job_200809171136_0001"; // random jobid for tesing
JobHistory.JobInfo job = new JobHistory.JobInfo(jobId);
JobHistory.parseHistoryFromFS(historyLog.toString(),
new TestListener(job), fs);
// validate keys and values
assertEquals(value1, job.get(Keys.JOBTRACKERID));
assertEquals(value2, job.get(Keys.TRACKER_NAME));
assertEquals(value3, job.get(Keys.JOBNAME));
assertEquals(value4, job.get(Keys.JOBCONF));
assertEquals(value5, job.get(Keys.USER));
assertEquals(value6, job.get(Keys.SPLITS));
}
}