2012-09-04 22 views
20

Tôi đang cố gắng thu thập một số thông tin từ trình theo dõi công việc. Đối với người mới bắt đầu, tôi muốn bắt đầu với việc chạy thông tin công việc như id công việc hoặc tên công việc v.v. Nhưng đã bị kẹt, đây là những gì tôi có (in ra id công việc cho công việc hiện đang chạy):Lẫn lộn về công việc theo dõi công việc của người bán 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); 
      } 
     } 
    } 

Điều này trên hoạt động như sự quyến rũ khi cố gắng hiển thị id công việc, nhưng bây giờ tôi cũng muốn hiển thị tên công việc. Vì vậy, tôi đã thêm dòng này sau id công việc in ấn:

System.out.println(jobClient.getJob(jobId).getJobName()); 

tôi nhận được ngoại lệ này:

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 không phải là null. Tôi biết điều này bởi vì tôi đã thử với kiểm tra nếu không có tuyên bố, nhưng điều này jobClient.getJob(jobId)null. Tôi làm gì sai ở đây?

Theo API tôi nên ok,

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

Đầu tiên có được RunningJob từ jobClient hơn một khi bạn đã chạy công việc sau đó nhận được đó là tên http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/RunningJob.html#getJobName()

Bất cứ ai đã làm một cái gì đó như thế này trước đây chưa? Tôi có thể sử dụng jsoup để nhận được yêu cầu GET về thông tin này nhưng tôi nghĩ đây là cách tốt hơn để có được thông tin này.

Câu hỏi cập nhật ở đây là hadoop/HBase phụ thuộc của tôi:

<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 cập nhật:

Dưới đây là hàng nhập khẩu của tôi:

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; 

Dưới đây là sản phẩm của System.out.println(jobId):

job_201207031810_1603 

Chỉ có một công việc hiện đang chạy.

+1

Phiên bản nào bạn đang sử dụng? 0,21 như trong liên kết tài liệu của bạn? –

+0

hi Thomas là quan sát tốt tôi sẽ cập nhật câu hỏi của tôi –

+0

Vì vậy, cụm của bạn chạy trên 0,23,1 từ CDH4 như phụ thuộc của bạn? –

Trả lời

17

Hãy xem lớp bên trong NetworkedJob của JobClient.
(nguồn: /home/user/hadoop/src/mapred/org/apache/hadoop/mapred/JobClient.java)

constructor của nó cố gắng để lấy đối tượng Configuration từ JobClient trong dòng 225 nhưng nó rỗng từ new JobClient(InetSocketAddress jobTrackAddr, Configuration conf) không được đặt:

// 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! 

Cách giải quyết khác, đặt thủ công sau khi tạo đối tượng JobClient.Điều này sẽ giải quyết vấn đề của bạn:

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

Sidenote:

tôi instantiated đối tượng Configuration qua:

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

Quan sát tuyệt vời Sir! hoạt động nếu bạn setConf theo cách thủ công thành jobClient, không thể chỉ định bounty chưa –

+0

@GandalfStormCrow bạn có thể trao tiền thưởng bất kỳ lúc nào bằng cách nhấp vào nút nhỏ +250 bên cạnh câu trả lời của Lorand – HypnoticSheep

Các vấn đề liên quan