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.

Tipi di join in Hadoop MapReduce
Tipi di join in Hadoop MapReduce

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

Esempio di MapReduce
file 1
Esempio di MapReduce
file 2

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_

Esempio di MapReduce

Passo 1) Copia il file zip nella posizione che preferisci

Esempio di MapReduce

Passo 2) Decomprimere il file zip

sudo tar -xvf MapReduceJoin.tar.gz

Esempio di MapReduce

Passo 3) Vai alla directory MapReduceJoin/

cd MapReduceJoin/

Esempio di MapReduce

Passo 4) Avvia Hadoop

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Esempio di MapReduce

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 /

Esempio di MapReduce

Passo 6) Esegui il programma utilizzando il comando seguente-

$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin

Esempio di MapReduce

Esempio di MapReduce

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

Esempio di MapReduce

I risultati possono anche essere visualizzati tramite un'interfaccia web come-

Esempio di MapReduce

ora scegliere 'Sfoglia il filesystem' e naviga fino a /output_mapreducejoin

Esempio di MapReduce

Apri parte-r-00000

Esempio di MapReduce

Vengono visualizzati i risultati

Esempio di MapReduce

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

  1. 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.
  2. 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.