|
@@ -43,6 +43,9 @@ import org.apache.hadoop.conf.Configuration;
|
|
|
import org.apache.hadoop.fs.FileSystem;
|
|
|
import org.apache.hadoop.fs.Path;
|
|
|
import org.apache.hadoop.mapred.InvalidJobConfException;
|
|
|
+import org.apache.hadoop.mapred.JobConf;
|
|
|
+import org.apache.hadoop.mapred.Task;
|
|
|
+import org.apache.hadoop.mapred.TaskLog;
|
|
|
import org.apache.hadoop.mapreduce.JobID;
|
|
|
import org.apache.hadoop.mapreduce.MRConfig;
|
|
|
import org.apache.hadoop.mapreduce.MRJobConfig;
|
|
@@ -59,6 +62,7 @@ import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
|
|
|
import org.apache.hadoop.util.ApplicationClassLoader;
|
|
|
import org.apache.hadoop.util.StringUtils;
|
|
|
import org.apache.hadoop.yarn.ContainerLogAppender;
|
|
|
+import org.apache.hadoop.yarn.ContainerRollingLogAppender;
|
|
|
import org.apache.hadoop.yarn.api.ApplicationConstants;
|
|
|
import org.apache.hadoop.yarn.api.ApplicationConstants.Environment;
|
|
|
import org.apache.hadoop.yarn.api.records.LocalResource;
|
|
@@ -68,7 +72,6 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
|
import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
|
|
|
import org.apache.hadoop.yarn.util.Apps;
|
|
|
import org.apache.hadoop.yarn.util.ConverterUtils;
|
|
|
-import org.apache.log4j.RollingFileAppender;
|
|
|
|
|
|
/**
|
|
|
* Helper class for MR applications
|
|
@@ -592,18 +595,32 @@ public class MRApps extends Apps {
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
+
|
|
|
+ public static String getChildLogLevel(Configuration conf, boolean isMap) {
|
|
|
+ if (isMap) {
|
|
|
+ return conf.get(
|
|
|
+ MRJobConfig.MAP_LOG_LEVEL,
|
|
|
+ JobConf.DEFAULT_LOG_LEVEL.toString()
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ return conf.get(
|
|
|
+ MRJobConfig.REDUCE_LOG_LEVEL,
|
|
|
+ JobConf.DEFAULT_LOG_LEVEL.toString()
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
- * Add the JVM system properties necessary to configure {@link ContainerLogAppender}.
|
|
|
- * @param logLevel the desired log level (eg INFO/WARN/DEBUG)
|
|
|
- * @param logSize See {@link ContainerLogAppender#setTotalLogFileSize(long)}
|
|
|
- * @param numBackups See {@link RollingFileAppender#setMaxBackupIndex(int)}
|
|
|
+ * Add the JVM system properties necessary to configure
|
|
|
+ * {@link ContainerLogAppender} or
|
|
|
+ * {@link ContainerRollingLogAppender}.
|
|
|
+ *
|
|
|
+ * @param task for map/reduce, or null for app master
|
|
|
* @param vargs the argument list to append to
|
|
|
* @param conf configuration of MR job
|
|
|
*/
|
|
|
- public static void addLog4jSystemProperties(
|
|
|
- String logLevel, long logSize, int numBackups, List<String> vargs,
|
|
|
- Configuration conf) {
|
|
|
+ public static void addLog4jSystemProperties(Task task,
|
|
|
+ List<String> vargs, Configuration conf) {
|
|
|
String log4jPropertyFile =
|
|
|
conf.get(MRJobConfig.MAPREDUCE_JOB_LOG4J_PROPERTIES_FILE, "");
|
|
|
if (log4jPropertyFile.isEmpty()) {
|
|
@@ -618,11 +635,30 @@ public class MRApps extends Apps {
|
|
|
Path log4jPath = new Path(log4jURI);
|
|
|
vargs.add("-Dlog4j.configuration="+log4jPath.getName());
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ long logSize;
|
|
|
+ String logLevel;
|
|
|
+ int numBackups;
|
|
|
+
|
|
|
+ if (task == null) {
|
|
|
+ logSize = conf.getLong(MRJobConfig.MR_AM_LOG_KB,
|
|
|
+ MRJobConfig.DEFAULT_MR_AM_LOG_KB) << 10;
|
|
|
+ logLevel = conf.get(
|
|
|
+ MRJobConfig.MR_AM_LOG_LEVEL, MRJobConfig.DEFAULT_MR_AM_LOG_LEVEL);
|
|
|
+ numBackups = conf.getInt(MRJobConfig.MR_AM_LOG_BACKUPS,
|
|
|
+ MRJobConfig.DEFAULT_MR_AM_LOG_BACKUPS);
|
|
|
+ } else {
|
|
|
+ logSize = TaskLog.getTaskLogLimitBytes(conf);
|
|
|
+ logLevel = getChildLogLevel(conf, task.isMapTask());
|
|
|
+ numBackups = conf.getInt(MRJobConfig.TASK_LOG_BACKUPS,
|
|
|
+ MRJobConfig.DEFAULT_TASK_LOG_BACKUPS);
|
|
|
+ }
|
|
|
+
|
|
|
vargs.add("-D" + YarnConfiguration.YARN_APP_CONTAINER_LOG_DIR + "=" +
|
|
|
ApplicationConstants.LOG_DIR_EXPANSION_VAR);
|
|
|
vargs.add(
|
|
|
"-D" + YarnConfiguration.YARN_APP_CONTAINER_LOG_SIZE + "=" + logSize);
|
|
|
+
|
|
|
if (logSize > 0L && numBackups > 0) {
|
|
|
// log should be rolled
|
|
|
vargs.add("-D" + YarnConfiguration.YARN_APP_CONTAINER_LOG_BACKUPS + "="
|
|
@@ -631,6 +667,30 @@ public class MRApps extends Apps {
|
|
|
} else {
|
|
|
vargs.add("-Dhadoop.root.logger=" + logLevel + ",CLA");
|
|
|
}
|
|
|
+ vargs.add("-Dhadoop.root.logfile=" + TaskLog.LogName.SYSLOG);
|
|
|
+
|
|
|
+ if ( task != null
|
|
|
+ && !task.isMapTask()
|
|
|
+ && conf.getBoolean(MRJobConfig.REDUCE_SEPARATE_SHUFFLE_LOG,
|
|
|
+ MRJobConfig.DEFAULT_REDUCE_SEPARATE_SHUFFLE_LOG)) {
|
|
|
+ final int numShuffleBackups = conf.getInt(MRJobConfig.SHUFFLE_LOG_BACKUPS,
|
|
|
+ MRJobConfig.DEFAULT_SHUFFLE_LOG_BACKUPS);
|
|
|
+ final long shuffleLogSize = conf.getLong(MRJobConfig.SHUFFLE_LOG_KB,
|
|
|
+ MRJobConfig.DEFAULT_SHUFFLE_LOG_KB) << 10;
|
|
|
+ final String shuffleLogger = logLevel
|
|
|
+ + (shuffleLogSize > 0L && numShuffleBackups > 0
|
|
|
+ ? ",shuffleCRLA"
|
|
|
+ : ",shuffleCLA");
|
|
|
+
|
|
|
+ vargs.add("-D" + MRJobConfig.MR_PREFIX
|
|
|
+ + "shuffle.logger=" + shuffleLogger);
|
|
|
+ vargs.add("-D" + MRJobConfig.MR_PREFIX
|
|
|
+ + "shuffle.logfile=" + TaskLog.LogName.SYSLOG + ".shuffle");
|
|
|
+ vargs.add("-D" + MRJobConfig.MR_PREFIX
|
|
|
+ + "shuffle.log.filesize=" + shuffleLogSize);
|
|
|
+ vargs.add("-D" + MRJobConfig.MR_PREFIX
|
|
|
+ + "shuffle.log.backups=" + numShuffleBackups);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -687,7 +747,7 @@ public class MRApps extends Apps {
|
|
|
public static String crossPlatformifyMREnv(Configuration conf, Environment env) {
|
|
|
boolean crossPlatform =
|
|
|
conf.getBoolean(MRConfig.MAPREDUCE_APP_SUBMISSION_CROSS_PLATFORM,
|
|
|
- MRConfig.DEFAULT_MAPREDUCE_APP_SUBMISSION_CROSS_PLATFORM);
|
|
|
+ MRConfig.DEFAULT_MAPREDUCE_APP_SUBMISSION_CROSS_PLATFORM);
|
|
|
return crossPlatform ? env.$$() : env.$();
|
|
|
}
|
|
|
}
|