2011-12-10 13 views
6

è possibile ottenere distribuiti legge da HDSF cluster utilizzando un client di HDFS su una macchina?HDFS distribuiti legge senza Map/Reduce

Ho condotto un esperimento con un gruppo costituito da 3 nodi di dati (DN1, DN2, DN3). Poi ho eseguito 10 simultanea legge da 10 file indipendenti di un programma client situato su DN1, e sembrava di leggere solo i dati da DN1. Altri nodi di dati (DN2, DN3) mostravano un'attività zero (a giudicare dai log di debug).

Ho controllato che blocca tutti i file vengono replicati in tutti i 3 datanodes, quindi se chiudo DN1 poi i dati vengono letti dal DN2 (solo DN2).

Aumentando la quantità di dati letti non ha aiutato (provato da 2GB a 30GB).

Poiché ho bisogno di leggere più file di grandi dimensioni ed estrarre solo una piccola quantità di dati da esso (pochi Kb), vorrei evitare di utilizzare map/reduce poiché richiede impostazioni su più servizi e richiede anche la scrittura del l'output di ogni attività divisa su HDFS. Piuttosto sarebbe bello avere il risultato in streaming direttamente al mio programma client dai nodi dati.

Sto usando SequenceFile per i dati di lettura/scrittura, in questo modo (jdk7):

//Run in thread pool on multiple files simultaneously 

List<String> result = new ArrayList<>(); 
LongWritable key = new LongWritable(); 
Text value = new Text(); 
try(SequenceFile.Reader reader = new SequenceFile.Reader(conf, 
            SequenceFile.Reader.file(filePath)){ 
    reader.next(key); 
    if(key.get() == ID_I_AM_LOOKING_FOR){ 
    reader.getCurrentValue(value); 
    result.add(value.toString()); 
    } 
} 

return result; //results from multiple workers are merged later 

Qualsiasi aiuto apprezzato. Grazie!

risposta

7

Ho paura che il comportamento che vedi sia di progettazione. Da Hadoop document:

Replica Selection

Per ridurre al minimo il consumo di larghezza di banda globale e leggere la latenza, HDFS cerca per soddisfare una richiesta di lettura da una replica che è più vicino al lettore . Se esiste una replica sullo stesso rack nodo lettore, allora tale replica è preferito per soddisfare la richiesta di lettura. Se il cluster angg/ HDFS si estende su più data center, una replica che è residente nel data center locale è preferibile su qualsiasi replica remota .

può essere ulteriormente confermata da corrispondenti Hadoop source code:

LocatedBlocks getBlockLocations(...) { 
    LocatedBlocks blocks = getBlockLocations(src, offset, length, true, true); 
    if (blocks != null) { 
     //sort the blocks 
     DatanodeDescriptor client = host2DataNodeMap.getDatanodeByHost(
      clientMachine); 
     for (LocatedBlock b : blocks.getLocatedBlocks()) { 
     clusterMap.pseudoSortByDistance(client, b.getLocations()); 

     // Move decommissioned datanodes to the bottom 
     Arrays.sort(b.getLocations(), DFSUtil.DECOM_COMPARATOR); 
     } 
    } 
    return blocks; 
    } 

cioè tutte le repliche disponibili sono provati uno dopo l'altro se ex fallisce ma la più vicina è sempre il primo.

D'altra parte, se si accede ai file HDFS tramite HDFS Proxy, seleziona i Datanodi randomly. Ma non penso che sia quello che vuoi.

+0

Grazie. Questo lo spiega! Grazie per il suggerimento del proxy. – rodion

+1

Come fa Hadoop a sapere su quale nodo si trova il rack: http://hadoop.apache.org/common/docs/current/cluster_setup.html#Hadoop+Rack+Awareness –

+0

Che cos'è "angg"? –

3

In aggiunta a ciò che Edwardw ha detto, il vostro cluster corrente è molto piccolo (solo 3 nodi) e in questo caso vedete i file su tutti i nodi. Ciò accade perché il fattore di replicazione predefinito di Hadoop è anche 3. In un cluster più grande i file non saranno disponibili su ciascun nodo e quindi l'accesso a più file rischia di passare a nodi diversi e diffondere il carico.

Se si lavora con set di dati più piccoli si consiglia di guardare HBase che consente di lavorare con blocchi più piccoli e distribuire il carico tra i nodi (per regioni splitting)

+0

Hai ragione. In realtà ho provato a impostare la replica su 1 nel tentativo di distribuire i blocchi in modo uniforme attraverso il cluster, ma è appena finito di scriverli tutti su DN1: ((Suppongo di aver bisogno di più dati e blocchi prima di iniziare a bilanciarli su diversi nodi. Grazie per il suggerimento HBase, posso prendere in prestito alcune idee da lì – rodion

0

vorrei dire che il tuo caso suona bene per MR. Se mettiamo da parte un particolare paradigma di computazione MR, possiamo dire che hadoop è costruito per portare il codice ai dati, invece che al contrario. Spostare il codice sui dati è essenziale per ottenere un'elaborazione dei dati scalabile.
In un'altra mano - la configurazione di MapReduce è più semplice di HDFS - poiché non memorizza nessuno stato tra i lavori.
Nello stesso tempo - MR framework si preoccuperà dell'elaborazione parallela per te - qualcosa richiederà del tempo per farlo correttamente.
Un altro punto - se i risultati dell'elaborazione dei dati sono così piccoli - non ci sarà un impatto significativo sulle prestazioni se li combinerai insieme in un riduttore.
In altre parole, suggerirei di riconsiderare l'uso di MapReduce.

+0

Grazie, ho bisogno di alcuni test delle prestazioni lì :) – rodion

+0

Se mi lasci qualche informazione proverò a helo con le stime –

+0

Grazie. È piuttosto semplice, fondamentalmente una ricerca simile a grep su file di grandi dimensioni di dati di log.I dati di log possono essere di contenuto arbitrario.Ho due tipi di ricerca: 1) sottostringa grep-like/regex matching sul contenuto 2) cercare un log noto posizione (posizioni/identificatori sono memorizzati separatamente) e basta ottenere il contenuto. Si può presumere che il set di risultati sarà sempre piccolo: 0 ~ 100 log. Sto anche usando la compressione a blocchi (usando l'API 'SequenceFile'). – rodion