2013-02-11 33 views
12

Chúng tôi đã nhận ra một chút quá muộn rằng việc lưu trữ các tệp của chúng tôi ở định dạng GZip để xử lý Hadoop không phải là một ý tưởng tuyệt vời. GZip không splittable, và để tham khảo, đây là những vấn đề mà tôi sẽ không lặp lại:Nén splittable tốt nhất cho đầu vào Hadoop = bz2?

Câu hỏi của tôi là: BZip2 là nén lưu trữ tốt nhất sẽ cho phép một tệp lưu trữ duy nhất được xử lý song song với Hadoop như thế nào? Gzip chắc chắn là không, và từ đọc của tôi LZO có một số vấn đề.

Trả lời

15

BZIP2 là splittable trong hadoop - nó cung cấp tỷ lệ nén rất tốt nhưng từ thời gian CPU và hiệu suất không cung cấp kết quả tối ưu, vì nén rất tốn CPU.

LZO là splittable trong hadoop - tận dụng hadoop-lzo file LZO bạn đã splittable nén. Bạn cần có các tệp .lzo.index bên ngoài để có thể xử lý song song. Thư viện cung cấp tất cả các phương tiện tạo ra các chỉ mục này theo cách cục bộ hoặc phân tán.

LZ4 là splittable trong hadoop - tận dụng hadoop-4mc bạn đã splittable nén file 4mc. Bạn không cần bất kỳ chỉ mục bên ngoài nào và bạn có thể tạo lưu trữ bằng công cụ dòng lệnh được cung cấp hoặc bằng mã Java/C, bên trong/bên ngoài hadoop. 4mc có sẵn trên hadoop LZ4 ở bất kỳ mức tốc độ/nén tỷ lệ nào: từ chế độ nhanh đến tốc độ nén 500 MB/s lên tới các chế độ cao/siêu cung cấp tỷ lệ nén tăng, gần như tương đương với GZIP.

+4

Tôi thích LZ4 hơn những ngày này. –

+1

khiến bạn ngạc nhiên khi rời khỏi Zlib. – nikk

2

Dưới đây là năm cách với gzip, ba cách cần một chỉ mục, hai không.

Có thể tạo chỉ mục cho bất kỳ tệp gzip nào, tức là không được xây dựng đặc biệt, như được thực hiện bởi zran.c. Sau đó, bạn có thể bắt đầu giải nén tại các ranh giới khối. Chỉ mục này bao gồm 32K lịch sử dữ liệu chưa nén tại mỗi điểm vào.

Nếu bạn đang xây dựng tệp gzip, sau đó nó có thể được thực hiện với các điểm nhập định kỳ có chỉ mục không cần lịch sử không nén tại các điểm nhập đó, làm cho chỉ mục nhỏ hơn. Điều này được thực hiện với tùy chọn Z_FULL_FLUSH tới deflate() trong zlib.

Bạn cũng có thể thực hiện Z_SYNC_FLUSH theo sau là Z_FULL_FLUSH tại mỗi điểm như vậy, sẽ chèn hai điểm đánh dấu. Sau đó, bạn có thể tìm kiếm mẫu chín byte 00 00 ff ff 00 00 00 ff ff để tìm mẫu đó. Điều đó không khác gì so với việc tìm kiếm điểm đánh dấu sáu byte trong các tệp bzip2, ngoại trừ một kết quả dương tính giả ít có khả năng hơn với chín byte. Sau đó, bạn không cần tệp chỉ mục riêng biệt.

Cả gzip lẫn xz đều hỗ trợ ghép nối đơn giản. Điều này cho phép bạn dễ dàng chuẩn bị một kho lưu trữ để giải nén song song theo một cách khác. Tóm lại:

gzip <a> a.gz 
gzip <b> b.gz 
cat a.gz b.gz > c.gz 
gunzip <c.gz> c 
cat a b | cmp - c 

sẽ dẫn đến so sánh thành công.

Sau đó, bạn có thể chỉ cần nén theo các khối có kích thước mong muốn và nối các kết quả. Lưu chỉ mục vào phần bù của đầu mỗi luồng gzip. Giải nén từ những offsets. Bạn có thể chọn kích thước của các khối theo sở thích của bạn, tùy thuộc vào ứng dụng của bạn. Tuy nhiên, nếu bạn làm cho chúng quá nhỏ, việc nén sẽ bị ảnh hưởng.

Với việc ghép nối đơn giản các tệp gzip, bạn cũng có thể từ bỏ chỉ mục nếu bạn tạo từng đoạn một kích thước cố định không nén. Sau đó, mỗi đoạn kết thúc với cùng bốn byte, độ dài không nén theo thứ tự nhỏ, ví dụ: 00 00 10 00 cho 1 đoạn MiB, tiếp theo là 1f 8b 08 từ đoạn tiếp theo, đây là phần đầu của tiêu đề gzip. Sau đó, đánh dấu bảy byte đó có thể được tìm kiếm giống như dấu bzip2, mặc dù lại có xác suất sai tích cực nhỏ hơn.

Điều tương tự có thể được thực hiện với các tệp xz ghép nối, có tiêu đề là bảy byte: fd 37 7a 58 5a 00 00.

+0

Cảm ơn! Làm cách nào để chuẩn bị các tệp gzip/bzip2 và làm cho chúng có thể chia nhỏ với các điểm nhập? – Suman

+0

Xem câu trả lời cập nhật. –

+0

Mẹo: vì tôi không tìm thấy hadoop fs -bzcat, thay vào đó sử dụng: hadoop fs -cat /FILENAME.bz | bzcat | ít hơn – xgMz

4

tôi không xem xét các câu trả lời khác đúng, bzip2 theo này:

http://comphadoop.weebly.com/

là splittable. LZO quá nếu được lập chỉ mục.

Vì vậy, câu trả lời là có, nếu bạn muốn sử dụng nhiều người vẽ bản đồ hơn là bạn có tệp, thì bạn sẽ muốn sử dụng bzip2.

Để làm điều này, bạn có thể viết một công việc MR đơn giản để đọc dữ liệu sau đó chỉ cần viết nó ra một lần nữa, sau đó bạn cần phải đảm bảo bạn thiết mapred.output.compression.codec để org.apache.hadoop.io.compress.BZip2Codec

+1

Tôi sẽ đi với câu trả lời này, nhưng nó sẽ tốt hơn nhiều nếu bạn cũng sẽ cung cấp cho chúng tôi CÁCH: Làm thế nào tôi có thể tạo các tệp bz2 được lập chỉ mục? – Gavriel

+0

@Gavriel Tôi không biết cách tạo * lập chỉ mục LZO *, nhưng tôi sẽ cập nhật câu trả lời của mình để giải thích ngắn gọn cách nén thành bzip2. – samthebest

+0

(Vâng tôi viết kết quả của mình qua nén gzip, vì đó là những gì RedShift có thể đọc) nhưng sẽ có bất kỳ tệp bzip2 chính xác nào làm đầu vào hay tôi cần truyền một số tham số đặc biệt để có các khối/chỉ mục? – Gavriel

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