2013-04-23 43 views
1

當我們通過Hadoop運行數據密集型作業時。 Hadoop執行作業。 現在我想要的是工作完成時。它會給我有關 執行工作的統計數字,耗時,映射器數量,減速器數量和其他有用信息。如何獲取由Hadoop執行的完成作業統計信息?

在作業執行過程中,瀏覽器中顯示的信息(如作業跟蹤器,數據節點)。 但是我怎樣才能在我的應用程序中獲得統計數據,這個統計數據在Hadoop上運行,並在結束工作時給我提供了一個報告結果。我的應用程序是在JAVA

任何API都可以幫助我。 建議將不勝感激。

回答

0

Chirs是正確的。 TaskReport的文檔指出org.apache.hadoop.mapred.TaskReportorg.apache.hadoop.mapreduce.TaskReport繼承這些方法。所以,人們可以得到這樣的價值。

以下是用於獲取作業的開始和結束時間的代碼,按照每個Map和Reduce任務分組。

import org.apache.hadoop.mapred.JobClient; 
import org.apache.hadoop.mapred.JobStatus; 
import org.apache.hadoop.conf.Configuration; 
import java.net.InetSocketAddress; 
import java.util.*; 
import org.apache.hadoop.mapred.TaskReport; 
import org.apache.hadoop.mapred.RunningJob; 
import org.apache.hadoop.util.StringUtils; 
import java.text.SimpleDateFormat; 

public class mini{ 
     public static void main(String args[]){ 
       String jobTrackerHost = "192.168.151.14"; 
       int jobTrackerPort = 54311; 

       try{ 
         Configuration conf = new Configuration(); 
         JobClient jobClient = new JobClient(new InetSocketAddress(jobTrackerHost, jobTrackerPort), conf); 
         JobStatus[] activeJobs = jobClient.jobsToComplete(); 
         SimpleDateFormat dateFormat = new SimpleDateFormat("d-MMM-yyyy HH:mm:ss"); 
         for(JobStatus js: activeJobs){ 
           System.out.println(js.getJobID()); 
           RunningJob runningjob = jobClient.getJob(js.getJobID()); 
              while(runningjob.isComplete() == false){ /*Wait till the job completes.*/} 
           TaskReport[] maptaskreports = jobClient.getMapTaskReports(js.getJobID()); 
           for(TaskReport tr: maptaskreports){ 
             System.out.println("Task ID: "+tr.getTaskID()+" Start TIme: "+StringUtils.getFormattedTimeWithDiff(dateFormat, tr.getStartTime(), 0)+" Finish Time: "+StringUtils.getFormattedTimeWithDiff(dateFormat, tr.getFinishTime(), tr.getStartTime())); 
           } 
           TaskReport[] reducetaskreports = jobClient.getReduceTaskReports(js.getJobID()); 
           for(TaskReport tr: reducetaskreports){ 
             System.out.println("Task ID: "+tr.getTaskID()+" Start TIme: "+StringUtils.getFormattedTimeWithDiff(dateFormat, tr.getStartTime(), 0)+" Finish Time: "+StringUtils.getFormattedTimeWithDiff(dateFormat, tr.getFinishTime(), tr.getStartTime())); 
           } 

         } 
       }catch(Exception ex){ 
         ex.printStackTrace(); 
       } 
     } 
} 

這是一個簡單的例子來獲得一個正在運行的作業的開始時間和結束時間。你可以按照你想要的方式。

這裏是「Word Count」MapReduce作業的這個程序的運行。

[[email protected] ~]# java -classpath /usr/lib/hadoop/hadoop-core.jar:/usr/lib/hadoop/lib/jackson-core-asl-1.8.8.jar:/usr/lib/hadoop/lib/jackson-mapper-asl-1.8.8.jar:/usr/lib/hadoop/lib/commons-logging-1.1.1.jar:/usr/lib/hadoop/lib/commons-configuration-1.6.jar:/usr/lib/hadoop/lib/commons-lang-2.4.jar:. mini 
job_201501151144_0042 
Task ID: task_201501151144_0042_m_000000 Start TIme: 16-Jan-2015 17:07:35 Finish Time: 16-Jan-2015 17:07:43 (7sec) 
Task ID: task_201501151144_0042_m_000001 Start TIme: 16-Jan-2015 17:07:35 Finish Time: 16-Jan-2015 17:07:56 (20sec) 
Task ID: task_201501151144_0042_m_000002 Start TIme: 16-Jan-2015 17:07:35 Finish Time: 16-Jan-2015 17:07:43 (7sec) 
Task ID: task_201501151144_0042_m_000003 Start TIme: 16-Jan-2015 17:07:43 Finish Time: 16-Jan-2015 17:07:53 (10sec) 
Task ID: task_201501151144_0042_m_000004 Start TIme: 16-Jan-2015 17:07:43 Finish Time: 16-Jan-2015 17:07:53 (10sec) 
Task ID: task_201501151144_0042_r_000000 Start TIme: 16-Jan-2015 17:07:43 Finish Time: 16-Jan-2015 17:08:00 (17sec) 
Task ID: task_201501151144_0042_r_000001 Start TIme: 16-Jan-2015 17:07:43 Finish Time: 16-Jan-2015 17:08:05 (22sec) 
Task ID: task_201501151144_0042_r_000002 Start TIme: 16-Jan-2015 17:07:43 Finish Time: 16-Jan-2015 17:08:05 (21sec) 

其良好的在其mapreduce/src/webapps/job/目錄中打開的Hadoop所需jsp文件,並找出JobTracker的Web UI中是如何顯示的信息。

我從jobtasks.jsp得到了上面的代碼。

希望它有幫助。 :)