2012-05-22 51 views
5

Tôi đang cố gắng chạy ví dụ đường đi ngắn nhất từ ​​lồng ấp hình chữ nhật (https://cwiki.apache.org/confluence/display/GIRAPH/Shortest+Paths+Example). Tuy nhiên thay vì thực hiện ví dụ từ hình vẽ - * - dependencies.jar, tôi đã tạo ra công việc của mình. Khi tôi tạo ra một tập tin công việc duy nhất là trình bày trong ví dụ này, tôi đã nhận đượcVí dụ đường dẫn ngắn nhất của đường dẫn LớpNotFoundException

java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.Test$SimpleShortestPathsVertexInputFormat 

Sau đó, tôi đã chuyển các lớp bên trong (SimpleShortestPathsVertexInputFormat và SimpleShortestPathsVertexOutputFormat) để tách các file và đổi tên chúng chỉ trong trường hợp (SimpleShortestPathsVertexInputFormat_v2, SimpleShortestPathsVertexOutputFormat_v2); các lớp học không phải là tĩnh nữa. Điều này đã giải quyết các vấn đề của lớp không tìm thấy cho SimpleShortestPathsVertexInputFormat_v2, tuy nhiên tôi vẫn nhận được lỗi tương tự cho SimpleShortestPathsVertexOutputFormat_v2. Dưới đây là dấu vết ngăn xếp của tôi.

INFO mapred.JobClient: Running job: job_201205221101_0003 
INFO mapred.JobClient: map 0% reduce 0% 
INFO mapred.JobClient: Task Id : attempt_201205221101_0003_m_000005_0, Status : FAILED 
    java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.utils.SimpleShortestPathsVertexOutputFormat_v2 
      at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:898) 
      at org.apache.giraph.graph.BspUtils.getVertexOutputFormatClass(BspUtils.java:134) 
      at org.apache.giraph.bsp.BspOutputFormat.getOutputCommitter(BspOutputFormat.java:56) 
      at org.apache.hadoop.mapred.Task.initialize(Task.java:490) 
      at org.apache.hadoop.mapred.MapTask.run(MapTask.java:352) 
      at org.apache.hadoop.mapred.Child$4.run(Child.java:259) 
      at java.security.AccessController.doPrivileged(Native Method) 
      at javax.security.auth.Subject.doAs(Subject.java:415) 
      at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) 
      at org.apache.hadoop.mapred.Child.main(Child.java:253) 
    Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.utils.SimpleShortestPathsVertexOutputFormat_v2 
      at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:866) 
      at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:890) 
      ... 9 more 

Tôi đã kiểm tra công việc của mình và tất cả các lớp học đều có ở đó. Hơn nữa tôi đang sử dụng hadoop 0.20.203 trong một chế độ phân tán giả. Cách tôi khởi động công việc của tôi được trình bày dưới đây.

hadoop jar giraphJobs.jar org.test.giraph.Test -libjars /path/to/giraph-0.2-SNAPSHOT-jar-with-dependencies.jar /path/to/input /path/to/output 0 3 

Ngoài ra tôi đã xác định HADOOP_CLASSPATH cho hình - * - dependencies.jar. Tôi có thể chạy ví dụ PageRankBenchmark mà không có vấn đề gì (trực tiếp từ giraph - * - dependencies.jar), và ví dụ về đường dẫn ngắn cũng hoạt động tốt (cũng trực tiếp từ hình vẽ - * - dependencies.jar). Các công việc hadoop khác hoạt động mà không có vấn đề gì (một nơi nào đó tôi đã đọc để kiểm tra xem "cluster" của tôi có hoạt động chính xác không). Có ai gặp vấn đề tương tự không? Bất kỳ trợ giúp sẽ được đánh giá cao.


Giải pháp (xin lỗi để viết nó như thế này nhưng tôi không thể trả lời câu hỏi của riêng tôi cho một vài giờ nữa)

Để giải quyết vấn đề này tôi đã có thêm tôi jar Job đến -libjars (không có thay đổi đối với HADOOP_CLASSPATH khi được tạo). Lệnh để khởi chạy công việc bây giờ trông như thế này.

hadoop jar giraphJobs.jar org.test.giraph.Test -libjars /path/to/giraph-0.2-SNAPSHOT-jar-with-dependencies.jar,/path/to/job.jar /path/to/input /path/to/output 0 3 

Danh sách các lọ phải được tách nhau bằng dấu phẩy. Mặc dù điều này đã giải quyết được vấn đề của tôi. Tôi vẫn còn tò mò tại sao tôi phải vượt qua công việc của tôi jar như là một "classpath" tham số? Ai đó có thể giải thích cho tôi những gì là hợp lý đằng sau này? Như tôi thấy nó lạ (để nói rằng ít nhất) để gọi jar công việc của tôi và sau đó vượt qua nó một lần nữa như là một "classpath" jar. Tôi thực sự tò mò về lời giải thích.

Trả lời

3

Tôi đã tìm thấy giải pháp thay thế có lập trình cho vấn đề. Chúng ta cần phải thay đổi phương thức run() theo cách sau -

... 
@Override 
public int run(String[] argArray) throws Exception { 
    Preconditions.checkArgument(argArray.length == 4, 
     "run: Must have 4 arguments <input path> <output path> " + 
     "<source vertex id> <# of workers>"); 

    GiraphJob job = new GiraphJob(getConf(), getClass().getName()); 
    // This is the addition - it will make hadoop look for other classes in the same  jar that contains this class 
    job.getInternalJob().setJarByClass(getClass()); 
    job.setVertexClass(getClass()); 
    ... 
} 

setJarByClass() sẽ làm cho hadoop nhìn cho các lớp còn thiếu trong quá jar cùng có chứa các lớp trả về bởi getClass(), và chúng tôi sẽ không cần phải thêm tên công việc riêng biệt vào tùy chọn -libjars.

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