2010-01-16 20 views
19

Ho iniziato a esaminare Hadoop. Se ho capito bene, potrei elaborare un file molto grande e divideremo su diversi nodi, tuttavia se il file è compresso, il file non può essere diviso e il wold deve essere elaborato da un singolo nodo (distruggendo efficacemente il vantaggio di eseguire un mapreduce ver un cluster di macchine parallele).Domanda di base su Hadoop e file di input compressi

La mia domanda è, assumendo quanto sopra è corretto, è possibile dividere un file di grandi dimensioni manualmente in blocchi di dimensioni fisse, o pezzi al giorno, comprimerli e poi passare un elenco di file di input compressi per eseguire una MapReduce?

risposta

3

sì, è possibile avere un file compresso di grandi dimensioni o più file compressi (più file specificati con -files o l'API).

TextInputFormat e discendenti devono gestire automaticamente i file compressi .gz. è anche possibile implementare il proprio InputFormat (che dividere il file di input in pezzi per l'elaborazione) e RecordReader (che estraggono un record alla volta del pezzo)

un'altra alternativa per copmression generica potrebbe essere quella di utilizzare un sistema di file compresso (come ext3 con la patch di compressione, zfs, compFUSEd o FuseCompress ...)

+0

Grazie per il suono eccezionale. –

1

Puoi usare bz2 come codec di compressione e anche questo formato può essere diviso.

5

Considerare l'utilizzo della compressione LZO. È divisibile. Ciò significa che un grande file .lzo può essere elaborato da molti mappatori. Bzip2 può farlo, ma è lento.

Cloudera aveva uno introduction su di esso. Per MapReduce, LZO suona un buon equilibrio tra il rapporto di compressione e la velocità di compressione/decompressione.

+3

LZO non è divisibile da solo. È necessario eseguire un processo separato per indicizzare i file LZO in modo che i blocchi compressi siano allineati correttamente con le divisioni di input. Guarda il piccolo bambino di una linea alla fine della pagina: https://github.com/kevinweil/hadoop-lzo – jerluc

+3

@Luis Ma tieni presente che LZO è concesso in licenza GPL, quindi si applicano i termini e le condizioni regolari. Un'altra alternativa sarà usare la compressione Snappy di Google. [Google Snappy] (http://code.google.com/p/snappy/) E 'confezionato di default con Hadoop (io uso 0.20.x) e altri framework dell'ecosistema come Apache Flume, ecc. lo comprendono anche per impostazione predefinita. – arcamax

6

BZIP2 è splittabile in hadoop - fornisce un ottimo rapporto di compressione ma dal tempo e dalle prestazioni della CPU non fornisce risultati ottimali, poiché la compressione consuma molta CPU.

LZO è divisibile in Hadoop - sfruttando hadoop-lzo file LZO avete scindibile compressi. È necessario disporre di file esterni .lzo.index per poterli elaborare in parallelo. La libreria fornisce tutti i mezzi per generare questi indici in modo locale o distribuito.

LZ4 è divisibile in Hadoop - sfruttando hadoop-4mc file 4MC avete scindibile compressi. Non è necessario alcun indicizzazione esterna e si possono generare archivi con lo strumento da riga di comando fornito o da codice Java/C, dentro o fuori hadoop. 4mc rende disponibili su hadoop LZ4 a qualsiasi livello di velocità/rapporto di compressione: dalla modalità veloce fino a 500 MB/s di velocità di compressione fino alle modalità alto/ultra fornendo un rapporto di compressione maggiore, quasi paragonabile a quello di GZIP.

+3

LZ4 NON è splittabile in Hadoop. Il 4mc è un formato di file che usa LZ4, proprio come LZ4 ha il suo formato Frame, e il formato del file 4mc è divisibile. È importante fare questa distinzione: un file .lz4 non è divisibile in Hadoop: https://issues.apache.org/jira/browse/HADOOP-12990. –