YARN-512. Log aggregation root directory check is more expensive than it needs to be. Contributed by Maysam Yabandeh
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1487498 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
edc6d7d3ab
commit
31c96829c7
@ -223,6 +223,9 @@ Release 2.0.5-beta - UNRELEASED
|
|||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
|
YARN-512. Log aggregation root directory check is more expensive than it
|
||||||
|
needs to be. (Maysam Yabandeh via jlowe)
|
||||||
|
|
||||||
BUG FIXES
|
BUG FIXES
|
||||||
|
|
||||||
YARN-383. AMRMClientImpl should handle null rmClient in stop()
|
YARN-383. AMRMClientImpl should handle null rmClient in stop()
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation;
|
package org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.PrivilegedExceptionAction;
|
import java.security.PrivilegedExceptionAction;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -163,36 +164,31 @@ private void stopAggregators() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void verifyAndCreateRemoteLogDir(Configuration conf) {
|
void verifyAndCreateRemoteLogDir(Configuration conf) {
|
||||||
// Checking the existance of the TLD
|
// Checking the existence of the TLD
|
||||||
FileSystem remoteFS = null;
|
FileSystem remoteFS = null;
|
||||||
try {
|
try {
|
||||||
remoteFS = FileSystem.get(conf);
|
remoteFS = FileSystem.get(conf);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new YarnException("Unable to get Remote FileSystem instance", e);
|
throw new YarnException("Unable to get Remote FileSystem instance", e);
|
||||||
}
|
}
|
||||||
boolean remoteExists = false;
|
boolean remoteExists = true;
|
||||||
try {
|
try {
|
||||||
remoteExists = remoteFS.exists(this.remoteRootLogDir);
|
FsPermission perms =
|
||||||
} catch (IOException e) {
|
remoteFS.getFileStatus(this.remoteRootLogDir).getPermission();
|
||||||
throw new YarnException("Failed to check for existence of remoteLogDir ["
|
if (!perms.equals(TLDIR_PERMISSIONS)) {
|
||||||
+ this.remoteRootLogDir + "]", e);
|
LOG.warn("Remote Root Log Dir [" + this.remoteRootLogDir
|
||||||
}
|
+ "] already exist, but with incorrect permissions. "
|
||||||
if (remoteExists) {
|
+ "Expected: [" + TLDIR_PERMISSIONS + "], Found: [" + perms
|
||||||
try {
|
+ "]." + " The cluster may have problems with multiple users.");
|
||||||
FsPermission perms =
|
|
||||||
remoteFS.getFileStatus(this.remoteRootLogDir).getPermission();
|
|
||||||
if (!perms.equals(TLDIR_PERMISSIONS)) {
|
|
||||||
LOG.warn("Remote Root Log Dir [" + this.remoteRootLogDir
|
|
||||||
+ "] already exist, but with incorrect permissions. "
|
|
||||||
+ "Expected: [" + TLDIR_PERMISSIONS + "], Found: [" + perms
|
|
||||||
+ "]." + " The cluster may have problems with multiple users.");
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new YarnException(
|
|
||||||
"Failed to check permissions for dir ["
|
|
||||||
+ this.remoteRootLogDir + "]", e);
|
|
||||||
}
|
}
|
||||||
} else {
|
} catch (FileNotFoundException e) {
|
||||||
|
remoteExists = false;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new YarnException(
|
||||||
|
"Failed to check permissions for dir ["
|
||||||
|
+ this.remoteRootLogDir + "]", e);
|
||||||
|
}
|
||||||
|
if (!remoteExists) {
|
||||||
LOG.warn("Remote Root Log Dir [" + this.remoteRootLogDir
|
LOG.warn("Remote Root Log Dir [" + this.remoteRootLogDir
|
||||||
+ "] does not exist. Attempting to create it.");
|
+ "] does not exist. Attempting to create it.");
|
||||||
try {
|
try {
|
||||||
|
@ -465,6 +465,30 @@ public void testVerifyAndCreateRemoteDirsFailure()
|
|||||||
logAggregationService.stop();
|
logAggregationService.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testVerifyAndCreateRemoteDirNonExistence()
|
||||||
|
throws Exception {
|
||||||
|
this.conf.set(YarnConfiguration.NM_LOG_DIRS, localLogDir.getAbsolutePath());
|
||||||
|
File aNewFile = new File(String.valueOf("tmp"+System.currentTimeMillis()));
|
||||||
|
this.conf.set(YarnConfiguration.NM_REMOTE_APP_LOG_DIR,
|
||||||
|
aNewFile.getAbsolutePath());
|
||||||
|
|
||||||
|
DrainDispatcher dispatcher = createDispatcher();
|
||||||
|
LogAggregationService logAggregationService = spy(
|
||||||
|
new LogAggregationService(dispatcher, this.context, this.delSrvc,
|
||||||
|
super.dirsHandler));
|
||||||
|
logAggregationService.init(this.conf);
|
||||||
|
boolean existsBefore = aNewFile.exists();
|
||||||
|
assertTrue("The new file already exists!", !existsBefore);
|
||||||
|
|
||||||
|
logAggregationService.verifyAndCreateRemoteLogDir(this.conf);
|
||||||
|
|
||||||
|
boolean existsAfter = aNewFile.exists();
|
||||||
|
assertTrue("The new aggregate file is not successfully created", existsAfter);
|
||||||
|
aNewFile.delete(); //housekeeping
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void testLogAggregationInitAppFailsWithoutKillingNM() throws Exception {
|
public void testLogAggregationInitAppFailsWithoutKillingNM() throws Exception {
|
||||||
|
Loading…
Reference in New Issue
Block a user