2013-06-21 21 views
8

Trước tiên, tôi mới sử dụng hadoop :)Chạy công việc Map-Reduce trên các tệp/khối cụ thể trong HDFS

Tôi có một tập dữ liệu lớn các tệp được nén (TB của tài liệu trong các tệp được nén xung quanh kích thước của 100-500mb mỗi cái).

Về cơ bản, tôi cần một số loại lọc đầu vào của mình cho công việc giảm bản đồ.

Tôi muốn phân tích các tệp này theo nhiều cách khác nhau. Nhiều công việc này chỉ cần phân tích các tệp của một định dạng nhất định (có độ dài nhất định, chứa các từ nhất định, v.v. - tất cả các loại chỉ mục tùy ý) và phải mất quá nhiều thời gian để xử lý toàn bộ tập dữ liệu cho mỗi công việc. Vì vậy, tôi muốn tạo các chỉ mục trỏ đến các khối/tệp cụ thể trong HDFS.

Tôi có thể tạo chỉ mục bắt buộc theo cách thủ công, nhưng làm cách nào để chỉ định chính xác (hàng nghìn) tệp/khối cụ thể nào tôi muốn xử lý làm đầu vào cho người lập bản đồ? Tôi có thể làm điều này mà không cần đọc dữ liệu nguồn không, ví dụ: HBase? Tôi có muốn không? Hoặc tôi giải quyết vấn đề này hoàn toàn sai?

+0

Vì vậy, nếu tôi hiểu chính xác, bạn đang tìm cách xử lý chỉ một tập con của các tệp trong đường dẫn nhập? Bạn bắt đầu công việc như thế nào, lập trình? – climbage

+0

Làm cách nào để nhắm mục tiêu chặn HDFS thay vì chạy các công việc khác nhau cho các định dạng khác nhau (tệp) giúp bạn thực hiện tác vụ nhanh hơn? Bạn có thể xây dựng câu hỏi của mình nhiều hơn không? –

+0

Xin lỗi vì đã quá mơ hồ. Tôi chưa cảm thấy như ở nhà trong ngăn xếp hadoop, vì vậy tôi biết thuật ngữ của tôi và cách suy nghĩ là hơi tắt. Ví dụ sau có thể giúp giải thích những gì tôi đang cố gắng đạt được: Với 1.000.000 tệp và chỉ mục cho biết chính xác 5.000 tệp của tôi chứa từ * ánh nắng *, chạy một công việc giảm bản đồ phân tích tất cả các tài liệu chứa từ * ánh nắng * . – jkgeyti

Trả lời

2

Giả sử bạn có một số cách để bạn có thể biết tệp x nào sẽ xử lý trong một tập hợp lớn các tệp, bạn có thể sử dụng phương thức org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPathFilter(Job, Class<? extends PathFilter>) khi định cấu hình công việc của mình.

Bạn cần phải vượt qua một lớp thực hiện PathFilter. Hadoop sẽ tạo một thể hiện mới của lớp này và nó sẽ được trình bày mỗi tệp trong kho văn bản thông qua phương thức boolean accept(Path path). Sau đó bạn có thể sử dụng điều này để lọc các tệp xuống các tác vụ xử lý bản đồ thực tế (cho dù dựa trên tên tệp, kích thước, dấu thời gian được sửa đổi lần cuối, v.v ...).

Để nhắm mục tiêu các khối cụ thể, bạn sẽ cần phải triển khai tiện ích FileInputFormat của riêng bạn, cụ thể là ghi đè phương thức getSplits. Phương thức này sử dụng phương thức listStatus để xác định các tệp đầu vào cần xử lý (và là nơi mà PathFilter được đề cập trước đây), sau đó xác định cách chia nhỏ các tệp đó thành các phần tách (nếu các tệp có thể chia nhỏ). Vì vậy, trong phương pháp getSplits này, bạn lại cần sử dụng dữ liệu tham chiếu của mình để nhắm mục tiêu các phần tách cụ thể mà bạn quan tâm.

Để lưu trữ/truy xuất tệp mục tiêu này và chia nhỏ thông tin, bạn có nhiều lựa chọn lưu trữ lâu dài như vậy như một kho khóa/giá trị (HBase, như bạn đã lưu ý trong câu hỏi của bạn), một cơ sở dữ liệu riêng biệt (MySQL, vv), một chỉ số ngược (Lucene), v.v.

1

Chạy lệnh Map-Reduce trên các tệp cụ thể trong HDFS ra tập tin đầu vào dựa trên một số tiêu chí. Here là một blog hay được đăng bởi Antoine Amend, sẽ hữu ích.

2

Vì bạn muốn lọc đầu vào dựa trên nội dung tệp (tệp có chứa từ foobar) và không siêu dữ liệu tệp (tên tệp/kích thước, v.v.), bạn thực sự cần loại chỉ mục mình đã tạo trên Hadoop InputSplit. Xem my blog

+0

Cool. Tôi đã hỏi câu hỏi này thực sự đã xây dựng một thiết lập tương tự. Tôi rất vui vì bạn đã thêm điểm chuẩn, tôi sẽ thử và so sánh cách tiếp cận hơi khác với của bạn. Bạn có một ví dụ thô sơ về dữ liệu của bạn trông như thế nào, vì vậy tôi có thể tạo ra một cái gì đó tương tự như điểm chuẩn trên? – jkgeyti

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