2013-06-21 6 views
8

Prima di tutto, io sono nuovo a Hadoop :)Esecuzione Map-Reduce lavoro su alcuni file/blocchi in HDFS

Ho un grande insieme di dati di file compressi con gzip (TB di documenti in file compressi con gzip intorno alla dimensione del 100-500mb ciascuno).

Fondamentalmente, ho bisogno di una sorta di filtraggio del mio input sulla mia mappa: ridurre i lavori.

Voglio analizzare questi file in vari modi. Molti di questi lavori devono solo analizzare i file di un certo formato (di certa lunghezza, contenente determinate parole ecc.) Di tutti i tipi di indici arbitrari (invertiti), e impiega troppo tempo per elaborare l'intero set di dati per ogni lavoro. Quindi voglio creare indici che puntino a specifici blocchi/file in HDFS.

Posso generare manualmente gli indici richiesti, ma come faccio a specificare esattamente quali (migliaia di) file/blocchi specifici desidero elaborare come input per i mappatori? Posso farlo senza leggere i dati sorgente in es. HBase? Voglio? O sto affrontando questo problema completamente sbagliato?

+0

Quindi, se sto capendo correttamente, stai cercando un modo per elaborare solo un sottoinsieme dei file in un percorso di input? Come stai iniziando un lavoro, programmaticamente? – climbage

+0

In che modo il targeting di blocchi HDFS anziché eseguire diversi lavori per diversi formati (file) ti rende più veloce l'attività? Puoi approfondire la tua domanda? –

+0

Mi dispiace per essere stato così vago. Non mi sento ancora a casa nello stack di hadoop, quindi so che la mia terminologia e il mio modo di pensare sono leggermente off. L'esempio seguente potrebbe aiutare a spiegare cosa sto cercando di ottenere: dati 1.000.000 di file e un indice che indica esattamente quali 5.000 file contengono la parola * sunshine *, eseguire un lavoro di riduzione della mappa che analizza tutti i documenti contenenti le parole * sunshine * . – jkgeyti

risposta

2

Supponendo di avere un modo con cui è possibile sapere quali file x elaborare in un grande gruppo di file, è possibile utilizzare il metodo org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPathFilter(Job, Class<? extends PathFilter>) durante la configurazione del lavoro.

È necessario passare una classe che implementa PathFilter. Hadoop creerà una nuova istanza di questa classe e verrà presentato quale file nel corpus tramite il metodo boolean accept(Path path). È quindi possibile utilizzarlo per filtrare i file in base alle effettive attività della mappa del processo (indipendentemente dal fatto che siano basati sul nome file, sulla dimensione, sull'ora di modifica dell'ultima modifica, ecc.).

Per individuare blocchi specifici, è necessario implementare la propria estensione di FileInputFormat, in particolare sostituendo il metodo getSplits. Questo metodo utilizza il metodo listStatus per determinare quali file di input devono essere elaborati (ed è dove viene invocato il PathFilter menzionato in precedenza), dopodiché determina come suddividere i file in suddivisioni (se i file sono splittabili). Quindi in questo metodo getSplits dovrai ancora utilizzare i tuoi dati di riferimento per indirizzare le divisioni specifiche che ti interessano.

Per quanto riguarda la memorizzazione/il recupero di questo file di destinazione e la suddivisione delle informazioni, sono disponibili diverse opzioni di archivio di persistenza come archivio Key/Value (HBase, come hai notato nella tua domanda), un database separato (MySQL, ecc.), un indice invertito (Lucene) ecc.

1

Running Map: ridurre il lavoro su file specifici in HDFS significa filtrare estrarre il file di input in base ad alcuni criteri. Here è un buon blog pubblicato da Antoine Amend, sarà utile.

2

Poiché si desidera filtrare l'input in base al contenuto del file (file contenente la parola foobar) e non ai metadati del file (nome/dimensione del file, ecc.) Sarà effettivamente necessario il tipo di indici che ho creato in base su Hadoop InputSplit. Vedi my blog

+0

Cool. Da quando ho fatto questa domanda, in realtà ho creato un setup simile. Sono contento che tu abbia aggiunto dei punti di riferimento, proverò a confrontare il mio approccio leggermente diverso con il tuo. Hai un esempio approssimativo di come sono i tuoi dati, quindi posso generare qualcosa di simile al benchmark? – jkgeyti

Problemi correlati