You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-issues@hadoop.apache.org by "yangjun (JIRA)" <ji...@apache.org> on 2013/11/15 02:59:24 UTC

[jira] [Created] (MAPREDUCE-5627) TaskLogServlet could not get syslog

yangjun created MAPREDUCE-5627:
----------------------------------

             Summary: TaskLogServlet could not get syslog
                 Key: MAPREDUCE-5627
                 URL: https://issues.apache.org/jira/browse/MAPREDUCE-5627
             Project: Hadoop Map/Reduce
          Issue Type: Bug
    Affects Versions: 1.2.1
         Environment: Linux version 2.6.18-238.9.1.el5
Java(TM) SE Runtime Environment (build 1.6.0_43-b01)
hadoop-1.2.1
            Reporter: yangjun
            Priority: Minor


When multiply tasks use one jvm and generated logs.
eg.
./attempt_201211220735_0001_m_000000_0:
log.index
./attempt_201211220735_0001_m_000001_0:
log.index
./attempt_201211220735_0001_m_000002_0:
log.index  stderr  stdout  syslog
get from http://xxxxxxxx:50060/tasklog?attemptid= attempt_201211220735_0001_m_000000_0 
could get stderr,stdout,but not the others,include syslog.

see TaskLogServlet.haveTaskLog() method, not check from local && log.index, but check the original path.

resolve:
modify TaskLogServlet haveTaskLog method
    private boolean haveTaskLog(TaskAttemptID taskId, boolean isCleanup,  
            TaskLog.LogName type) throws IOException {  
        File f = TaskLog.getTaskLogFile(taskId, isCleanup, type);  
        if (f.exists() && f.canRead()) {  
            return true;  
        } else {  
            File indexFile = TaskLog.getIndexFile(taskId, isCleanup);  
            if (!indexFile.exists()) {  
                return false;  
            }  
       
       
            BufferedReader fis;  
            try {  
                fis = new BufferedReader(new InputStreamReader(  
                        SecureIOUtils.openForRead(indexFile,  
                                TaskLog.obtainLogDirOwner(taskId))));  
            } catch (FileNotFoundException ex) {  
                LOG.warn("Index file for the log of " + taskId  
                        + " does not exist.");  
       
       
                // Assume no task reuse is used and files exist on attemptdir  
                StringBuffer input = new StringBuffer();  
                input.append(LogFileDetail.LOCATION  
                        + TaskLog.getAttemptDir(taskId, isCleanup) + "\n");  
                for (LogName logName : TaskLog.LOGS_TRACKED_BY_INDEX_FILES) {  
                    input.append(logName + ":0 -1\n");  
                }  
                fis = new BufferedReader(new StringReader(input.toString()));  
            }  
       
       
            try {  
                String str = fis.readLine();  
                if (str == null) { // thefile doesn't have anything  
                    throw new IOException("Index file for the log of " + taskId  
                            + "is empty.");  
                }  
                String loc = str.substring(str.indexOf(LogFileDetail.LOCATION)  
                        + LogFileDetail.LOCATION.length());  
                File tf = new File(loc, type.toString());  
                return tf.exists() && tf.canRead();  
       
       
            } finally {  
                if (fis != null)  
                    fis.close();  
            }  
        }  
       
       
    }  

workaround:
url add filter=SYSLOG could print syslog also.




--
This message was sent by Atlassian JIRA
(v6.1#6144)