2012-12-04 10 views
5

Se il mio ambiente istituito è la seguente:
-64MB HDFS bloccare
-5 server tablet
-10 compresse di dimensioni 1 GB ciascuna per compressa serverQuando si tratta di MapReduce come vengono le compresse Accumulo mappati a un HDFS bloccare

Se si dispone di una tabella come di seguito:
rowA | f1 | q1 | v1
rowA | f1 | q2 | v2

rigaB | f1 | q1 | v3

rowC | f1 | q1 | v4
rowC | f2 | q1 | v5
rowC | f3 | q3 | v6

Dalla piccola documentazione, so che tutti i dati relativi a rowA andranno su una compressa che potrebbe contenere o meno dati su altre righe, ovvero tutte o nessuna. Quindi le mie domande sono:

Come sono mappate le tavolette su un blocco Datanode o HDFS? Ovviamente, un tablet è diviso in più blocchi HDFS (8 in questo caso) quindi dovrebbero essere memorizzati sullo stesso o su uno o più datanode diversi o non importa?

Nell'esempio precedente, tutti i dati su RowC (o A o B) andranno sullo stesso blocco HDFS o su blocchi HDFS diversi?

Quando si esegue una mappa ridurre il lavoro quanti mapper dovrei ottenere? (uno per blocco hdfs? o per tablet? o per server?)

Grazie in anticipo per qualsiasi suggerimento.

+0

Non sicuro. Per curiosità, perché sei preoccupato per il numero di mapper? In generale, avvieresti gli scanner Accumulo per accedere ai dati nelle righe. Gli scanner forniscono un livello di astrazione, quindi non è necessario implementare lavori MapReduce da soli. – 10flow

+0

Sto scrivendo mapreduce il lavoro che legge e scrive su tabelle cumulative. Nell'esempio precedente fammi richiamare tutti i dati da una riga, un "record". Quindi sto cercando di capire l'ordine in cui questi documenti entreranno. Che, naturalmente, dipende da quanto sono diffusi. – chapstick

risposta

1

Per la scrittura su Accumulo (data ingest), è consigliabile eseguire i lavori MapReduce, in cui gli input del mapper sono i file di input su HDFS. Si potrebbe fondamentalmente seguire questo esempio dalla documentazione Accumulo:

http://accumulo.apache.org/1.4/examples/mapred.html

(Sezione IV del presente documento fornisce un po 'di background su tecniche per l'ingestione di dati in Accumulo: http://ieee-hpec.org/2012/index_htm_files/byun.pdf)

Per la lettura da Accumulo (query di dati), Non utilizzerei MapReduce. Accumulo/Zookeeper distribuirà automaticamente la tua query tra i server tablet. Se si utilizzano le righe come record atomici, utilizzare (o estendere) WholeRowIterator e avviare uno Scanner (o BatchScanner) nell'intervallo di righe a cui si è interessati. Lo scanner verrà eseguito in parallelo tra i server tablet. Non si desidera realmente accedere ai dati Accumulo direttamente da HDFS o MapReduce.

Ecco qualche esempio di codice per aiutare a ottenere il vostro iniziato:

//some of the classes you'll need (in no particular order)... 

import org.apache.accumulo.core.client.Connector; 
import org.apache.accumulo.core.client.Instance; 
import org.apache.accumulo.core.client.ZooKeeperInstance; 
import org.apache.accumulo.core.Constants; 
import org.apache.accumulo.core.client.Scanner; 
import org.apache.accumulo.core.client.IteratorSetting; 
import org.apache.accumulo.core.data.Key; 
import org.apache.accumulo.core.data.Range; 
import org.apache.accumulo.core.data.Value; 
import org.apache.hadoop.io.Text; 

//Accumulo client code... 

//Accumulo connection 
Instance instance = new ZooKeeperInstance(/* put your installation info here */); 
Connector connector = instance.getConnector(username, password); 

//setup a Scanner or BatchScanner 
Scanner scanner = connector.createScanner(tableName, Constants.NO_AUTHS); 
Range range = new Range(new Text("rowA"), new Text("rowB")); 
scanner.setRange(range); 

//use a WholeRowIterator to keep rows atomic 
IteratorSetting itSettings = new IteratorSetting(1, WholeRowIterator.class); 
scanner.addScanIterator(itSettings); 

//now read some data! 
for (Entry<Key, Value> entry : scanner) { 
    SortedMap<Key,Value> wholeRow = WholeRowIterator.decodeRow(entry.getKey(), entry.getValue()); 

    //do something with your data! 

} 
+0

Grazie Scott. Sono un novizio di accumulo e la mappa si riduce. Hai qualche esempio per il seguito che posso seguire? – chapstick

+0

Ho appena modificato la risposta per includere un esempio di come configurare uno scanner per la lettura dei dati da Accumulo. – 10flow

+0

Grazie per l'esempio. Hai detto di non usare MapReduce per accedere ad Accumulo. Potrebbe essere che non ero chiaro. In realtà sto provando a fare alcuni lavori di mapreduce che avranno bisogno di accedere ai dati memorizzati nella mia istanza accumulo e quindi post-mapreduce di riscrivere su un'altra tabella in accumulo. Questo è il motivo per cui stavo chiedendo quanti mappatori ci sarebbero e in quale ordine le coppie di valori chiave sarebbero state trasmesse. Avete consigli? – chapstick

3

Per rispondere direttamente alle vostre domande:

Come sono le compresse mappati ad un blocco DataNode o HDFS? Ovviamente, un tablet è diviso in più blocchi HDFS (8 in questo caso) quindi dovrebbero essere memorizzati sullo stesso o su uno o più datanode diversi o non importa?

Le tavolette sono memorizzate in blocchi come tutti gli altri file in HDFS.In genere si vede tutti i blocchi di un singolo file su almeno un nodo di dati (questo non è sempre il caso, ma sembra tenere per lo più vero quando ho guardato posizioni di blocco per i file più grandi)

In Nell'esempio sopra, tutti i dati su RowC (o A o B) andranno sullo stesso blocco HDFS o su blocchi HDFS diversi?

Dipende dalle dimensioni del blocco per le compresse (dfs.block.size o se configurato la proprietà Accumulo table.file.blocksize). Se la dimensione del blocco ha le stesse dimensioni della dimensione del tablet, ovviamente si troveranno nello stesso blocco HDFS. Altrimenti se la dimensione del blocco è inferiore alla dimensione del tablet, allora è buona fortuna sapere se si trovano nello stesso blocco o meno.

Quando si esegue una mappa ridurre il lavoro quanti mapper dovrei ottenere? (uno per blocco hdfs? o per tablet? o per server?)

Questo dipende dagli intervalli che si danno InputFormatBase.setRanges(Configuration, Collection<Ranges>).

Se si esegue la scansione dell'intera tabella (-inf -> + inf), si otterrà un numero di mapper pari al numero di compresse (disattivato da disableAutoAdjustRanges). Se si definisce gamme specifiche, si otterrà un comportamento diverso a seconda che hai chiamato InputFormatBase.disableAutoAdjustRanges(Configuration) o no:

  1. Se è stato chiamato questo metodo, allora si otterrà un mapper per ogni intervallo definito. È importante sottolineare che se si dispone di un intervallo che inizia in un tablet e termina in un altro, si otterrà un mapper per elaborare l'intero intervallo
  2. Se non si chiama questo metodo e si dispone di un intervallo che si estende su tablet, quindi riceverai un mapper per ogni tablet che copre l'intervallo
Problemi correlati