2013-02-11 6 views
12

Wir haben ein bisschen zu spät erkannt, dass die Archivierung unserer Dateien im GZip-Format für die Hadoop-Verarbeitung keine so gute Idee ist. Gzip ist nicht spaltbar, und als Referenz, sind hier die Probleme, die ich nicht wiederholen:Beste teilbare Komprimierung für Hadoop-Eingabe = bz2?

Meine Frage ist: ist BZip2 die beste Archivkomprimierung, mit der eine einzelne Archivdatei parallel von Hadoop bearbeitet werden kann? Gzip ist definitiv nicht, und von meiner Lektüre hat LZO einige Probleme.

Antwort

15

BZIP2 teilbaren in Hadoop ist festgelegt, um sicherzustellen, - es bietet Sehr gute Komprimierungsrate, aber aus CPU-Zeit und Leistung liefert keine optimalen Ergebnisse, da Komprimierung sehr CPU-aufwändig ist.

LZO ist teilbaren in hadoop - Nutzung hadoop-lzo Sie teilbaren Druck LZO-Dateien haben. Sie müssen externe .lzo.index-Dateien parallel verarbeiten können. Die Bibliothek bietet alle Möglichkeiten, diese Indizes lokal oder verteilt zu generieren.

LZ 4 ist teilbaren in hadoop - Nutzung hadoop-4mc Sie teilbaren Druck 4MC Dateien haben. Sie benötigen keine externe Indexierung, und Sie können Archive mit dem bereitgestellten Befehlszeilentool oder mit Java/C-Code innerhalb/außerhalb von Hadoop generieren. 4mc stellt auf dem hadoop LZ4 ein beliebiges Geschwindigkeits-/Kompressionsverhältnis zur Verfügung: vom schnellen Modus, der 500 MB/s Kompressionsgeschwindigkeit erreicht, bis zum Hoch-/Ultramodus, der eine höhere Kompressionsrate bietet, fast vergleichbar mit GZIP one.

+4

Ich bevorzuge LZ4 selbst in diesen Tagen. –

+1

überraschte Sie Zlib ausgelassen. – nikk

2

Hier sind fünf Wege mit gzip, drei brauchen einen Index, zwei nicht.

Es ist möglich, einen Index für jede gzip-Datei zu erstellen, d. H. Nicht speziell konstruiert, wie von zran.c getan. Dann können Sie die Dekompression an Blockgrenzen beginnen. Der Index enthält die 32 KB des unkomprimierten Datenverlaufs an jedem Eingangspunkt.

Wenn Sie die gzip-Datei erstellen, kann sie mit periodischen Einstiegspunkten erstellt werden, deren Index an diesen Einstiegspunkten keine unkomprimierte Historie benötigt, was zu einem kleineren Index führt. Dies geschieht mit der Z_FULL_FLUSH Option zu deflate() in zlib.

Sie könnten auch einen Z_SYNC_FLUSH gefolgt von einem Z_FULL_FLUSH an jedem solchen Punkt, der zwei Marker einfügen würde. Dann können Sie nach dem Neun-Byte-Muster 00 00 ff ff 00 00 00 ff ff suchen, um diese zu finden. Das ist nicht anders als die Suche nach dem Sechs-Byte-Marker in bzip2-Dateien, außer dass ein falsches positives mit neun Bytes viel weniger wahrscheinlich ist. Dann benötigen Sie keine separate Indexdatei.

Sowohl gzip und xz unterstützen einfache Verkettung. Auf diese Weise können Sie ein Archiv auf einfache Weise für die parallele Dekomprimierung vorbereiten. Kurz gesagt:

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

wird der Vergleich erfolgreich sein.

Sie können dann einfach in Stücke der gewünschten Größe komprimieren und die Ergebnisse verketten. Speichern Sie einen Index für die Offsets des Anfangs jedes gzip-Streams. Dekomprimieren Sie von diesen Offsets. Je nach Ihrer Anwendung können Sie die Größe der Blöcke nach Ihren Wünschen auswählen. Wenn Sie sie jedoch zu klein machen, wird die Komprimierung beeinträchtigt.

Mit der einfachen Verkettung von gzip-Dateien können Sie auch auf den Index verzichten, wenn Sie für jeden Chunk eine feste unkomprimierte Größe festgelegt haben. Dann endet jeder Chunk mit den gleichen vier Bytes, die unkomprimierte Länge in der Little-Endian-Reihenfolge, z.B. 00 00 10 00 für 1 MiB Chunks, gefolgt von 1f 8b 08 vom nächsten Chunk, der der Beginn eines gzip-Headers ist. Dieser Sieben-Byte-Marker kann dann genauso wie der bzip2-Marker gesucht werden, allerdings wiederum mit einer geringeren Wahrscheinlichkeit von Falsch-Positiven.

Das gleiche könnte mit verketteten XZ-Dateien getan werden, deren Header die sieben Bytes ist: fd 37 7a 58 5a 00 00.

+0

Danke! Wie ist es möglich, gzip/bzip2-Dateien vorzubereiten und sie mit Einstiegspunkten teilbar zu machen? – Suman

+0

Siehe aktualisierte Antwort. –

+0

Tipp: Da ich hadoop fs-bzcat nicht gefunden habe, verwende stattdessen: hadoop fs -cat /FILENAME.bz | bzcat | weniger – xgMz

4

Ich halte nicht die andere Antwort richtig ist, bzip2 nach dieser:

http://comphadoop.weebly.com/

spaltbaren ist. LZO ist auch wenn indexiert.

Also die Antwort ist ja, wenn Sie mehr Mapper als Sie Dateien verwenden möchten, dann sollten Sie bzip2 verwenden.

Um dies zu tun, werden Sie einen einfachen MR Job schreiben konnte die Daten dann einfach schreiben es wieder heraus zu lesen, müssen Sie dann Sie mapred.output.compression.codec zu org.apache.hadoop.io.compress.BZip2Codec

+1

Ich würde mit dieser Antwort gehen, aber es wäre viel besser, wenn Sie uns auch das WIE geben würden: Wie kann ich indizierte bz2-Dateien erstellen? – Gavriel

+0

@Gavriel Ich weiß nicht, wie man * indizierte LZO * erstellt, aber ich werde meine Antwort aktualisieren, um kurz zu erklären, wie man zu bzip2 komprimiert. – samthebest

+0

(Nun, ich schreibe meine Ausgabe über gzip-Komprimierung, denn das kann RedShift lesen), aber wird jede korrekte bzip2-Datei als Eingabe verwendet, oder muss ich einen speziellen Parameter übergeben, um die Blöcke/Indizes zu haben? – Gavriel