Подтвердить что ты не робот

Замешательство над hadoop job tracker api

Я пытаюсь собрать некоторую информацию из трекера задания. Для начала я хотел бы начать с получения информации о рабочих заданиях, таких как идентификатор задания или имя задания и т.д. Но уже застрял, вот что у меня (распечатывает идентификаторы работы для текущих рабочих заданий):

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

Этот выше работает как прелесть при попытке отобразить идентификатор задания, но теперь я хочу также показать название задания. Поэтому я добавил эту строку после печати идентификатора задания:

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 не null. Я знаю это, потому что я попытался с нулевой проверкой, если оператор, но этот jobClient.getJob(jobId) равен null. Что я здесь делаю неправильно?

В соответствии с API я должен быть в порядке,

http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/JobClient.html#getJob(org.apache.hadoop.mapred.JobID)

Сначала получайте RunningJob из jobClient, чем когда-то у вас есть работающее задание, затем получите его имя 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>

Обновление Bounty:

Вот мой импорт:

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

В настоящее время выполняется только одно задание.

4b9b3361

Ответ 1

Посмотрите на внутренний класс NetworkedJob JobClient.
(источник:/home/user/hadoop/src/mapred/org/apache/hadoop/mapred/JobClient.java)

Его конструктор пытается извлечь объект Configuration из JobClient в строке 225, но он равен нулю, поскольку 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); 
....

Sidenote:

Я создал объект Configuration через:

Configuration conf = new Configuration();
conf.addResource(new Path("/path_to/core-site.xml"));
conf.addResource(new Path("/path_to/hdfs-site.xml"));