当前位置: 首页 > 知识库问答 >
问题:

对hadoop作业跟踪器api的困惑

艾正浩
2023-03-14

我在试着从工作跟踪器那里收集一些信息。对于初学者,我想从获得正在运行的作业信息开始,如作业id或作业名称等,但已经卡住了,以下是我获得的(打印当前正在运行的作业的作业id):

public static void main(String[] args) throws IOException {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "zk1.myhost,zk2.myhost,zk3.myhost");
        conf.set("hbase.zookeeper.property.clientPort", "2181");

        InetSocketAddress jobtracker = new InetSocketAddress("jobtracker.mapredhost.myhost", 8021);
        JobClient jobClient = new JobClient(jobtracker, conf);
        JobStatus[] jobs = jobClient.jobsToComplete();

        for (int i = 0; i < jobs.length; i++) {
            JobStatus js = jobs[i];
            if (js.getRunState() == JobStatus.RUNNING) {
                JobID jobId = js.getJobID();
                System.out.println(jobId);
            }
        }
    }

当试图显示作业id时,上面的工作很有魅力,但现在我也想显示作业名称。所以我在打印作业id后添加了这一行:

System.out.println(jobClient.getJob(jobId).getJobName());
Exception in thread "main" java.lang.NullPointerException
    at org.apache.hadoop.mapred.JobClient$NetworkedJob.<init>(JobClient.java:226)
    at org.apache.hadoop.mapred.JobClient.getJob(JobClient.java:1080)
    at org.apache.test.JobTracker.main(JobTracker.java:28)

首先从jobClient获取runningjob,然后获取它的名称http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/runningjob.html#getjobname()

以前有人做过这样的事吗?我可以使用jsoup通过GET请求获得这些信息,但我认为这是获得这些信息的更好方法

问题更新这里是我的Hadoop/HBase依赖项:

<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>0.23.1-mr1-cdh4.0.0b2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-core</artifactId>
            <version>0.23.1-mr1-cdh4.0.0b2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>jetty</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase</artifactId>
            <version>0.92.1-cdh4b2-SNAPSHOT</version>
        </dependency>
import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobID;
import org.apache.hadoop.mapred.JobStatus;

以下是system.out.println(jobId)的输出:

job_201207031810_1603

当前只有一个作业在运行。

共有1个答案

穆招
2023-03-14

查看JobClient的内部类NetworkedJob
(来源:/home/user/hadoop/src/mapred/org/apache/hadoop/mapred/jobclient.java)

它的构造函数试图从第225行的JobClient中获取Configuration对象,但它是空的,因为new JobClient(InetSocketAddress jobTrackAddr,Configuration conf)没有设置它:

// Set the completion poll interval from the configuration.
      // Default is 5 seconds.
      Configuration conf = JobClient.this.getConf();
      this.completionPollIntervalMillis = conf.getInt(COMPLETION_POLL_INTERVAL_KEY,
          DEFAULT_COMPLETION_POLL_INTERVAL); //NPE occurs here!

作为解决办法,在创建JobClient对象后手动设置它。这将解决您的问题:

..
JobClient jobClient = new JobClient(jobtracker, conf);
jobClient.setConf(conf); 
....

我通过以下方式实例化了配置对象:

Configuration conf = new Configuration();
conf.addResource(new Path("/path_to/core-site.xml"));
conf.addResource(new Path("/path_to/hdfs-site.xml"));
 类似资料:
  • 当我启动hadoop作业跟踪器和任务跟踪器不工作时。 127.0.1.1 ubuntu.ubuntu-域ubuntu 192.168.2.135主机 192.168.2.250从机 我可以联系到本地主机:50070和主机:50070。但我无法联系localhost:50030或master:50030

  • 问题内容: 问题: 当我将作业提交到hadoop 2.2.0集群时,它没有显示在作业跟踪器中, 但是作业成功完成。 这样,我可以看到输出并且它正在正确运行,并在运行时打印输出。 我尝试了多个选项,但作业跟踪器看不到该作业。如果我使用2.2.0 hadoop运行流作业,它将显示在任务跟踪器中,但是当我通过hadoop-client api提交它时,它不会显示在作业跟踪器中。我正在查看端口8088上的

  • 问题:当我向hadoop 2.2.0集群提交一个作业时,它不会显示在作业跟踪器中,但该作业成功完成了。通过这个,我可以看到输出,它正在正确运行,并在运行时打印输出。 etc/hadoop/core-site.xml

  • 目前,我们使用三个嵌套的Foreach循环来获取运行批处理的信息。然而,我相当确定我们可以通过一个带有连接和子查询的MySQL语句来获取信息。 我们有大约30个类别,2000个用户。我们的目标是大约100个类别,拥有10万用户,尽管很明显Foreach循环并不理想(即使现在运行它们也需要大约一分钟)。 情况:用户希望得到通知,如果有工作可用于他们可以在某一领域做的贸易 目标:将批处理(每日、每周等

  • 我需要向集群中运行的Flink作业添加track和span id,请求流如下所示 使用者-- 我使用Spring Boot来创建我的rest API,并使用Spring Sleuth来添加跟踪和span id到生成的日志中,当调用rest API时添加跟踪和span id,当消息被放在Kakfa-toption-1上时也添加跟踪和span id,但我不能弄清楚如何添加跟踪和跨度ID,同时在Flin

  • 我试图使用grpc客户端的StackDrive/谷歌云跟踪定义在https://github.com/googleapis/googleapis/blob/master/google/devtools/cloudtrace/v1/trace.proto 我正在发送协议 但我得到的唯一回报是这个例外: 同样,我尝试了以下ListTrace请求 并获得: 我对API非常陌生,所以我不知道我在这里做错了