在集群中查看Task日志的方法,一般有两个:
1,通过Hadoop提供的WebConsole,直接在页面中追踪查看;
2,到集群中运行该task的节点上,查看日志文件。每个tasktracker子进程都会用log4j产生三个日志文件,分别是syslog,stdout,stderr。这些日志文件存放到%HADOOP_LOG_DIR%目录下的userlogs的子目录中。但是通过该方法,需要追踪到哪个节点运行了该task。
下面,通过使用JobClient,以及JobClient的几个私有方法(displayTaskLogs()、getTaskLogs()、getTaskLogURL(),方法参数省略,具体见代码),来获取日志信息。代码如下:
package myTest; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapred.*; import java.io.*; public class test { static String getTaskLogURL(TaskAttemptID taskId, String baseUrl) { return (baseUrl + "/tasklog?plaintext=true&attemptid=" + taskId); } //JobClient中的该方法,没有Writer参数,这是为了得到输出流加的 private static void displayTaskLogs(TaskAttemptID taskId, String baseUrl, Writer sw) throws IOException { // The tasktracker for a 'failed/killed' job might not be around... if (baseUrl != null) { // Construct the url for the tasklogs String taskLogUrl = getTaskLogURL(taskId, baseUrl); // Copy task's stderr to stderr of the JobClient getTaskLogs(taskId, new URL(taskLogUrl+"&filter=stderr"), sw); } } //JobClient中的该方法,参数不是Writer类型,而是OutputStream类型,直接打印到控制台。 private static void getTaskLogs(TaskAttemptID taskId, URL taskLogUrl, Writer out) { try { URLConnection connection = taskLogUrl.openConnection(); connection.setReadTimeout(1000000); connection.setConnectTimeout(1000000); BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream())); BufferedWriter output = new BufferedWriter(out); try { String logData = null; while ((logData = input.readLine()) != null) { if (logData.length() > 0) { output.write(taskId + ": " + logData + "\n"); output.flush(); } } } finally { input.close(); } }catch(IOException ioe){ System.out.println("Error reading task output" + ioe.getMessage()); } } public static void main(String[] args) throws IOException, InterruptedException { Configuration conf = new Configuration(); conf.addResource(new Path("conf/mapred-site.xml")); conf.addResource(new Path("conf/core-site.xml")); conf.addResource(new Path("conf/hdfs-site.xml")); //输出配置文件的所有属性 // for (Map.Entry<String, String> entry : conf) { // System.out.println(entry.getKey() + "\t=\t" + entry.getValue()); // } JobConf job = new JobConf(conf); JobClient jc = new JobClient(job); jc.init(job); JobID jobIdNew = new JobID("201304151829", 6316); RunningJob runJob = jc.getJob(jobIdNew); StringWriter sw = new StringWriter(); TaskCompletionEvent[] events = runJob.getTaskCompletionEvents(0); for(TaskCompletionEvent event : events){ displayTaskLogs(event.getTaskAttemptId(), event.getTaskTrackerHttp(), sw); } System.out.println(sw.toString()); // /** // * mapProgress()/reduceProgress() // * result:1.0 // */ // System.out.println(runJob.mapProgress()); // System.out.println(runJob.reduceProgress()); // // // /**getTrackingURL() // * result: // * http://baby6:35030/jobdetails.jsp?jobid=job_201304151829_5768 // */ // System.out.println(runJob.getTrackingURL()); // // // /**displayTasks() // * result: // * attempt_201304151829_5768_m_000000_0 // */ // jc.displayTasks(jobIdNew, "map", "completed"); // // /** // * 获取集群中taskTracker个数 // */ // System.out.println(jc.getClusterStatus().getTaskTrackers()); /** *获取集群中活着的节点名称 */ // Collection<String> c = jc.getClusterStatus(true).getActiveTrackerNames(); // Iterator it = c.iterator(); // while (it.hasNext()) { // System.out.println(it.next()); // } // JobStatus[] jobs = jc.getAllJobs(); // System.out.println(jobs.length); } }
注:该方法只能获取的到非历史Job的日志信息,如果该job已经变成History job时,获取为空。
一般一个job经过24小时会变成history job,这个可以在集群中设置。
相关推荐
Hadoop的MapTask类源代码分析
Hadoop的MapTask辅助类源代码分析(I)
hadoop 1.2 api 伪中文版。支持即时查询,高级查询。方便编码学习。 大数据炙手可热!hadoop是一个大数据分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分...
C#代码 内有 WEBAPI 凑齐50个字
Hadoop的Task类源代码分析
Hadoop中的MapTask辅助类的源代码分析(II)
MapTask辅助类源代码分析III\ Hadoop
Task的内部类和辅助类的Hadoop源代码分析
017 查看Hadoop 日志以及日志的格式和命名组成 018 Hadoop 守护进程服务三种启动停止方式 019 测试环境(HDFS Shell基本命令和运行WordCount程序) 020 结合WordCount实例讲解Hadoop的数据存储和数据计算 021 Hadoop ...
在Master上运行的是JobTracker守护进程,而在Slave上运行的是TaskTracker守护进程。对于一个作业,首先提交给JobTracker,再由JobTracker对提交的作业进行处理。
NLPCC2014task1和task2数据集资源NLPCC2014task1和task2数据集资源NLPCC2014task1和task2数据集资源NLPCC2014task1和task2数据集资源NLPCC2014task1和task2数据集资源NLPCC2014task1和task2数据集资源NLPCC2014task1...
任务管理OS_TASK.C(API) 时钟管理OS_TIME.C(API) 信号量 OS_SEM.C(API)-The task management OS_TASK.C (API) the clock management OS_TIME.C (API) the semaphore OS_SEM.C (API)
此网络任务作为如何从Auth0 API中提取日志并将其推送到第三方产品的示例。 特别是在此示例中,我们将日志推送到 。 为了运行示例,您将需要: Auth0凭证:域,clientId和clientSecret Loggly凭证:客户令牌 想法...
用golang写的task计划任务,任务类型前期只支持访问url,可以作为监控使用.可以使用邮件通知~~~正在完善中
API-task-week1
通过程序调用TaskFlow
C#多线程并行管理,通过Task实现,可对单个任务进行暂停,继续以及停止等操作,每个任务均有单独的进度条显示 同时执行的任务个数可以自行设置
介绍了在FACEBOOK 的中使用HADOOP 进行TASK 调度的情况
Independent Task Scheduling
jbpm 流的控制 过程 task 实体流的定义