Hadoop MapReduce Join & Counter με Παράδειγμα
⚡ Έξυπνη Σύνοψη
Οι ενώσεις MapReduce συνδυάζουν δύο μεγάλα σύνολα δεδομένων σε ένα κοινόχρηστο κλειδί, είτε μέσα στον mapper είτε μέσα στον reducer, ενώ οι μετρητές MapReduce συλλέγουν στατιστικά στοιχεία σχετικά με την εργασία, έτσι ώστε να μπορούν να μετρηθούν κακές εγγραφές αντί να μαντεύονται.

Τι είναι η Συμμετοχή στο MapReduce;
Η λειτουργία MapReduce Join χρησιμοποιείται για τον συνδυασμό δύο μεγάλων συνόλων δεδομένων. Ωστόσο, αυτή η διαδικασία περιλαμβάνει τη σύνταξη πολύ κώδικα για την εκτέλεση της πραγματικής λειτουργίας σύνδεσης. Η σύνδεση δύο συνόλων δεδομένων ξεκινά συγκρίνοντας το μέγεθος κάθε συνόλου δεδομένων. Εάν ένα σύνολο δεδομένων είναι μικρότερο σε σύγκριση με το άλλο σύνολο δεδομένων, τότε το μικρότερο σύνολο δεδομένων κατανέμεται σε κάθε κόμβο δεδομένων στο σύμπλεγμα.
Μόλις γίνει η εγγραφή ΜΕΙΩΣΗ ΧΑΡΤΗ Όταν διανέμεται, είτε το Mapper είτε το Reducer χρησιμοποιούν το μικρότερο σύνολο δεδομένων για να εκτελέσουν μια αναζήτηση για αντίστοιχες εγγραφές από το μεγάλο σύνολο δεδομένων και στη συνέχεια συνδυάζει αυτές τις εγγραφές για να σχηματίσουν εγγραφές εξόδου.
Τύποι Συμμετοχής
Ανάλογα με το σημείο όπου εκτελείται η πραγματική σύνδεση, οι συνδέσεις στο Hadoop ταξινομούνται σε δύο είδη.
- Σύνδεση από την πλευρά του χάρτη — Όταν η σύνδεση εκτελείται από τον mapper, ονομάζεται σύνδεση map-side. Σε αυτόν τον τύπο, η σύνδεση εκτελείται πριν τα δεδομένα καταναλωθούν από τη συνάρτηση map. Είναι υποχρεωτικό η είσοδος σε κάθε map να έχει τη μορφή διαμερίσματος και να είναι ταξινομημένη. Επίσης, πρέπει να υπάρχει ίσος αριθμός διαμερισμάτων και πρέπει να είναι ταξινομημένος με βάση το κλειδί σύνδεσης.
- Σύνδεση πλευράς μείωσης — Όταν η ένωση εκτελείται από τον μειωτή, ονομάζεται ένωση πλευράς μείωσης. Δεν υπάρχει ανάγκη σε αυτήν την ένωση να υπάρχει ένα σύνολο δεδομένων σε δομημένη μορφή (ή διαμερισμένη). Εδώ, η επεξεργασία πλευράς χάρτη εκπέμπει το κλειδί σύνδεσης και τις αντίστοιχες πλειάδες και των δύο πινάκων. Ως αποτέλεσμα αυτής της επεξεργασίας, όλες οι πλειάδες με το ίδιο κλειδί σύνδεσης εμπίπτουν στον ίδιο μειωτή, ο οποίος στη συνέχεια ενώνει τις εγγραφές με το ίδιο κλειδί σύνδεσης.
Μια συνολική ροή διαδικασίας των συνδέσεων στο Hadoop απεικονίζεται στο παρακάτω διάγραμμα.

Με τις δύο παραλλαγές σαφείς, η επόμενη ενότητα περιγράφει μια ένωση πλευράς μείωσης σε δύο μικρά αρχεία τμήματος.
Πώς να συνδέσετε δύο σύνολα δεδομένων: Παράδειγμα MapReduce
Υπάρχουν δύο σύνολα δεδομένων σε δύο διαφορετικά αρχεία (εμφανίζονται παρακάτω). Το Key Dept_ID είναι κοινό και στα δύο αρχεία. Ο στόχος είναι να χρησιμοποιηθεί η συνάρτηση MapReduce Join για να συνδυαστούν αυτά τα αρχεία.
εισόδου: Το σύνολο δεδομένων εισόδου είναι ένα αρχείο txt, DeptName.txt & DeptStrength.txt
Κατεβάστε τα αρχεία εισόδου από εδώ
Βεβαιωθείτε ότι έχετε Hadoop εγκατεστημένο. Πριν ξεκινήσετε με την πραγματική διεργασία του παραδείγματος MapReduce Join, αλλάξτε τον χρήστη σε 'hduser' (το id χρησιμοποιείται κατά τη ρύθμιση παραμέτρων του Hadoop, μπορείτε να μεταβείτε στο userid που χρησιμοποιείται κατά τη ρύθμιση παραμέτρων του Hadoop).
su - hduser_
Η προτροπή αλλάζει στον λογαριασμό Hadoop, όπως φαίνεται παρακάτω.
Βήμα 1) Αντιγράψτε το αρχείο zip στην τοποθεσία της επιλογής σας
Βήμα 2) Αποσυμπίεση του αρχείου Zip
sudo tar -xvf MapReduceJoin.tar.gz
Ο πρώηνtracΤα ονόματα αρχείων ted περνούν καθώς το tar αποσυμπιέζει το αρχείο.
Βήμα 3) Μετάβαση στον κατάλογο MapReduceJoin/
cd MapReduceJoin/
Βήμα 4) Ξεκινήστε το Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Και τα δύο σενάρια εκτυπώνουν τους δαίμονες που εμφανίζουν.
Βήμα 5) Τα DeptStrength.txt και DeptName.txt είναι τα αρχεία εισόδου που χρησιμοποιούνται για αυτό το παράδειγμα προγράμματος MapReduce Join.
Αυτά τα αρχεία πρέπει να αντιγραφούν σε ΚΑΕ χρησιμοποιώντας την παρακάτω εντολή-
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
Βήμα 6) Εκτελέστε το πρόγραμμα χρησιμοποιώντας την παρακάτω εντολή-
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
Η εντολή επαναλαμβάνεται πρώτα και στη συνέχεια η εργασία αναφέρει την πρόοδό της στην κονσόλα.
Βήμα 7) Μετά την εκτέλεση, το αρχείο εξόδου (με όνομα 'part-00000') θα αποθηκευτεί στον κατάλογο /output_mapreducejoin στο HDFS
Μπορείτε να δείτε τα αποτελέσματα χρησιμοποιώντας τη διεπαφή γραμμής εντολών
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
Τα αποτελέσματα μπορούν επίσης να προβληθούν μέσω μιας διεπαφής ιστού ως-
Τώρα επιλέξτε «Περιήγηση στο σύστημα αρχείων» και μεταβείτε στο /output_mapreducejoin
Άνοιγμα μέρους-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
- Ενσωματωμένοι μετρητές Hadoop: Υπάρχουν μερικοί ενσωματωμένοι μετρητές Hadoop που υπάρχουν ανά εργασία. Παρακάτω υπάρχουν ενσωματωμένες ομάδες μετρητών-
- MapReduce Task Counters — Συλλέγει πληροφορίες συγκεκριμένες για την εργασία (π.χ., αριθμό εγγραφών εισόδου) κατά τον χρόνο εκτέλεσης.
- Μετρητές συστήματος αρχείων — Συλλέγει πληροφορίες όπως τον αριθμό των byte που διαβάζονται ή γράφονται από μια εργασία.
- Μετρητές FileInputFormat — Συλλέγει πληροφορίες για έναν αριθμό byte που διαβάζονται μέσω του FileInputFormat.
- Μετρητές FileOutputFormat — Συλλέγει πληροφορίες για έναν αριθμό byte που έχουν γραφτεί μέσω του FileOutputFormat.
- Μετρητές εργασιών — Αυτοί οι μετρητές καταγράφουν στατιστικά στοιχεία για ολόκληρη την εργασία, όπως τον αριθμό των εργασιών που έχουν ξεκινήσει για μια εργασία.
- Μετρητές που ορίζονται από τον χρήστη: Εκτός από τους ενσωματωμένους μετρητές, ένας χρήστης μπορεί να ορίσει τους δικούς του μετρητές χρησιμοποιώντας παρόμοιες λειτουργίες που παρέχονται από γλώσσες προγραμματισμού. Για παράδειγμα, στο 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)Η ιδέα του μετρητή είναι πανομοιότυπη και στα δύο.











