2012-11-05 31 views
5

Vì vậy, tôi cần hai tập tin như một đầu vào cho chương trình MapReduce của tôi: City.dat và Country.datHadoop MapReduce file nhiều Input

Trong phương pháp im chính của tôi phân tích các đối số dòng lệnh như thế này:

Path cityInputPath = new Path(args[0]); 
Path countryInputPath = new Path(args[1]); 
Path outputPath = new Path(args[2]); 
MultipleInputs.addInputPath(job, countryInputPath, TextInputFormat.class, JoinCountryMapper.class); 
MultipleInputs.addInputPath(job, cityInputPath, TextInputFormat.class, JoinCityMapper.class); 
FileOutputFormat.setOutputPath(job, outputPath); 

Nếu bây giờ tôi đang chạy programm của tôi với lệnh sau:

hadoop jar capital.jar org.myorg.Capital /user/cloudera/capital/input/City.dat /user/cloudera/capital/input/Country.dat /user/cloudera/capital/output 

tôi nhận được lỗi sau:

Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory /user/cloudera/capital/input/Country.dat already exists 

Tại sao nó coi đây là thư mục đầu ra của tôi? Tôi đã chỉ định một thư mục khác làm thư mục đầu ra. Ai đó có thể giải thích điều này?

+2

Bạn có thể thay đổi dòng tiêu đề câu hỏi vì nó gây nhầm lẫn cho bất kỳ ai đang trải qua câu hỏi này lần đầu tiên. –

Trả lời

6

Dựa trên stacktrace, thư mục đầu ra của bạn không trống. Vì vậy, điều đơn giản nhất là thực sự để xóa nó trước khi chạy công việc:

bin/hadoop fs -rmr /user/cloudera/capital/output 

Bên cạnh đó, lập luận của bạn bắt đầu với classname của lớp chính của bạn org.myorg.Capital. Vì vậy, đó là đối số về chỉ số thứ 0. (Dựa trên stacktrace và mã bạn đã cung cấp).

Về cơ bản bạn cần phải thay đổi tất cả các chỉ số của bạn một đến quyền:

Path cityInputPath = new Path(args[1]); 
Path countryInputPath = new Path(args[2]); 
Path outputPath = new Path(args[3]); 
MultipleInputs.addInputPath(job, countryInputPath, TextInputFormat.class, JoinCountryMapper.class); 
MultipleInputs.addInputPath(job, cityInputPath, TextInputFormat.class, JoinCityMapper.class); 
FileOutputFormat.setOutputPath(job, outputPath); 

Đừng quên để xóa thư mục đầu ra của bạn mặc dù!

Ngoài ra một mẹo nhỏ cho bạn, bạn có thể tách các tập tin với dấu phẩy "" vì vậy bạn có thể thiết lập chúng với một cuộc gọi duy nhất như thế này:

hadoop jar capital.jar org.myorg.Capital /user/cloudera/capital/input/City.dat,/user/cloudera/capital/input/Country.dat 

Và trong mã java của bạn:

FileInputFormat.addInputPaths(job, args[1]); 
+0

Điều đó thật lạ vì tôi luôn bắt đầu các chương trình của mình bằng lệnh này và nó không bao giờ coi org.myorg.Class là đối số thứ 0. Việc chuyển tất cả các chỉ số của tôi sẽ dẫn đến cùng một lỗi. Và thư mục đầu ra của tôi cũng không tồn tại. Vấn đề là nó nghĩ /user/cloudera/input/Country.dat là thư mục đầu ra của tôi ... Đó là lý do tại sao nó không rỗng. Câu hỏi đặt ra là tại sao nó lại nghĩ rằng đây là thư mục đầu ra của tôi. – gaussd

+0

Nếu nó dẫn đến cùng một lỗi chính xác, bạn không chạy mã bạn đã cung cấp. –

+0

Theo như tôi đã làm việc với các vấn đề, @gaussd là đúng. org.myorg.Capital không phải là phần tử thứ 0 trong args. Nó chỉ nói rằng "Bắt đầu với lớp org.myorg.Capital trong tệp capital.jar" .. – pk10

1

Điều đang xảy ra ở đây là tên lớp được coi là đối số đầu tiên!

Theo mặc định, đối số phi tùy chọn đầu tiên là tên của lớp cần được gọi. Nên sử dụng tên lớp học đầy đủ. Nếu tùy chọn -jar được chỉ định, đối số phi tùy chọn đầu tiên là tên của một tệp nén JAR chứa lớp f và lớp tài nguyên cho ứng dụng, với lớp khởi động được chỉ ra bởi tiêu đề biểu thức lớp chính.

Vì vậy, tôi khuyên bạn nên add a Manifest files to your jar nơi bạn chỉ định lớp chính. file MANIFEST.MF của bạn có thể trông giống như:

Manifest-Version: 1.0 
Main-Class: org.myorg.Capital 

Và bây giờ lệnh của bạn sẽ trông như thế:

hadoop jar capital.jar /user/cloudera/capital/input/City.dat /user/cloudera/capital/input/Country.dat /user/cloudera/capital/output 

Bạn có thể chắc chắn chỉ cần thay đổi các giá trị chỉ số được sử dụng trong mã của bạn nhưng đó không phải là giải pháp thích hợp.

0

bạn có thể thử này:

hadoop jar capital.jar/người dùng/Cloudera/vốn/input/người dùng/Cloudera/vốn/đầu ra

này nên đọc tất cả các file trong thư mục đầu vào duy nhất.

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