Hadoop MapReduce Join & Counter με Παράδειγμα

⚡ Έξυπνη Σύνοψη

Οι ενώσεις MapReduce συνδυάζουν δύο μεγάλα σύνολα δεδομένων σε ένα κοινόχρηστο κλειδί, είτε μέσα στον mapper είτε μέσα στον reducer, ενώ οι μετρητές MapReduce συλλέγουν στατιστικά στοιχεία σχετικά με την εργασία, έτσι ώστε να μπορούν να μετρηθούν κακές εγγραφές αντί να μαντεύονται.

  • 🔘 Βασικά στοιχεία συμμετοχής: Το μικρότερο από τα δύο σύνολα δεδομένων κατανέμεται σε κάθε κόμβο δεδομένων και χρησιμοποιείται ως πλευρά αναζήτησης.
  • ☑️ Σύνδεση από την πλευρά του χάρτη: Απαιτεί κάθε είσοδος να διαμεριστεί, να διαχωριστεί ισόποσα και να ταξινομηθεί με βάση το κλειδί σύνδεσης πριν από την εκτέλεση της συνάρτησης map.
  • Ένωση πλευράς μείωσης: Δεν χρειάζεται διαμέριση, επειδή κάθε πλειάδα που μοιράζεται ένα κλειδί σύνδεσης καταλήγει στον ίδιο μειωτήρα.
  • 🧪 Λειτουργικό παράδειγμα: Τα αρχεία DeptName.txt και DeptStrength.txt αντιγράφονται στο HDFS και συνδέονται στο Dept_ID μέσω ενός συσκευασμένου jar.
  • Τύποι μετρητών: Πέντε ενσωματωμένες ομάδες μετρητών αποστέλλονται με κάθε εργασία και οι μετρητές που ορίζονται από τον χρήστη δηλώνονται ως Java απαρίθμηση.
  • ⚠️ Χρήση σε μετρητή: Η αύξηση ενός μετρητή σε κάθε ελλείπουσα ή μη έγκυρη εγγραφή μετατρέπει τα προβλήματα ποιότητας δεδομένων σε έναν αριθμό στην αναφορά εργασίας.

Εκπαιδευτικό σεμινάριο για τη σύνδεση και τον μετρητή Hadoop MapReduce με ένα λειτουργικό παράδειγμα

Τι είναι η Συμμετοχή στο MapReduce;

Η λειτουργία MapReduce Join χρησιμοποιείται για τον συνδυασμό δύο μεγάλων συνόλων δεδομένων. Ωστόσο, αυτή η διαδικασία περιλαμβάνει τη σύνταξη πολύ κώδικα για την εκτέλεση της πραγματικής λειτουργίας σύνδεσης. Η σύνδεση δύο συνόλων δεδομένων ξεκινά συγκρίνοντας το μέγεθος κάθε συνόλου δεδομένων. Εάν ένα σύνολο δεδομένων είναι μικρότερο σε σύγκριση με το άλλο σύνολο δεδομένων, τότε το μικρότερο σύνολο δεδομένων κατανέμεται σε κάθε κόμβο δεδομένων στο σύμπλεγμα.

Μόλις γίνει η εγγραφή ΜΕΙΩΣΗ ΧΑΡΤΗ Όταν διανέμεται, είτε το Mapper είτε το Reducer χρησιμοποιούν το μικρότερο σύνολο δεδομένων για να εκτελέσουν μια αναζήτηση για αντίστοιχες εγγραφές από το μεγάλο σύνολο δεδομένων και στη συνέχεια συνδυάζει αυτές τις εγγραφές για να σχηματίσουν εγγραφές εξόδου.

Τύποι Συμμετοχής

Ανάλογα με το σημείο όπου εκτελείται η πραγματική σύνδεση, οι συνδέσεις στο Hadoop ταξινομούνται σε δύο είδη.

  1. Σύνδεση από την πλευρά του χάρτη — Όταν η σύνδεση εκτελείται από τον mapper, ονομάζεται σύνδεση map-side. Σε αυτόν τον τύπο, η σύνδεση εκτελείται πριν τα δεδομένα καταναλωθούν από τη συνάρτηση map. Είναι υποχρεωτικό η είσοδος σε κάθε map να έχει τη μορφή διαμερίσματος και να είναι ταξινομημένη. Επίσης, πρέπει να υπάρχει ίσος αριθμός διαμερισμάτων και πρέπει να είναι ταξινομημένος με βάση το κλειδί σύνδεσης.
  2. Σύνδεση πλευράς μείωσης — Όταν η ένωση εκτελείται από τον μειωτή, ονομάζεται ένωση πλευράς μείωσης. Δεν υπάρχει ανάγκη σε αυτήν την ένωση να υπάρχει ένα σύνολο δεδομένων σε δομημένη μορφή (ή διαμερισμένη). Εδώ, η επεξεργασία πλευράς χάρτη εκπέμπει το κλειδί σύνδεσης και τις αντίστοιχες πλειάδες και των δύο πινάκων. Ως αποτέλεσμα αυτής της επεξεργασίας, όλες οι πλειάδες με το ίδιο κλειδί σύνδεσης εμπίπτουν στον ίδιο μειωτή, ο οποίος στη συνέχεια ενώνει τις εγγραφές με το ίδιο κλειδί σύνδεσης.

Μια συνολική ροή διαδικασίας των συνδέσεων στο Hadoop απεικονίζεται στο παρακάτω διάγραμμα.

Διάγραμμα ροής διεργασίας που συγκρίνει μια ένωση πλευράς χάρτη με μια ένωση πλευράς μείωσης στο Hadoop
Τύποι συνδέσεων στο Hadoop MapReduce

Με τις δύο παραλλαγές σαφείς, η επόμενη ενότητα περιγράφει μια ένωση πλευράς μείωσης σε δύο μικρά αρχεία τμήματος.

Πώς να συνδέσετε δύο σύνολα δεδομένων: Παράδειγμα MapReduce

Υπάρχουν δύο σύνολα δεδομένων σε δύο διαφορετικά αρχεία (εμφανίζονται παρακάτω). Το Key Dept_ID είναι κοινό και στα δύο αρχεία. Ο στόχος είναι να χρησιμοποιηθεί η συνάρτηση MapReduce Join για να συνδυαστούν αυτά τα αρχεία.

Πρώτο αρχείο εισόδου που παραθέτει τα αναγνωριστικά τμημάτων μαζί με τα ονόματα τμημάτων

1 αρχείου
Δεύτερο αρχείο εισόδου που παραθέτει τα αναγνωριστικά τμημάτων μαζί με τις τιμές ισχύος τμημάτων

2 αρχείου

εισόδου: Το σύνολο δεδομένων εισόδου είναι ένα αρχείο txt, DeptName.txt & DeptStrength.txt

Κατεβάστε τα αρχεία εισόδου από εδώ

Βεβαιωθείτε ότι έχετε Hadoop εγκατεστημένο. Πριν ξεκινήσετε με την πραγματική διεργασία του παραδείγματος MapReduce Join, αλλάξτε τον χρήστη σε 'hduser' (το id χρησιμοποιείται κατά τη ρύθμιση παραμέτρων του Hadoop, μπορείτε να μεταβείτε στο userid που χρησιμοποιείται κατά τη ρύθμιση παραμέτρων του Hadoop).

su - hduser_

Η προτροπή αλλάζει στον λογαριασμό Hadoop, όπως φαίνεται παρακάτω.

Τερματικό μετά την εναλλαγή στον λογαριασμό hduser με την εντολή su

Βήμα 1) Αντιγράψτε το αρχείο zip στην τοποθεσία της επιλογής σας

Το αρχείο MapReduceJoin που λήφθηκε τοποθετήθηκε στον επιλεγμένο κατάλογο εργασίας

Βήμα 2) Αποσυμπίεση του αρχείου Zip

sudo tar -xvf MapReduceJoin.tar.gz

Ο πρώηνtracΤα ονόματα αρχείων ted περνούν καθώς το tar αποσυμπιέζει το αρχείο.

Λίστα αρχείων κονσόλας π.χ.tracted από το MapReduceJoin.tar.gz

Βήμα 3) Μετάβαση στον κατάλογο MapReduceJoin/

cd MapReduceJoin/

Ερώτηση κελύφους μετά την αλλαγή στον κατάλογο MapReduceJoin

Βήμα 4) Ξεκινήστε το Hadoop

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

Και τα δύο σενάρια εκτυπώνουν τους δαίμονες που εμφανίζουν.

Μηνύματα εκκίνησης από τα σενάρια daemon HDFS και YARN

Βήμα 5) Τα DeptStrength.txt και DeptName.txt είναι τα αρχεία εισόδου που χρησιμοποιούνται για αυτό το παράδειγμα προγράμματος MapReduce Join.

Αυτά τα αρχεία πρέπει να αντιγραφούν σε ΚΑΕ χρησιμοποιώντας την παρακάτω εντολή-

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /

Και τα δύο αρχεία κειμένου εισόδου αντιγράφηκαν στον ριζικό κατάλογο HDFS

Βήμα 6) Εκτελέστε το πρόγραμμα χρησιμοποιώντας την παρακάτω εντολή-

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

Η εντολή επαναλαμβάνεται πρώτα και στη συνέχεια η εργασία αναφέρει την πρόοδό της στην κονσόλα.

Γραμμή εντολών που εκκινεί το συσκευασμένο αρχείο jar MapReduceJoin

Έξοδος κονσόλας tracελέγχει την πρόοδο της εργασίας σύνδεσης MapReduce

Βήμα 7) Μετά την εκτέλεση, το αρχείο εξόδου (με όνομα 'part-00000') θα αποθηκευτεί στον κατάλογο /output_mapreducejoin στο HDFS

Μπορείτε να δείτε τα αποτελέσματα χρησιμοποιώντας τη διεπαφή γραμμής εντολών

$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000

Εγγραφές ενωμένου τμήματος που εκτυπώθηκαν από το HDFS με την εντολή cat

Τα αποτελέσματα μπορούν επίσης να προβληθούν μέσω μιας διεπαφής ιστού ως-

Σελίδα προορισμού διεπαφής ιστού Hadoop που χρησιμοποιείται για την πρόσβαση στο πρόγραμμα περιήγησης συστήματος αρχείων

Τώρα επιλέξτε «Περιήγηση στο σύστημα αρχείων» και μεταβείτε στο /output_mapreducejoin

Περιήγηση στην προβολή συστήματος αρχείων HDFS στον κατάλογο output_mapreducejoin

Άνοιγμα μέρους-r-00000

Επιλογή του αρχείου εξόδου part-r-00000 μέσα στην προβολή του προγράμματος περιήγησης

Τα αποτελέσματα εμφανίζονται

Οι γραμμές ονόματος και ισχύος τμήματος που έχουν ενταχθεί εμφανίζονται στο πρόγραμμα περιήγησης

ΣΗΜΕΊΩΣΗ: Λάβετε υπόψη ότι πριν εκτελέσετε αυτό το πρόγραμμα για την επόμενη φορά, θα χρειαστεί να διαγράψετε τον κατάλογο εξόδου /output_mapreducejoin

$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin

Εναλλακτική λύση είναι να χρησιμοποιήσετε διαφορετικό όνομα για τον κατάλογο εξόδου.

Οι ενώσεις (joins) σας λένε πώς μοιάζουν τα δεδομένα. Οι μετρητές, που θα εξεταστούν στη συνέχεια, σας λένε πώς συμπεριφέρθηκε η εργασία που τα παρήγαγε.

Τι είναι το Counter στο MapReduce;

Ένας μετρητής στο MapReduce είναι ένας μηχανισμός που χρησιμοποιείται για τη συλλογή και τη μέτρηση στατιστικών πληροφοριών σχετικά με εργασίες και συμβάντα του MapReduce. Οι μετρητές διατηρούν το track διαφόρων στατιστικών εργασιών στο MapReduce, όπως ο αριθμός των λειτουργιών που πραγματοποιήθηκαν και η πρόοδος της λειτουργίας. Οι μετρητές χρησιμοποιούνται για τη διάγνωση προβλημάτων στο MapReduce.

Οι μετρητές Hadoop είναι παρόμοιοι με την τοποθέτηση ενός μηνύματος καταγραφής στον κώδικα για έναν χάρτη ή μείωση. Αυτές οι πληροφορίες θα μπορούσαν να είναι χρήσιμες για τη διάγνωση ενός προβλήματος στην επεξεργασία εργασιών MapReduce.

Συνήθως, αυτοί οι μετρητές στο Hadoop ορίζονται σε ένα πρόγραμμα (αντιστοίχιση ή μείωση) και αυξάνονται κατά την εκτέλεση όταν προκύπτει ένα συγκεκριμένο συμβάν ή συνθήκη (συγκεκριμένη για αυτόν τον μετρητή). Μια πολύ καλή εφαρμογή των μετρητών Hadoop είναι να track έγκυρες και μη έγκυρες εγγραφές από ένα σύνολο δεδομένων εισόδου.

Τύποι μετρητών MapReduce

Υπάρχουν βασικά 2 τύποι μετρητών MapReduce

  1. Ενσωματωμένοι μετρητές Hadoop: Υπάρχουν μερικοί ενσωματωμένοι μετρητές Hadoop που υπάρχουν ανά εργασία. Παρακάτω υπάρχουν ενσωματωμένες ομάδες μετρητών-
    • MapReduce Task Counters — Συλλέγει πληροφορίες συγκεκριμένες για την εργασία (π.χ., αριθμό εγγραφών εισόδου) κατά τον χρόνο εκτέλεσης.
    • Μετρητές συστήματος αρχείων — Συλλέγει πληροφορίες όπως τον αριθμό των byte που διαβάζονται ή γράφονται από μια εργασία.
    • Μετρητές FileInputFormat — Συλλέγει πληροφορίες για έναν αριθμό byte που διαβάζονται μέσω του FileInputFormat.
    • Μετρητές FileOutputFormat — Συλλέγει πληροφορίες για έναν αριθμό byte που έχουν γραφτεί μέσω του FileOutputFormat.
    • Μετρητές εργασιών — Αυτοί οι μετρητές καταγράφουν στατιστικά στοιχεία για ολόκληρη την εργασία, όπως τον αριθμό των εργασιών που έχουν ξεκινήσει για μια εργασία.
  2. Μετρητές που ορίζονται από τον χρήστη: Εκτός από τους ενσωματωμένους μετρητές, ένας χρήστης μπορεί να ορίσει τους δικούς του μετρητές χρησιμοποιώντας παρόμοιες λειτουργίες που παρέχονται από γλώσσες προγραμματισμού. Για παράδειγμα, στο Java, μια «απαρίθμηση» χρησιμοποιείται για τον ορισμό μετρητών που ορίζονται από τον χρήστη.

💡 Σημείωση έκδοσης: Οι μετρητές θέσεων εργασίας συντηρούνταν από την JobTracker στο MRv1. Στο YARN αυτός ο ρόλος ανήκει στο MapReduce ApplicationMaster, επομένως τα ονόματα των μετρητών επιβιώνουν αλλά το στοιχείο που τα αναφέρει έχει αλλάξει.

Μια εργασία δεν μπορεί να δηλώσει απεριόριστο αριθμό μετρητών. mapreduce.job.counters.max η ρύθμιση του ορίου του συνόλου ανά εργασία στα 120 από προεπιλογή και μια εργασία που δηλώνει περισσότερα αποτυγχάνει με ένα LimitExceededException, επομένως οι μετρητές προορίζονται για μια χούφτα συγκεντρωτικών σημάτων και όχι για καταμετρήσεις ανά πλήκτρο.

Παράδειγμα μετρητών

Ένα παράδειγμα MapClass με μετρητές για την καταμέτρηση του αριθμού των τιμών που λείπουν και είναι μη έγκυρες. Αρχείο δεδομένων εισόδου που χρησιμοποιείται σε αυτό το σεμινάριο. Το σύνολο δεδομένων εισόδου μας είναι ένα αρχείο CSV, SalesJan2009.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"));
        }
    }
}

Το παραπάνω απόσπασμα κώδικα δείχνει ένα παράδειγμα υλοποίησης μετρητών στο Hadoop MapReduce.

Εδώ, Πάγκοι πωλήσεων είναι ένας μετρητής που ορίζεται χρησιμοποιώντας 'απαρίθμησηΧρησιμοποιείται για την καταμέτρηση των ΕΛΛΕΙΠΟΝΤΩΝ και ΜΗ ΑΚΥΡΩΝ εγγραφών εισόδου.

Στο απόσπασμα κώδικα, εάν 'χώραΕάν το πεδίο ' έχει μηδενικό μήκος, τότε η τιμή του λείπει και επομένως ο αντίστοιχος μετρητής SalesCounters.MISSING αυξάνεται.

Στη συνέχεια, αν «εμπορικόςΤο πεδίο ' ξεκινά με ένα ", τότε η εγγραφή θεωρείται ΜΗ ΕΝΕΡΓΗ. Αυτό υποδεικνύεται από την αύξηση του μετρητή SalesCounters.INVALID.

💡 Σημείωση API: το παραπάνω απόσπασμα χρησιμοποιεί το πρωτότυπο org.apache.hadoop.mapred API, όπου MapReduceBase, Mapper διεπαφή, OutputCollector και Reporter εμφανίζονται ξεχωριστά. Ο τρέχων κώδικας είναι γραμμένος σε org.apache.hadoop.mapreduce, όπου ένα μόνο Context αντικαθιστά τον συλλέκτη και τον ανταποκριτή, και ένας μετρητής αυξάνεται με context.getCounter(SalesCounters.MISSING).increment(1)Η ιδέα του μετρητή είναι πανομοιότυπη και στα δύο.

Συχνές Ερωτήσεις

Επιλέξτε την παραλλαγή του mapper όταν η μία πλευρά είναι αρκετά μικρή ώστε να διατηρείται στη μνήμη σε κάθε κόμβο, επειδή παραλείπει εντελώς την ανακάτεμα. Επιλέξτε την παραλλαγή του reducer όταν και οι δύο πλευρές είναι μεγάλες ή μη ταξινομημένες και αποδεχτείτε το επιπλέον κόστος δικτύου.

Τα μοντέλα μαθαίνουν από το ιστορικό εργασιών για να προβλέπουν τον χρόνο εκτέλεσης, να προτείνουν μεγέθη διαχωρισμού και αριθμούς μειωτήρων και να ανιχνεύουν ασυμμετρία από τις τιμές των μετρητών. Επίσης, επισημαίνουν εργασίες των οποίων οι μετρητές με διαρροή εγγραφών ή αποτυχημένες εργασίες μετατοπίζονται εκτός της κανονικής ζώνης για αυτήν τη διοχέτευση.

Το Copilot παράγει εύλογους σκελετούς mapper και reducer, αλλά αναμειγνύει ελεύθερα το παλιό πακέτο mapred με το νεότερο πακέτο mapreduce σε μία κλάση, η οποία δεν θα μεταγλωττιστεί. Διορθώστε τις εισαγωγές και τις υπογραφές μεθόδων πριν εμπιστευτείτε τη λογική.

Είναι ο μηχανισμός που στέλνει το μικρότερο αρχείο σε κάθε κόμβο πριν από την έναρξη των εργασιών. Κάθε mapper στη συνέχεια φορτώνει αυτό το αντίγραφο σε έναν χάρτη κατακερματισμού και αναζητά τοπικά αντιστοιχίσεις, κάτι που καθιστά δυνατή μια σύνδεση από την πλευρά του mapper.

Εκτυπώνονται στη σύνοψη της κονσόλας όταν ολοκληρωθεί η εργασία, εμφανίζονται στις ιστοσελίδες του ιστορικού εργασιών και της διαχείρισης πόρων και είναι αναγνώσιμα μέσω προγραμματισμού από το αντικείμενο εργασίας, ώστε ένα πρόγραμμα οδήγησης να μπορεί να τα χρησιμοποιήσει και να αποτύχει σε μια κακή εκτέλεση.

Ένα μόνο αντικείμενο Context. Μεταφέρει την εργασία που οι OutputCollector και Reporter χρησιμοποίησαν για να μοιράσουν μεταξύ τους, έτσι ώστε η έξοδος να γράφεται και οι μετρητές να αυξάνονται μέσω του ίδιου handle που περνάει στη μέθοδο map.

Για τις περισσότερες εργασίες αναφοράς, αρ. A Συμμετοχή στο HiveQL μεταγλωττίζεται με το ίδιο μοτίβο ανακατέματος και συγχώνευσης σε λίγες γραμμές. Οι χειρόγραφες εργασίες αξίζουν τον κόπο όταν η λογική συγχώνευσης δεν ταιριάζει σε έναν όρο SQL.

Το Hadoop αρνείται να γράψει σε έναν ήδη υπάρχοντα κατάλογο εξόδου, γεγονός που προστατεύει τα τελικά αποτελέσματα από την αντικατάσταση. Διαγράψτε πρώτα τον κατάλογο αναδρομικά ή περάστε μια διαφορετική διαδρομή εξόδου στην επόμενη εκτέλεση.

Συνοψίστε αυτήν την ανάρτηση με: