Hadoop MapReduce Join e contatore con l'esempio
Che cos'è Partecipa a Mapreduce?
Mapreduce Partecipa l'operazione viene utilizzata per combinare due set di dati di grandi dimensioni. Tuttavia, questo processo implica la scrittura di molto codice per eseguire l'effettiva operazione di unione. L'unione di due set di dati inizia confrontando le dimensioni di ciascun set di dati. Se un set di dati è più piccolo rispetto all'altro set di dati, un set di dati più piccolo viene distribuito a ogni nodo di dati nel cluster.
Una volta distribuito un join in MapReduce, Mapper o Reducer utilizzano il set di dati più piccolo per eseguire una ricerca per i record corrispondenti dal set di dati di grandi dimensioni e quindi combinare tali record per formare record di output.
Tipi di unione
A seconda del luogo in cui viene eseguita l'effettiva unione, le unioni in Hadoop sono classificate in-
1. Unione lato mappa – Quando l'unione viene eseguita dal mapper, viene chiamata map-side join. In questo tipo, l'unione viene eseguita prima che i dati vengano effettivamente utilizzati dalla funzione map. È obbligatorio che l'input per ciascuna mappa abbia la forma di una partizione e sia in ordine ordinato. Inoltre, deve esserci un numero uguale di partizioni e deve essere ordinato in base alla chiave di unione.
2. Unione sul lato ridotto – Quando l'unione viene eseguita dal riduttore, viene chiamata unione sul lato ridotto. In questa unione non è necessario avere un set di dati in forma strutturata (o partizionato).
Qui, l'elaborazione lato mappa emette la chiave di join e le tuple corrispondenti di entrambe le tabelle. Come effetto di questa elaborazione, tutte le tuple con la stessa chiave di join cadono nello stesso riduttore che poi unisce i record con la stessa chiave di join.
Un flusso complessivo del processo di join in Hadoop è illustrato nel diagramma seguente.
Come unire due set di dati: esempio di MapReduce
Sono presenti due set di dati in due file diversi (mostrati di seguito). Il Key Dept_ID è comune in entrambi i file. L'obiettivo è utilizzare MapReduce Join per combinare questi file
Ingresso: Il set di dati di input è un file txt, NomeDip.txt e ForzaDip.txt
Scarica i file di input da qui
Assicurati di avere Hadoop installato. Prima di iniziare con il processo effettivo dell'esempio MapReduce Join, modifica l'utente in "hduser" (id utilizzato durante la configurazione di Hadoop, puoi passare all'id utente utilizzato durante la configurazione di Hadoop).
su - hduser_
Passo 1) Copia il file zip nella posizione che preferisci
Passo 2) Decomprimere il file zip
sudo tar -xvf MapReduceJoin.tar.gz
Passo 3) Vai alla directory MapReduceJoin/
cd MapReduceJoin/
Passo 4) Avvia Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Passo 5) DeptStrength.txt e DeptName.txt sono i file di input utilizzati per questo programma di esempio MapReduce Join.
Questi file devono essere copiati su HDFS utilizzando il comando seguente-
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
Passo 6) Esegui il programma utilizzando il comando seguente-
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
Passo 7) Dopo l'esecuzione, il file di output (denominato 'part-00000') verrà archiviato nella directory /output_mapreducejoin su HDFS
I risultati possono essere visualizzati utilizzando l'interfaccia della riga di comando
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
I risultati possono anche essere visualizzati tramite un'interfaccia web come-
ora scegliere 'Sfoglia il filesystem' e naviga fino a /output_mapreducejoin
Apri parte-r-00000
Vengono visualizzati i risultati
NOTA: Tieni presente che prima di eseguire questo programma per la prossima volta, dovrai eliminare la directory di output /output_mapreducejoin
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
L'alternativa è utilizzare un nome diverso per la directory di output.
Cos'è il contatore in MapReduce?
A Contatore in MapReduce è un meccanismo utilizzato per raccogliere e misurare informazioni statistiche su lavori ed eventi MapReduce. I contatori tengono traccia di varie statistiche di lavoro in MapReduce come il numero di operazioni verificatesi e l'avanzamento dell'operazione. I contatori vengono utilizzati per la diagnosi dei problemi in MapReduce.
I contatori Hadoop sono simili all'inserimento di un messaggio di registro nel codice di una mappa o alla riduzione. Queste informazioni potrebbero essere utili per la diagnosi di un problema nell'elaborazione del lavoro MapReduce.
In genere, questi contatori in Hadoop sono definiti in un programma (mappa o riduci) e vengono incrementati durante l'esecuzione quando si verifica un particolare evento o condizione (specifico per quel contatore). Un'ottima applicazione dei contatori Hadoop consiste nel tenere traccia dei record validi e non validi da un set di dati di input.
Tipi di contatori MapReduce
Ci sono fondamentalmente 2 tipi di MapReduce Contatori
- Contatori Hadoop integrati:Esistono alcuni contatori Hadoop integrati per lavoro. Di seguito sono riportati i gruppi di contatori integrati:
- Contatori attività MapReduce – Raccoglie informazioni specifiche sull'attività (ad esempio, numero di record di input) durante il tempo di esecuzione.
- Contatori del file system – Raccoglie informazioni come il numero di byte letti o scritti da un'attività
- Contatori FileInputFormat – Raccoglie informazioni su un numero di byte letti tramite FileInputFormat
- Contatori FileOutputFormat – Raccoglie informazioni su un numero di byte scritti tramite FileOutputFormat
- Contatori di lavoro – Questi contatori vengono utilizzati da JobTracker. Le statistiche raccolte da loro includono, ad esempio, il numero di attività avviate per un lavoro.
- Contatori definiti dall'utente
Oltre ai contatori integrati, un utente può definire i propri contatori utilizzando funzionalità simili fornite da linguaggi di programmazione. Ad esempio, in Java 'enum' viene utilizzato per definire i contatori definiti dall'utente.
Esempio di contatori
Un esempio di MapClass con contatori per contare il numero di valori mancanti e non validi. File di dati di input utilizzato in questo tutorial Il nostro set di dati di input è un file CSV, VenditeJan2009.csv
public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> { static enum SalesCounters { MISSING, INVALID }; public void map ( LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { //Input string is split using ',' and stored in 'fields' array String fields[] = value.toString().split(",", -20); //Value at 4th index is country. It is stored in 'country' variable String country = fields[4]; //Value at 8th index is sales data. It is stored in 'sales' variable String sales = fields[8]; if (country.length() == 0) { reporter.incrCounter(SalesCounters.MISSING, 1); } else if (sales.startsWith("\"")) { reporter.incrCounter(SalesCounters.INVALID, 1); } else { output.collect(new Text(country), new Text(sales + ",1")); } } }
Lo snippet di codice sopra mostra un esempio di implementazione dei contatori in Hadoop Map Reduce.
Qui, Contatori di vendita è un contatore definito utilizzando 'enumerazione'. Serve per contare MISSING che a NON VALIDO record di input.
Nello snippet di codice, if 'nazione' il campo ha lunghezza zero, quindi manca il suo valore e quindi il contatore corrispondente SalesCounters.MISSING viene incrementato.
Successivamente, se 'saldi' il campo inizia con a " quindi il record è considerato NON VALIDO. Ciò è indicato dall'incremento del contatore SalesCounters.INVALID.