Browse Source

Logging fileSize of log files under NM Local Dir. Contributed by Prabhu Joseph

(cherry picked from commit 54ac80176e8487b7a18cd9e16a11efa289d0b7df)
Szilard Nemeth 5 years ago
parent
commit
be9ac8adf9

+ 5 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java

@@ -1322,6 +1322,11 @@ public class YarnConfiguration extends Configuration {
   public static final String LOG_AGGREGATION_RETAIN_SECONDS = YARN_PREFIX
   public static final String LOG_AGGREGATION_RETAIN_SECONDS = YARN_PREFIX
       + "log-aggregation.retain-seconds";
       + "log-aggregation.retain-seconds";
   public static final long DEFAULT_LOG_AGGREGATION_RETAIN_SECONDS = -1;
   public static final long DEFAULT_LOG_AGGREGATION_RETAIN_SECONDS = -1;
+
+  public static final String LOG_AGGREGATION_DEBUG_FILESIZE = YARN_PREFIX
+      + "log-aggregation.debug.filesize";
+  public static final long DEFAULT_LOG_AGGREGATION_DEBUG_FILESIZE
+      = 100 * 1024 * 1024;
   
   
   /**
   /**
    * How long to wait between aggregated log retention checks. If set to
    * How long to wait between aggregated log retention checks. If set to

+ 8 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml

@@ -1262,6 +1262,14 @@
     <value>-1</value>
     <value>-1</value>
   </property>
   </property>
 
 
+  <property>
+    <description>The log files created under NM Local Directories
+    will be logged if it exceeds the configured bytes. This
+    only takes effect if log4j level is at least Debug.</description>
+    <name>yarn.log-aggregation.debug.filesize</name>
+    <value>104857600</value>
+  </property>
+
   <property>
   <property>
     <description>Specify which log file controllers we will support. The first
     <description>Specify which log file controllers we will support. The first
     file controller we add will be used to write the aggregated logs.
     file controller we add will be used to write the aggregated logs.

+ 17 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/logaggregation/AppLogAggregatorImpl.java

@@ -108,7 +108,7 @@ public class AppLogAggregatorImpl implements AppLogAggregator {
   private final AtomicBoolean waiting = new AtomicBoolean(false);
   private final AtomicBoolean waiting = new AtomicBoolean(false);
   private int logAggregationTimes = 0;
   private int logAggregationTimes = 0;
   private int cleanupOldLogTimes = 0;
   private int cleanupOldLogTimes = 0;
-
+  private long logFileSizeThreshold;
   private boolean renameTemporaryLogFileFailed = false;
   private boolean renameTemporaryLogFileFailed = false;
 
 
   private final Map<ContainerId, ContainerLogAggregator> containerLogAggregators =
   private final Map<ContainerId, ContainerLogAggregator> containerLogAggregators =
@@ -175,6 +175,9 @@ public class AppLogAggregatorImpl implements AppLogAggregator {
     this.nodeId = nodeId;
     this.nodeId = nodeId;
     this.logAggPolicy = getLogAggPolicy(conf);
     this.logAggPolicy = getLogAggPolicy(conf);
     this.recoveredLogInitedTime = recoveredLogInitedTime;
     this.recoveredLogInitedTime = recoveredLogInitedTime;
+    this.logFileSizeThreshold =
+        conf.getLong(YarnConfiguration.LOG_AGGREGATION_DEBUG_FILESIZE,
+        YarnConfiguration.DEFAULT_LOG_AGGREGATION_DEBUG_FILESIZE);
     if (logAggregationFileController == null) {
     if (logAggregationFileController == null) {
       // by default, use T-File Controller
       // by default, use T-File Controller
       this.logAggregationFileController = new LogAggregationTFileController();
       this.logAggregationFileController = new LogAggregationTFileController();
@@ -327,6 +330,19 @@ public class AppLogAggregatorImpl implements AppLogAggregator {
           uploadedLogsInThisCycle = true;
           uploadedLogsInThisCycle = true;
           List<Path> uploadedFilePathsInThisCycleList = new ArrayList<>();
           List<Path> uploadedFilePathsInThisCycleList = new ArrayList<>();
           uploadedFilePathsInThisCycleList.addAll(uploadedFilePathsInThisCycle);
           uploadedFilePathsInThisCycleList.addAll(uploadedFilePathsInThisCycle);
+          if (LOG.isDebugEnabled()) {
+            for (Path uploadedFilePath : uploadedFilePathsInThisCycleList) {
+              try {
+                long fileSize = lfs.getFileStatus(uploadedFilePath).getLen();
+                if (fileSize >= logFileSizeThreshold) {
+                  LOG.debug("Log File " + uploadedFilePath
+                      + " size is " + fileSize + " bytes");
+                }
+              } catch (Exception e1) {
+                LOG.error("Failed to get log file size " + e1);
+              }
+            }
+          }
           DeletionTask deletionTask = new FileDeletionTask(delService,
           DeletionTask deletionTask = new FileDeletionTask(delService,
               this.userUgi.getShortUserName(), null,
               this.userUgi.getShortUserName(), null,
               uploadedFilePathsInThisCycleList);
               uploadedFilePathsInThisCycleList);