2012-04-11 26 views
6

Tôi đã nhập đầu vào cho trình ánh xạ từ hệ thống tệp cục bộ. Nó đang chạy thành công từ nhật thực, nhưng không chạy từ cụm sao vì không thể tìm thấy đầu vào cục bộ đường dẫn nói: đường dẫn đầu vào không tồn tại. Xin vui lòng ai cũng có thể giúp tôi làm thế nào để cung cấp cho một đường dẫn tập tin địa phương để một người lập bản đồ để nó có thể chạy trong cụm và tôi có thể nhận được đầu ra trong hdfsChạy thư mục hệ thống tệp cục bộ làm đầu vào của Trình ánh xạ trong cụm

Trả lời

3

Chạy trong một cụm yêu cầu dữ liệu được tải vào bộ nhớ phân tán (HDFS). Sao chép dữ liệu vào HDFS trước tiên bằng cách sử dụng hadoop fs -copyFromLocal và sau đó cố gắng trun công việc của bạn lần nữa, cung cấp cho nó đường dẫn dữ liệu trong HDFS

+0

Nhưng nếu tôi muốn cung cấp tệp cục bộ làm đầu vào của bản đồ giảm thông qua chương trình java, thì tôi nên xác định nó như thế nào trong chương trình java để chạy nó trong cluster? – user1326784

+1

Sau khi bạn tải tệp lên HDFS, sau đó bạn định cấu hình tệp đó trong mã Trình điều khiển bằng cách sử dụng phương thức tiện ích của định dạng nhập, chẳng hạn như 'TextInputFormat.addInputPaths (job,"/path/to/file/in/hdfs ");' –

0

Dữ liệu phải có trên HDFS cho bất kỳ công việc MapReduce nào để xử lý. Vì vậy, ngay cả khi bạn có một nguồn như hệ thống tệp cục bộ hoặc đường dẫn mạng hoặc cửa hàng dựa trên web (chẳng hạn như lưu trữ Azure Blob hoặc kho lưu trữ khối Amazon), bạn cần phải sao chép dữ liệu ở HDFS trước và sau đó chạy lệnh in. Điểm mấu chốt là bạn cần đẩy dữ liệu đầu tiên đến HDFS và có một số cách phụ thuộc vào nguồn dữ liệu, bạn sẽ thực hiện truyền dữ liệu từ nguồn của bạn sang HDFS chẳng hạn như từ hệ thống tệp cục bộ bạn sẽ sử dụng lệnh sau :

$ hadoop -f CopyFromLocal SourceFileOrStoragePath _HDFS__Or_directPathatHDFS_

+1

Nhưng nếu tôi muốn cung cấp cho các tập tin địa phương như là đầu vào của bản đồ-giảm thông qua một chương trình java, sau đó làm thế nào tôi nên xác định nó trong chương trình java để chạy nó trong cluster? – user1326784

1

câu hỏi đặt ra là một trong những thú vị. Người ta có thể có dữ liệu trên S3 và truy cập dữ liệu này mà không có một bản sao rõ ràng để HDFS trước khi chạy công việc. Trong ví dụ Số từ, người ta sẽ chỉ định này như sau:

hadoop jar dụ .jar Số từ s3n://bucket/input s3n://bucket/output

gì xảy ra ở đây là rằng người vẽ bản đồ đọc hồ sơ trực tiếp từ S3.

Nếu điều này có thể được thực hiện với S3, tại sao không Hadoop tương tự, sử dụng cú pháp này thay vì s3n

file:///input file:///output 

? Tuy nhiên, theo kinh nghiệm, điều này dường như thất bại một cách thú vị - tôi thấy rằng Hadoop cho một tập tin không tìm thấy ngoại lệ cho một tập tin thực sự nằm trong thư mục đầu vào. Quay lại đầu trang |||| Nghĩa là, có vẻ như có thể liệt kê các tệp trong thư mục đưa vào đĩa cục bộ của tôi nhưng khi đến lúc mở chúng để đọc các bản ghi, tệp không được tìm thấy (hoặc có thể truy cập được).

+0

Trên thực tế, đã thảo luận về điều này, câu trả lời không phải là dữ liệu đầu tiên phải có trong HDFS mà chỉ đơn giản là những người lập bản đồ Hadoop không có cách nào để lấy các bản ghi có trong các tệp cục bộ; không có máy chủ nhất thiết phải chạy trên máy cục bộ và không có cách nào để chỉ định máy chủ cho Hadoop. – Jeff

0

Hãy thử thiết lập con đường đầu vào như

FileInputFormat.addInputPath (conf, Path mới (file: /// thư mục trên hệ thống tập tin địa phương của bạn)) này;

nếu bạn cung cấp phần mở rộng tệp, tệp có thể truy cập tệp từ hệ thống địa phương

3

Đây là câu hỏi rất cũ. Gần đây phải đối mặt với cùng một vấn đề. Tôi không biết làm thế nào chính xác giải pháp này là nó làm việc cho tôi mặc dù. Xin vui lòng mang đến để thông báo nếu có bất kỳ nhược điểm này.Đây là những gì tôi đã làm.

Reading a solution from the mail-archives, tôi nhận ra nếu tôi sửa đổi fs.default.name từ hdfs://localhost:8020/ thành file:/// nó có thể truy cập hệ thống tệp cục bộ. Tuy nhiên, tôi không muốn điều này cho tất cả các công việc của tôi. Vì vậy, tôi đã tạo một bản sao của core-site.xml trong một thư mục hệ thống cục bộ (giống như thư mục mà tôi sẽ gửi bình MR của tôi đến hadoop jar).

và trong lớp Driver tôi cho MR Tôi nói thêm,

Configuration conf = new Configuration(); 
conf.addResource(new Path("/my/local/system/path/to/core-site.xml")); 
conf.addResource(new Path("/usr/lib/hadoop-0.20-mapreduce/conf/hdfs-site.xml")); 

Các MR có đầu vào từ hệ thống địa phương và ghi đầu ra để hdfs:

+0

Tôi có một cụm nút 3. Tôi muốn đọc tệp từ hệ thống tệp cục bộ của máy 1.Tôi làm cách nào để thực hiện việc này>? – TKHN

0

Tôi đã thử đoạn mã sau và có những giải pháp .. Vui lòng thử và cho tôi biết ..

Bạn cần nhận đối tượng FileSystem cho hệ thống tệp cục bộ và sau đó sử dụng phương pháp giả mạo để trả lại pa th .. Như chúng ta cần phải vượt qua đường dẫn của hệ thống tập tin địa phương (không có cách nào khác để vượt qua điều này để inputformat), tôi đã sử dụng làm cho đủ điều kiện, mà trong hành động chỉ trả về đường dẫn hệ thống tập tin địa phương. .

Configuration conf = new Configuration(); 
FileSystem fs = FileSystem.getLocal(conf); 
Path inputPath = fs.makeQualified(new Path("/usr/local/srini/")); // local path 

FileInputFormat.setInputPaths(job, inputPath); 

tôi hy vọng công trình này cho yêu cầu của bạn, mặc dù nó được đăng tải rất muộn .. nó hoạt động tốt cho tôi .. nó không cần bất kỳ thay đổi cấu hình tôi tin ..

+0

util.NativeCodeLoader: Không thể tải thư viện hadoop gốc cho nền tảng của bạn ... sử dụng các lớp builtin-java khi áp dụng Ngoại lệ trong chuỗi "main" java.lang.UnsupportedOperationException: Không được triển khai bởi DistributedFileSystem –

0

U có thể muốn thử loại này bằng cách đặt cấu hình là

Configuration conf=new Configuration(); 
conf.set("job.mapreduce.tracker","local"); 
conf.set("fs.default.name","file:///"); 

Sau khi bạn có thể đặt fileinputformat với đường dẫn cục bộ và ur tốt để đi

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