2010-01-13 11 views
8

Sto lavorando ad un progetto che si occupa di analizzare una grande quantità di dati, quindi ho scoperto MapReduce abbastanza recentemente, e prima di immergermi ulteriormente, vorrei assicurarmi che le mie aspettative fossero corrette.MapReduce è giusto per me?

L'interazione con i dati avverrà da un'interfaccia Web, quindi il tempo di risposta è fondamentale qui, sto pensando a un limite di 10-15 secondi. Supponendo che i miei dati verranno caricati in un file system distribuito prima di eseguire qualsiasi analisi su di esso, che tipo di prestazioni posso aspettarmi da esso?

Diciamo che ho bisogno di filtrare un semplice file XML da 5 GB che è ben formato, ha una struttura dati abbastanza piatta e 10.000.000 di record. E diciamo che l'output produrrà 100.000 record. Sono possibili 10 secondi?

Se si, che tipo di hardware sto guardando? Se no, perché no?

Ho messo giù l'esempio, ma ora desidero che non l'abbia fatto. 5GB era solo un esempio di cui stavo parlando e in realtà avrei a che fare con molti dati. 5 GB potrebbero essere dati per un'ora del giorno e potrei voler identificare tutti i record che soddisfano determinati criteri.

Un database non è davvero un'opzione per me. Quello che volevo scoprire è quale sia la prestazione più veloce che posso aspettarmi dall'uso di MapReduce. È sempre in minuti o ore? Non è mai secondi?

+1

Considerare che Ridurre mappa consiste nell'inviare un calcolo ai dati (memorizzati su più macchine che operano sul loro pezzo). Un singolo file da 5 GB non si adatta perfettamente al modello. – z5h

+1

MapReduce è eccessivo per un file da 5 GB. Puoi gestirlo su una macchina, soprattutto se cambia solo una volta al giorno. Inoltre, MapReduce è un concetto, non una reale implementazione. Se lo aveste usato, vorreste investigare su particolari implementazioni. –

+0

Se MapReduce (o qualsiasi altro concetto) è la cosa giusta da usare dipende fortemente dal tipo di analisi che hai in mente, quanto spesso i tuoi dati cambiano, in che modo e che tipo di pre-elaborazione è possibile. Devi assolutamente fornire maggiori dettagli prima di aspettarti di ottenere una risposta utile! –

risposta

10

MapReduce è adatto per ridimensionare l'elaborazione di set di dati di grandi dimensioni, ma non è destinato a essere reattivo. Nell'implementazione di Hadoop, ad esempio, il sovraccarico di avvio richiede in genere un paio di minuti. L'idea qui è di fare un lavoro di elaborazione che richiederebbe giorni e portarli all'ordine delle ore, o delle ore ai minuti, ecc. Ma non inizieresti un nuovo lavoro in risposta a una richiesta web e aspetti che finisca in tempo di rispondere.

toccare perché questo è il caso, considerare il modo in cui funziona MapReduce (generale, panoramica di alto livello):

  • Un gruppo di nodi ricevere porzioni di i dati di ingresso (chiamati spaccature) e fare alcune elaborazioni (fase cartina)

  • I dati intermedi (output l'ultimo passo) è ripartizionato tale che dati con tasti come finisce insieme. Questo di solito richiede qualche trasferimento di dati tra i nodi.

  • Il ridurre nodi (che non sono necessariamente distinti dal mapping nodi - una singola macchina può fare più lavori in successione) eseguire la fase ridurre.

  • I dati dei risultati vengono raccolti e uniti per produrre il set di output finale.

Mentre Hadoop, et al cercare di mantenere i dati località più in alto possibile, c'è ancora una discreta quantità di mischiare in giro che si verifica durante la lavorazione. Questo da solo dovrebbe impedirti di supportare un'interfaccia web reattiva con un'implementazione distribuita di MapReduce.

Modifica: come ha fatto notare Jan Jongboom, MapReduce è molto utile per la preelaborazione dei dati, in modo che le query Web possano essere veloci, perché non è necessario che vengano elaborate. Si consideri il famoso esempio di creazione di un indice invertito da una vasta serie di pagine web.

+4

Puoi comunque creare un alghoritm di MapReduce e lasciare che preprocessi i dati, quindi nella tua webapp puoi interrogare i set di dati ottimizzati. In questo modo è possibile ottenere query reattive. –

+1

@Jan Jongboom - esattamente – danben

+0

Quel file XML otterrò i dati, e accadrà una volta al giorno. Quindi, è possibile per me elaborarlo e memorizzarlo in un formato molto digeribile. – PBG

2

Un'implementazione distribuita di MapReduce come Hadoop non è una buona misura per l'elaborazione di un XML 5GB

  • Hadoop funziona meglio su grandi quantità di dati. Sebbene 5 GB sia un file XML abbastanza grande, può essere facilmente elaborato su una singola macchina.
  • I file di input per i lavori Hadoop devono essere divisibili in modo che le diverse parti del file possano essere elaborate su macchine diverse. A meno che il tuo xml non sia banale, la divisione del file non sarà deterministica, quindi avrai bisogno di una fase di pre-elaborazione per formattare il file per la divisione.

Se si dispone di molti file da 5 GB, è possibile utilizzare hadoop per distribuire la suddivisione. Si potrebbe anche usarlo per unire i risultati tra i file e archiviare i risultati in un formato per l'interrogazione veloce per l'utilizzo da parte dell'interfaccia Web come altre risposte hanno menzionato.

0

Sembra che ciò che si potrebbe desiderare sia un buon database vecchio stile. Non abbastanza trendy come mappa/riduzione, ma spesso sufficiente per piccoli lavori come questo. A seconda della flessibilità del filtro, potresti semplicemente importare il tuo file da 5 GB in un database SQL, oppure puoi implementare il tuo schema di indicizzazione tu stesso, memorizzando i record in file diversi, archiviando tutto in memoria in un hashtable gigante, o qualunque cosa sia appropriata per le tue esigenze.

+0

Vorrei non averlo detto 5GB, tutti sembrano essersi aggrappati a questo. I dati con cui ci occuperemo alla fine sono dell'ordine di 100s di GB al giorno e dovremo elaborare molti giorni di dati. – PBG

+1

Sì, ci stiamo aggrappando perché la maggior parte delle implementazioni di mapreduce sono progettate per gestire dataset di grandi dimensioni, non piccoli :) –

3

MapReduce è un termine generico. Probabilmente vorrai chiedere se un framework MapReduce con controllo delle posizioni completo, come Hadoop, è giusto per te. La risposta dipende ancora dal framework, ma in genere, le funzionalità di controllo del lavoro, di rete, di replica dei dati e di fault tolerance di un framework MapReduce lo rendono adatto per attività che richiedono minuti, ore o più, e questa è probabilmente la risposta breve e corretta per te.

Il paradigma MapReduce può essere utile se le attività possono essere suddivise tra mappatori indipendenti e combinati con uno o più riduttori, e la lingua, il framework e l'infrastruttura disponibili consentono di trarne vantaggio.

Non esiste necessariamente una distinzione tra MapReduce e un database. Un linguaggio dichiarativo come SQL è un buon modo per astrarre il parallelismo, così come i framework MapReduce interrogabili come HBase. This article discute le implementazioni MapReduce di un algoritmo k-means e termina con un puro esempio SQL (che presuppone che il server possa parallelizzarlo).

Idealmente, uno sviluppatore non ha bisogno di sapere troppo sull'impianto idraulico. Erlang examples piace mostrare come le funzionalità del linguaggio funzionale gestiscono il controllo del processo.

Inoltre, tenere presente che esistono modi leggeri per giocare con MapReduce, come ad esempio bashreduce.

2

Recentemente ho lavorato a un sistema che elabora circa 120 GB/ora con 30 giorni di storia. Abbiamo finito per utilizzare Netezza per motivi organizzativi, ma penso che Hadoop possa essere una soluzione appropriata a seconda dei dettagli dei tuoi dati e query.

Si noti che XML è molto dettagliato. Uno dei tuoi costi principali sarà la lettura/scrittura su disco. Se puoi, scegli un formato più compatto.

Il numero di nodi nel cluster dipende dal tipo e dal numero di dischi e CPU. È possibile assumere per un calcolo approssimativo che sarà limitato dalla velocità del disco. Se il tuo disco a 7200 giri/min può scansionare a 50 MB/se si desidera eseguire la scansione di 500 GB in 10 secondi, sono necessari 1000 nodi.

Si consiglia di giocare con EC2 di Amazon, dove è possibile montare un cluster Hadoop e pagare di minuto in minuto, oppure è possibile eseguire un lavoro MapReduce sulla propria infrastruttura.