Tôi đang làm việc trên một công việc mà xử lý một cấu trúc thư mục lồng nhau, chứa các tập tin trên nhiều cấp độ:Hadoop MapReduce cung cấp các thư mục lồng nhau như đầu vào công việc
one/
├── three/
│ └── four/
│ ├── baz.txt
│ ├── bleh.txt
│ └── foo.txt
└── two/
├── bar.txt
└── gaa.txt
Khi tôi thêm one/
như một con đường đầu vào, không có tập tin là được xử lý, vì không có dữ liệu nào có sẵn ngay ở cấp cơ sở.
Tôi đọc khoảng job.addInputPathRecursively(..)
, nhưng điều này dường như đã không được chấp nhận trong các bản phát hành gần đây hơn (tôi đang sử dụng hadoop 1.0.2). Tôi đã viết một số mã để đi bộ các thư mục và thêm mỗi thư mục với job.addInputPath(dir)
, hoạt động cho đến khi lệnh bị lỗi khi cố gắng xử lý thư mục dưới dạng tệp đầu vào vì một số lý do, ví dụ: - cố gắng fs.open(split.getPath())
, khi split.getPath()
là một thư mục (Điều này xảy ra bên trong LineRecordReader.java
).
Tôi đang cố thuyết phục bản thân rằng phải có cách đơn giản hơn để cung cấp công việc với cấu trúc thư mục lồng nhau. Bất kỳ ý tưởng?
CHỈNH SỬA - dường như có open bug về điều này.
Việc sử dụng 'FileSystem # listStatus()' có bổ sung thêm không? –
Tôi đang giải quyết nó theo cách tương tự - đã viết mã đệ quy mà đi qua thư mục con và thêm tất cả các tệp vào Đường dẫn –
@ThomasJungblut đó là cách tiếp cận cơ bản hiện tại của tôi. Tôi chỉ thấy nó kỳ lạ là chức năng này không được tích hợp.Một vấn đề khác mà tôi gặp phải là sự cố hadoop khi nó truy cập vào một thư mục con mà không có bất kỳ tệp nào trong đó, chỉ các thư mục khác (như 'one' và' one/three' trong ví dụ của tôi). Vì vậy, về cơ bản tôi cần phải thực hiện logic sẽ thêm thư mục đệ quy trừ khi họ ** chỉ ** có các thư mục khác trong đó, thay vì tệp (vẫn phải đi bộ nội dung của họ để thêm tệp lồng nhau). Có vẻ như rất nhiều rắc rối chỉ để thiết lập một công việc. – sa125