Domanda

Voglio condividere dati statici di grande memoria (Ram Lucene Index) per le mie attività di mappa in Hadoop? C'è un modo per diverse attività di mappa/riduci di condividere lo stesso JVM?

È stato utile?

Soluzione

I lavori possono consentire il riutilizzo del compito JVMS specificando la configurazione del lavoro mapred.job.reuse.jvm.num.tasks. Se il valore è 1 (il valore predefinito), i JVM non vengono riutilizzati (IE 1 Task per JVM). Se è -1, non vi è alcun limite al numero di compiti che un JVM può eseguire (dello stesso lavoro). Si può anche specificare un valore maggiore di 1 utilizzando l'API.

Altri suggerimenti

In $HADOOP_HOME/conf/mapred-site.xml Aggiungi la proprietà Segui

<property>
    <name>mapred.job.reuse.jvm.num.tasks</name>
    <value>#</value>
</property>

Il # può essere impostato su un numero per specificare quante volte deve essere riutilizzato JVM (il default è 1) o impostare su -1 senza limiti all'importo del riutilizzo.

Spina spudorata

Vado a usare oggetti statici con il riutilizzo JVM per realizzare ciò che descrivi qui:http://chasebradford.wordpress.com/2011/02/05/distribued-cache-static-objets-and-fast-setup/

Un'altra opzione, sebbene più complicata, è utilizzare la cache distribuita con un file mappato di memoria di sola lettura. In questo modo puoi condividere la risorsa anche tra i processi JVM.

Per quanto ne sappia, non esiste un modo semplice per più attività di mappe (Hadoop) di condividere strutture di dati statici.

Questo è in realtà un problema noto per l'attuale modello di riduzione della mappa. Il motivo per cui l'attuale implementazione non condivide i dati statici tra le attività delle mappe è perché Hadoop è progettato per essere altamente affidabile. Di conseguenza, se un'attività fallisce, si bloccherà solo il proprio JVM. Non avrà un impatto sull'esecuzione di altri JVM.

Attualmente sto lavorando su un prototipo in grado di distribuire il lavoro di un singolo JVM su più core (essenzialmente hai solo bisogno di un JVM per utilizzare i multi core). In questo modo, è possibile ridurre la duplicazione delle strutture di dati di memoria senza costare l'utilizzo della CPU. Il prossimo passo per me è sviluppare una versione di Hadoop in grado di eseguire più attività di mappe all'interno di un JVM, che è esattamente quello che stai chiedendo.

C'è un post interessante quihttps://issues.apache.org/jira/browse/mapreduce-2123

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top