MAPREDUCE-6350. JobHistory doesn't support fully-functional search.

Contributed by Siqi Li.
This commit is contained in:
Devaraj K 2015-06-10 12:40:29 +05:30
parent 48ca23def1
commit 6785661e55
6 changed files with 60 additions and 7 deletions

View File

@ -465,6 +465,9 @@ Release 2.8.0 - UNRELEASED
MAPREDUCE-6388. Remove deprecation warnings from JobHistoryServer classes MAPREDUCE-6388. Remove deprecation warnings from JobHistoryServer classes
(Ray Chiang via ozawa). (Ray Chiang via ozawa).
MAPREDUCE-6350. JobHistory doesn't support fully-functional search.
(Siqi Li via devaraj)
Release 2.7.1 - UNRELEASED Release 2.7.1 - UNRELEASED
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -55,6 +55,7 @@
import org.apache.hadoop.mapreduce.v2.app.job.Job; import org.apache.hadoop.mapreduce.v2.app.job.Job;
import org.apache.hadoop.mapreduce.v2.app.job.JobStateInternal; import org.apache.hadoop.mapreduce.v2.app.job.JobStateInternal;
import org.apache.hadoop.mapreduce.v2.jobhistory.FileNameIndexUtils; import org.apache.hadoop.mapreduce.v2.jobhistory.FileNameIndexUtils;
import org.apache.hadoop.mapreduce.v2.jobhistory.JHAdminConfig;
import org.apache.hadoop.mapreduce.v2.jobhistory.JobHistoryUtils; import org.apache.hadoop.mapreduce.v2.jobhistory.JobHistoryUtils;
import org.apache.hadoop.mapreduce.v2.jobhistory.JobIndexInfo; import org.apache.hadoop.mapreduce.v2.jobhistory.JobIndexInfo;
import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.UserGroupInformation;
@ -1107,9 +1108,12 @@ protected void processDoneFiles(JobId jobId) throws IOException {
if (mi.getHistoryFile() != null) { if (mi.getHistoryFile() != null) {
Path historyFile = mi.getHistoryFile(); Path historyFile = mi.getHistoryFile();
Path qualifiedLogFile = stagingDirFS.makeQualified(historyFile); Path qualifiedLogFile = stagingDirFS.makeQualified(historyFile);
int jobNameLimit =
getConfig().getInt(JHAdminConfig.MR_HS_JOBNAME_LIMIT,
JHAdminConfig.DEFAULT_MR_HS_JOBNAME_LIMIT);
String doneJobHistoryFileName = String doneJobHistoryFileName =
getTempFileName(FileNameIndexUtils.getDoneFileName(mi getTempFileName(FileNameIndexUtils.getDoneFileName(mi
.getJobIndexInfo())); .getJobIndexInfo(), jobNameLimit));
qualifiedDoneFile = qualifiedDoneFile =
doneDirFS.makeQualified(new Path(doneDirPrefixPath, doneDirFS.makeQualified(new Path(doneDirPrefixPath,
doneJobHistoryFileName)); doneJobHistoryFileName));

View File

@ -32,8 +32,6 @@
public class FileNameIndexUtils { public class FileNameIndexUtils {
static final int JOB_NAME_TRIM_LENGTH = 50;
// Sanitize job history file for predictable parsing // Sanitize job history file for predictable parsing
static final String DELIMITER = "-"; static final String DELIMITER = "-";
static final String DELIMITER_ESCAPE = "%2D"; static final String DELIMITER_ESCAPE = "%2D";
@ -60,6 +58,12 @@ public class FileNameIndexUtils {
* @return the done job history filename. * @return the done job history filename.
*/ */
public static String getDoneFileName(JobIndexInfo indexInfo) throws IOException { public static String getDoneFileName(JobIndexInfo indexInfo) throws IOException {
return getDoneFileName(indexInfo,
JHAdminConfig.DEFAULT_MR_HS_JOBNAME_LIMIT);
}
public static String getDoneFileName(JobIndexInfo indexInfo,
int jobNameLimit) throws IOException {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
//JobId //JobId
sb.append(escapeDelimiters(TypeConverter.fromYarn(indexInfo.getJobId()).toString())); sb.append(escapeDelimiters(TypeConverter.fromYarn(indexInfo.getJobId()).toString()));
@ -74,7 +78,8 @@ public static String getDoneFileName(JobIndexInfo indexInfo) throws IOException
sb.append(DELIMITER); sb.append(DELIMITER);
//JobName //JobName
sb.append(escapeDelimiters(trimJobName(getJobName(indexInfo)))); sb.append(escapeDelimiters(trimJobName(
getJobName(indexInfo), jobNameLimit)));
sb.append(DELIMITER); sb.append(DELIMITER);
//FinishTime //FinishTime
@ -286,9 +291,9 @@ private static String escapeDelimiters(String escapee) {
/** /**
* Trims the job-name if required * Trims the job-name if required
*/ */
private static String trimJobName(String jobName) { private static String trimJobName(String jobName, int jobNameLimit) {
if (jobName.length() > JOB_NAME_TRIM_LENGTH) { if (jobName.length() > jobNameLimit) {
jobName = jobName.substring(0, JOB_NAME_TRIM_LENGTH); jobName = jobName.substring(0, jobNameLimit);
} }
return jobName; return jobName;
} }

View File

@ -214,4 +214,11 @@ public class JHAdminConfig {
*/ */
public static boolean DEFAULT_MR_HISTORY_MINICLUSTER_FIXED_PORTS = false; public static boolean DEFAULT_MR_HISTORY_MINICLUSTER_FIXED_PORTS = false;
/**
* Number of characters allowed for job name in Job History Server web page.
*/
public static final String MR_HS_JOBNAME_LIMIT = MR_HISTORY_PREFIX
+ "jobname.limit";
public static final int DEFAULT_MR_HS_JOBNAME_LIMIT = 50;
} }

View File

@ -147,6 +147,32 @@ public void testUserNamePercentEncoding() throws IOException {
jobHistoryFile.contains(USER_NAME_WITH_DELIMITER_ESCAPE)); jobHistoryFile.contains(USER_NAME_WITH_DELIMITER_ESCAPE));
} }
@Test
public void testTrimJobName() throws IOException {
int jobNameTrimLength = 5;
JobIndexInfo info = new JobIndexInfo();
JobID oldJobId = JobID.forName(JOB_ID);
JobId jobId = TypeConverter.toYarn(oldJobId);
info.setJobId(jobId);
info.setSubmitTime(Long.parseLong(SUBMIT_TIME));
info.setUser(USER_NAME);
info.setJobName(JOB_NAME);
info.setFinishTime(Long.parseLong(FINISH_TIME));
info.setNumMaps(Integer.parseInt(NUM_MAPS));
info.setNumReduces(Integer.parseInt(NUM_REDUCES));
info.setJobStatus(JOB_STATUS);
info.setQueueName(QUEUE_NAME);
info.setJobStartTime(Long.parseLong(JOB_START_TIME));
String jobHistoryFile =
FileNameIndexUtils.getDoneFileName(info, jobNameTrimLength);
JobIndexInfo parsedInfo = FileNameIndexUtils.getIndexInfo(jobHistoryFile);
Assert.assertEquals("Job name did not get trimmed correctly",
info.getJobName().substring(0, jobNameTrimLength),
parsedInfo.getJobName());
}
@Test @Test
public void testUserNamePercentDecoding() throws IOException { public void testUserNamePercentDecoding() throws IOException {
String jobHistoryFile = String.format(JOB_HISTORY_FILE_FORMATTER, String jobHistoryFile = String.format(JOB_HISTORY_FILE_FORMATTER,

View File

@ -1705,6 +1705,14 @@
</description> </description>
</property> </property>
<property>
<name>mapreduce.jobhistory.jobname.limit</name>
<value>50</value>
<description>
Number of characters allowed for job name in Job History Server web page.
</description>
</property>
<property> <property>
<name>mapreduce.job.heap.memory-mb.ratio</name> <name>mapreduce.job.heap.memory-mb.ratio</name>
<value>0.8</value> <value>0.8</value>