HadoopMapReduce作业:获取本机jvm外部的计数器

igetnqfo  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(315)

我对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 (Map器日志)和 attempt_201501121917_0013_r_000000_0 (减速器日志)。
还原程序日志目录 attempt_201501121917_0013_r_000000_0 包含 syslog 其中包含有关作业运行的信息。但它没有显示任何关于柜台的信息。
从hadoop的jobtracker ui中,我可以看到计数器 reduce input groups 正在更新,直到工作完成,但我找不到同样的其他地方。
我怎样才能做到这一点?在另一个应用程序中(不是在执行mapreduce任务的应用程序中)是否有任何JavaAPI来获取作业计数器?
我还需要查看其他日志或文件吗?
我希望我的要求是明确的。
更新:
hadoop版本:hadoop 1.0.3-intel

bkhjykvo

bkhjykvo1#

也可以从命令行获取计数器,而无需编写任何java:

hadoop job -counter job_id group_name counter_name

或(对于较新版本)

mapred job -counter job_id group_name counter_name
xa9qqrwz

xa9qqrwz2#

我用另一种方式找到了问题的答案。
以下是代码:

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();
                }
        }
}

代码是不言自明的。类名自言自语。
编译:

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

这就是计数器的输出。

s4chpxco

s4chpxco3#

假设您知道您的作业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_I‌​NPUT_GROUPS");
    return counter.getValue();
}

更多阅读请参见hadoop:权威指南。

相关问题