Hadoop MapReduce 作业:在本机 jvm 之外获取计数器
Hadoop MapReduce Jobs: Get the counter outside of the native jvm
我是 Hadoop 和 Hbase 的新手。
我的用例非常简单:我想在 运行 时间内得到 reduce input groups
计数(即得到计数器从作业启动到终止更新。
我目前搜索到的内容:所有与作业相关的日志都写在目录 /var/log/hadoop/userlogs
下,如下所示:
[root@dev1-slave1 userlogs]# pwd
/var/log/hadoop/userlogs
[root@dev1-slave1 userlogs]# ll
total 24
drwx--x--- 2 mapred mapred 4096 Jan 13 19:59 job_201501121917_0008
drwx--x--- 2 mapred mapred 4096 Jan 13 11:31 job_201501121917_0009
drwx--x--- 2 mapred mapred 4096 Jan 13 12:01 job_201501121917_0010
drwx--x--- 2 mapred mapred 4096 Jan 13 12:13 job_201501121917_0011
drwx--x--- 2 mapred mapred 4096 Jan 13 12:23 job_201501121917_0012
drwx--x--- 2 mapred mapred 4096 Jan 13 19:59 job_201501121917_0013
每个job
下都有attempt_201501121917_0013_m_000000_0
(mapper日志)和attempt_201501121917_0013_r_000000_0
(reducer日志)等目录。
reducer 日志目录 attempt_201501121917_0013_r_000000_0
包含 syslog
,其中包含有关作业 运行 的信息。但是它没有显示任何关于计数器的信息。
从 hadoop 的 jobtracker UI 中,我可以看到计数器 reduce input groups
正在更新,直到作业完成,但我在其他地方找不到相同的。
我怎样才能做到这一点?是否有任何 Java API 可以在另一个应用程序中获取按作业计算的计数器(不在执行 mapreduce 任务的应用程序中)?
我应该查看的任何其他日志或其他文件?
希望我的要求很明确。
更新:
Hadoop版本:Hadoop 1.0.3-Intel
假设你知道你的工作 ID,你可以通过 ID 查找你的工作(我认为在一段时间内取决于你的集群清理工作历史的时间)。
public long getInputGroups(String jobId, Configuration conf) {
Cluster cluster = new Cluster(conf);
Job job = cluster.getJob(JobID.forName(jobId));
Counters counters = job.getCounters();
Counter counter = counters.findCounter("org.apache.hadoop.mapred.Task$Counter","REDUCE_INPUT_GROUPS");
return counter.getValue();
}
有关更多信息,请参阅 Hadoop:权威指南。
我以不同的方式找到了问题的答案。
代码如下:
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobStatus;
import org.apache.hadoop.conf.Configuration;
import java.net.InetSocketAddress;
import org.apache.hadoop.mapred.Counters;
import org.apache.hadoop.mapred.ClusterStatus;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapred.*;
public class jobclienttest{
public static void main(String args[]){
String jobTrackerHost = "192.168.151.14";
int jobTrackerPort = 54311;
try{
JobClient jobClient = new JobClient(new InetSocketAddress(jobTrackerHost, jobTrackerPort), new Configuration());
JobStatus[] activeJobs = jobClient.jobsToComplete();
for(JobStatus js: activeJobs){
System.out.println(js.getJobID());
RunningJob runningjob = jobClient.getJob(js.getJobID());
Counters counters = runningjob.getCounters();
Counter counter = counters.findCounter("org.apache.hadoop.mapred.Task$Counter","REDUCE_INPUT_GROUPS");
System.out.println(counter.getValue());
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
代码是不言自明的。 Class 名字说明一切。
编译:
javac -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:. jobclienttest.java
运行:
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:. jobclienttest
这给出了计数器的输出。
您也可以从 command-line 中获取计数器而不用写任何 Java:
hadoop job -counter job_id group_name counter_name
或(对于较新的版本)
mapred job -counter job_id group_name counter_name
我是 Hadoop 和 Hbase 的新手。
我的用例非常简单:我想在 运行 时间内得到 reduce input groups
计数(即得到计数器从作业启动到终止更新。
我目前搜索到的内容:所有与作业相关的日志都写在目录 /var/log/hadoop/userlogs
下,如下所示:
[root@dev1-slave1 userlogs]# pwd
/var/log/hadoop/userlogs
[root@dev1-slave1 userlogs]# ll
total 24
drwx--x--- 2 mapred mapred 4096 Jan 13 19:59 job_201501121917_0008
drwx--x--- 2 mapred mapred 4096 Jan 13 11:31 job_201501121917_0009
drwx--x--- 2 mapred mapred 4096 Jan 13 12:01 job_201501121917_0010
drwx--x--- 2 mapred mapred 4096 Jan 13 12:13 job_201501121917_0011
drwx--x--- 2 mapred mapred 4096 Jan 13 12:23 job_201501121917_0012
drwx--x--- 2 mapred mapred 4096 Jan 13 19:59 job_201501121917_0013
每个job
下都有attempt_201501121917_0013_m_000000_0
(mapper日志)和attempt_201501121917_0013_r_000000_0
(reducer日志)等目录。
reducer 日志目录 attempt_201501121917_0013_r_000000_0
包含 syslog
,其中包含有关作业 运行 的信息。但是它没有显示任何关于计数器的信息。
从 hadoop 的 jobtracker UI 中,我可以看到计数器 reduce input groups
正在更新,直到作业完成,但我在其他地方找不到相同的。
我怎样才能做到这一点?是否有任何 Java API 可以在另一个应用程序中获取按作业计算的计数器(不在执行 mapreduce 任务的应用程序中)?
我应该查看的任何其他日志或其他文件?
希望我的要求很明确。
更新:
Hadoop版本:Hadoop 1.0.3-Intel
假设你知道你的工作 ID,你可以通过 ID 查找你的工作(我认为在一段时间内取决于你的集群清理工作历史的时间)。
public long getInputGroups(String jobId, Configuration conf) {
Cluster cluster = new Cluster(conf);
Job job = cluster.getJob(JobID.forName(jobId));
Counters counters = job.getCounters();
Counter counter = counters.findCounter("org.apache.hadoop.mapred.Task$Counter","REDUCE_INPUT_GROUPS");
return counter.getValue();
}
有关更多信息,请参阅 Hadoop:权威指南。
我以不同的方式找到了问题的答案。
代码如下:
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobStatus;
import org.apache.hadoop.conf.Configuration;
import java.net.InetSocketAddress;
import org.apache.hadoop.mapred.Counters;
import org.apache.hadoop.mapred.ClusterStatus;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapred.*;
public class jobclienttest{
public static void main(String args[]){
String jobTrackerHost = "192.168.151.14";
int jobTrackerPort = 54311;
try{
JobClient jobClient = new JobClient(new InetSocketAddress(jobTrackerHost, jobTrackerPort), new Configuration());
JobStatus[] activeJobs = jobClient.jobsToComplete();
for(JobStatus js: activeJobs){
System.out.println(js.getJobID());
RunningJob runningjob = jobClient.getJob(js.getJobID());
Counters counters = runningjob.getCounters();
Counter counter = counters.findCounter("org.apache.hadoop.mapred.Task$Counter","REDUCE_INPUT_GROUPS");
System.out.println(counter.getValue());
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
代码是不言自明的。 Class 名字说明一切。
编译:
javac -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:. jobclienttest.java
运行:
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:. jobclienttest
这给出了计数器的输出。
您也可以从 command-line 中获取计数器而不用写任何 Java:
hadoop job -counter job_id group_name counter_name
或(对于较新的版本)
mapred job -counter job_id group_name counter_name