Χωρίσματα & Κάδοι Κυψέλης με Παράδειγμα
⚡ Έξυπνη Σύνοψη
Τα partitions και οι buckets είναι οι δύο τρόποι με τους οποίους το Apache Hive διαχωρίζει τα δεδομένα πίνακα στον δίσκο: ένα partition δημιουργεί έναν κατάλογο ανά τιμή κλειδιού, ενώ ένας bucket κατακερματίζει τις γραμμές σε έναν σταθερό αριθμό αρχείων.
Οι πίνακες, τα διαμερίσματα και οι κάδοι είναι τα μέρη της μοντελοποίησης δεδομένων Hive. Ένας πίνακας ορίζει το σχήμα, ένα διαμέρισμα διαιρεί αυτόν τον πίνακα σε καταλόγους στο δίσκο και ένας κάδος διαιρεί τα δεδομένα μέσα σε έναν κατάλογο σε έναν σταθερό αριθμό αρχείων.
Τι είναι τα Partitions;
Τα Hive Partitions είναι ένας τρόπος οργάνωσης πινάκων σε διαμερίσματα, διαιρώντας τους πίνακες σε διαφορετικά μέρη με βάση τα κλειδιά διαμερισμάτων. Φυσικά, κάθε διαμέρισμα είναι ένας ξεχωριστός υποκατάλογος κάτω από τον φάκελο πινάκων στο HDFS, κάτι που επιτρέπει στο Hive να παραλείπει δεδομένα που δεν χρειάζεται.
Η διαμέριση είναι χρήσιμη όταν ο πίνακας έχει ένα ή περισσότερα κλειδιά διαμέρισης. Τα κλειδιά διαμέρισης είναι βασικά στοιχεία για τον προσδιορισμό του τρόπου αποθήκευσης των δεδομένων στον πίνακα. Ένα κλειδί διαμέρισης δεν αποθηκεύεται μέσα στα ίδια τα αρχεία δεδομένων – η τιμή του κωδικοποιείται στο όνομα του καταλόγου, επομένως ένα φιλτράρισμα ερωτήματος σε αυτό το κλειδί μπορεί να απορρίψει ολόκληρους καταλόγους πριν από την ανάγνωση οποιασδήποτε γραμμής. Αυτό ονομάζεται κλάδεμα διαμέρισης.
Για παράδειγμα: –
«Πελάτης που έχει ορισμένα δεδομένα ηλεκτρονικού εμπορίου που ανήκουν σε δραστηριότητες στην Ινδία, όπου κάθε πολιτεία (38 πολιτείες) αναφέρεται συνολικά. Εάν πάρουμε τη στήλη κατάστασης ως κλειδί διαμέρισης και εκτελέσουμε διαμερίσεις σε αυτά τα δεδομένα της Ινδίας συνολικά, μπορούμε να λάβουμε τον αριθμό των διαμερισμάτων (38 διαμερίσματα) που είναι ίσος με τον αριθμό των πολιτειών (38) που υπάρχουν στην Ινδία. Έτσι ώστε τα δεδομένα κάθε πολιτείας να μπορούν να προβληθούν ξεχωριστά σε πίνακες διαμερισμάτων.»
Δείγμα Code Απόσπασμα για κατατμήσεις
Οι έξι παρακάτω εντολές εκτελούνται με τη σειρά στο κέλυφος Hive. Κάθε μία είναι ένα ξεχωριστό βήμα και τα στιγμιότυπα οθόνης που ακολουθούν δείχνουν την ίδια ακολουθία εκτέλεσης σε ένα ενεργό σύμπλεγμα.
- Δημιουργία πίνακα allstates
create table allstates(state string, District string,Enrolments string) row format delimited fields terminated by ',';
- Φόρτωση δεδομένων στον δημιουργημένο πίνακα allstates
Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
- Δημιουργία πίνακα κατατμήσεων
create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
- Για την κατάτμηση πρέπει να ορίσουμε αυτήν την ιδιότητα
set hive.exec.dynamic.partition.mode=nonstrict - Φόρτωση δεδομένων στον πίνακα διαμερισμάτων
INSERT OVERWRITE TABLE state_part PARTITION(state) SELECT district,enrolments,state from allstates;
- Πραγματική επεξεργασία και σχηματισμός πινάκων διαμερισμάτων με βάση την κατάσταση ως κλειδί κατάτμησης
Θα υπάρχουν 38 έξοδοι διαμερισμάτων στον χώρο αποθήκευσης HDFS με το όνομα αρχείου ως όνομα κατάστασης. Θα το ελέγξουμε αυτό σε αυτό το βήμα.
Τα παρακάτω στιγμιότυπα οθόνης δείχνουν την εκτέλεση του παραπάνω κώδικα.
Στην πρώτη οθόνη, το βήμα 1 εκτελείται στο κυψέλη> προτροπή και δημιουργεί το όλες οι πολιτείες πίνακα με τις τρεις στήλες του και ένα κόμμα ως οριοθέτη πεδίου.
Η επόμενη οθόνη καλύπτει τα βήματα 2 και 3: το αρχείο AllStates.csv φορτώνεται στο όλες οι πολιτείεςκαι ο διαμερισμένος πίνακας state_part δημιουργείται με την κατάσταση να δηλώνεται ως κλειδί διαμέρισης.
Στη συνέχεια εμφανίζονται τα βήματα 4 και 5. Η λειτουργία δυναμικής διαμέρισης ορίζεται σε μη αυστηρή και η εντολή INSERT OVERWRITE εκκινεί μια εργασία MapReduce της οποίας οι γραμμές καταγραφής δείχνουν ότι φορτώνεται ένα διαμέρισμα για κάθε τιμή κατάστασης.
Η καταχώριση του καταλόγου αποθήκης στο HDFS επιβεβαιώνει το αποτέλεσμα του βήματος 6 – το κέλυφος αναφέρει 38 στοιχεία, ένα κατάσταση_μέρος/κατάσταση= κατάλογος ανά πολιτεία.
Από τον παραπάνω κώδικα κάνουμε τα εξής
- Δημιουργία πίνακα allstates με 3 ονόματα στηλών όπως πολιτεία, περιφέρεια και εγγραφές
- Φόρτωση δεδομένων στον πίνακα allstates
- Δημιουργία πίνακα διαμερισμάτων με την κατάσταση ως κλειδί κατάτμησης
- Σε αυτό το βήμα, η ρύθμιση της λειτουργίας διαμέρισης ως μη αυστηρή (αυτή η λειτουργία θα ενεργοποιήσει τη δυναμική λειτουργία διαμέρισης)
- Φόρτωση δεδομένων στον πίνακα διαμερισμάτων state_part
- Πραγματική επεξεργασία και σχηματισμός πινάκων διαμερισμάτων με βάση την κατάσταση ως κλειδί κατάτμησης
- Θα υπάρχουν 38 έξοδοι διαμερισμάτων στον χώρο αποθήκευσης HDFS με το όνομα αρχείου ως όνομα κατάστασης. Σε αυτό το βήμα, βλέπουμε τις 38 εξόδους διαμερισμάτων στο HDFS.
Στατική έναντι Δυναμικής Διαμέρισης στο Hive
Το παραπάνω παράδειγμα χρησιμοποιεί δυναμική διαμέριση, αλλά το Hive υποστηρίζει δύο στυλ φόρτωσης και η διαφορά καθορίζει πόσο typing – και πόσο κίνδυνο – φέρει κάθε φορτίο.
Στατική διαμέριση ονομάζει την τιμή του διαμερίσματος στην ίδια την εντολή, επομένως η τιμή πρέπει να είναι γνωστή πριν εκτελεστεί η φόρτωση και μία εντολή γεμίζει ακριβώς ένα διαμέρισμα. Δυναμική κατάτμηση Το Hive διαβάζει την τιμή διαμέρισης από την τελευταία στήλη της λίστας SELECT και δημιουργεί τους καταλόγους κατά τον χρόνο εκτέλεσης, γι' αυτό και το παράδειγμα χρειάζεται μόνο ένα INSERT για να δημιουργήσει 38 καταλόγους.
| Άποψη | Στατική διαμέριση | Δυναμική κατάτμηση |
|---|---|---|
| Τιμή διαμέρισης | Παρέχεται χειροκίνητα στην ρήτρα PARTITION | Ανάγνωση κατά τον χρόνο εκτέλεσης από τη στήλη SELECT |
| Διαμερίσεις ανά δήλωση | Ένας | Πολλές |
| διαμόρφωση | Λειτουργεί στην προεπιλεγμένη αυστηρή λειτουργία | Απαιτείται η ρύθμιση του hive.exec.dynamic.partition.mode σε μη strict |
| Ταχύτητα φόρτωσης | Ταχύτερα, επειδή δεν απαιτείται σάρωση τιμών | Πιο αργά, επειδή η εργασία ομαδοποιεί τις γραμμές ανά κλειδί |
| κατάλληλο για | Μικρά, γνωστά σετ όπως ένα ημερήσιο φορτίο | Μεγάλα ή άγνωστα σύνολα κλειδιών, όπως 38 καταστάσεις |
Τα δυναμικά φορτία έχουν επίσης όρια. Το Hive περιορίζει τον αριθμό των κατατμήσεων που μπορεί να δημιουργήσει μια εργασία – από προεπιλογή 100 ανά mapper ή reducer και 1000 για ολόκληρη την πρόταση – και η εργασία αποτυγχάνει μόλις ξεπεραστεί οποιοδήποτε από τα δύο όρια, επομένως ένα κλειδί με πολύ υψηλή πληθικότητα χρειάζεται να αυξηθεί αυτό το όριο ή να σχεδιαστεί διαφορετικά.
Τι είναι τα Buckets;
Οι κάδοι στο Hive χρησιμοποιούνται για τον διαχωρισμό των δεδομένων πίνακα του Hive σε πολλά αρχεία ή καταλόγους. Χρησιμοποιούνται για αποτελεσματική υποβολή ερωτημάτων και, σε αντίθεση με ένα διαμέρισμα, ο αριθμός των κάδων είναι σταθερός κατά τη δημιουργία του πίνακα, επομένως δεν αυξάνεται ποτέ με τα δεδομένα.
- Τα δεδομένα που υπάρχουν σε αυτά τα διαμερίσματα μπορούν να χωριστούν περαιτέρω σε ομάδες (buckets).
- Η διαίρεση εκτελείται με βάση το hash συγκεκριμένων στηλών που επιλέξαμε στον πίνακα
- Τα buckets χρησιμοποιούν κάποια μορφή αλγορίθμου κατακερματισμού στο back end για να διαβάσουν κάθε εγγραφή και να την τοποθετήσουν σε buckets.
- Ο κάδος στον οποίο καταλήγει μια σειρά καθορίζεται από hash_function(bucketing_column) mod num_buckets, επομένως ίσες τιμές καταλήγουν πάντα στο ίδιο αρχείο
- Στις εκδόσεις Hive 0.x και 1.x, η λειτουργία bucketing έπρεπε να ενεργοποιηθεί με ορισμός hive.enforce.bucketing=true; πριν από το ένθετο
Αυτή η τελευταία ρύθμιση είναι το ιστορικό σε ένα τρέχον σύμπλεγμα: το εγχειρίδιο του Apache Hive σημειώνει ότι δεν είναι απαραίτητο από την έκδοση 2.x και μετά, επειδή η μηχανή επιλέγει πλέον αυτόματα τον αριθμό των reducer και τη στήλη cluster-by από τον ορισμό του πίνακα.
Βήμα 1) Δημιουργία κάδου όπως φαίνεται παρακάτω.
Η παρακάτω οθόνη δείχνει την εντολή CREATE TABLE για δείγμα κουβά, με την ρήτρα CLUSTERED BY στο κάτω μέρος να καθορίζει τον αριθμό των κάδων.
Από το παραπάνω στιγμιότυπο οθόνης
- Δημιουργούμε samplebucket με ονόματα στηλών όπως first_name, job_id, department, salary και country.
- Δημιουργούμε 4 κουβάδες εδώ πέρα
- Μόλις φορτωθούν τα δεδομένα, τοποθετεί αυτόματα τα δεδομένα σε 4 κάδους
- Η στήλη χώρα είναι η στήλη ομαδοποίησης, επομένως κάθε γραμμή για μία χώρα εγγράφεται στο ίδιο αρχείο κάδου
Βήμα 2) Φόρτωση δεδομένων στον πίνακα samplebucket
Υποθέτοντας ότι ο πίνακας "εργαζόμενοι" έχει ήδη δημιουργηθεί στο σύστημα Hive, σε αυτό το βήμα θα δούμε τη φόρτωση δεδομένων από τον πίνακα "εργαζόμενοι" στον πίνακα samplebucket.
Πριν ξεκινήσουμε τη μεταφορά δεδομένων υπαλλήλων σε κάδους, βεβαιωθείτε ότι αποτελούνται από ονόματα στηλών όπως first_name, job_id, department, salary και country.
Εδώ φορτώνουμε δεδομένα στο samplebucket από τον πίνακα employees – η παρακάτω οθόνη δείχνει την εντολή INSERT OVERWRITE που εκτελεί την αντιγραφή.
Βήμα 3) Εμφάνιση των 4 κάδων που δημιουργήθηκαν στο Βήμα 1
Η καταχώριση του καταλόγου πίνακα στο HDFS δείχνει το φυσικό αποτέλεσμα: τέσσερα αριθμημένα αρχεία δεδομένων αντί για ένα.
Από το παραπάνω στιγμιότυπο οθόνης, μπορούμε να δούμε ότι τα δεδομένα από τον πίνακα εργαζομένων μεταφέρονται στους 4 κάδους που δημιουργήθηκαν στο βήμα 1.
Διαμέριση κυψέλης έναντι κάδου: Βασικές διαφορές
Και οι δύο λειτουργίες κόβουν έναν πίνακα σε μικρότερα κομμάτια, αλλά το κάνουν σε διαφορετικά επίπεδα του συστήματος αρχείων και απαντούν σε διαφορετικά προβλήματα. Ο παρακάτω πίνακας τα παρουσιάζει δίπλα-δίπλα.
| Σημείο σύγκρισης | Διαμέριση | Κάδος |
|---|---|---|
| Η μονάδα δημιουργήθηκε | Ένας κατάλογος ανά τιμή κλειδιού | Ένα αρχείο ανά κάδο κατακερματισμού |
| Δηλώθηκε με | ΧΩΡΙΣΜΕΝΟ ΑΠΟ | ΟΜΑΔΟΠΟΙΗΜΕΝΟ ΑΠΟ … ΣΕ n ΚΟΥΒΑΔΕΣ |
| Αριθμός κομματιών | Αυξάνεται με τον αριθμό των διακριτών τιμών | Διορθώθηκε κατά τη δημιουργία πίνακα |
| Στήλη αποθηκευμένη σε αρχεία δεδομένων | Όχι – η τιμή βρίσκεται στο όνομα του καταλόγου | Ναι – η στήλη παραμένει κανονική στήλη |
| τύπος στήλης καλύτερης | Χαμηλή πληθικότητα, όπως πολιτεία, έτος ή χώρα | Υψηλή πληθικότητα, όπως user_id ή transaction_id |
| Κύριο όφελος | Το κλάδεμα διαμερισμάτων παρακάμπτει τους περιττούς καταλόγους | Ομοιόμορφα μεγέθη αρχείων, φθηνή δειγματοληψία και ενώσεις από την πλευρά του χάρτη |
Τα δύο δεν είναι αντίπαλα. Μια κοινή διάταξη παραγωγής διαχωρίζει έναν πίνακα δεδομένων κατά ημερομηνία και στη συνέχεια κάνει bucket κάθε ημέρα στο κλειδί σύνδεσης, επομένως ένα ερώτημα κλαδεύει σε έναν κατάλογο και στη συνέχεια ενώνει bucket-to-bucket μέσα σε αυτόν.
Πότε να χρησιμοποιήσετε διαμέριση, bucketing ή και τα δύο
Η επιλογή μεταξύ τους ξεκινά με την πληθικότητα της στήλης και το σχήμα των ερωτημάτων που θα διαβάσουν τον πίνακα.
- χώρισμα όταν τα ερωτήματα σχεδόν πάντα φιλτράρονται στην ίδια στήλη χαμηλής πληθικότητας και όταν ο αριθμός των διακριτών τιμών παραμένει στις εκατοντάδες αντί για τα εκατομμύρια
- Κάδος όταν η χρήσιμη στήλη έχει πάρα πολλές διακριτές τιμές για να είναι κατάλογος ή όταν ο πίνακας ενώνεται ή δειγματίζεται επανειλημμένα σε αυτήν τη στήλη
- Χρησιμοποιήστε και τα δύο για μεγάλους πίνακες δεδομένων: διαμέριση στην ημερομηνία και, στη συνέχεια, κάδος μέσα σε κάθε διαμέριση στο κλειδί σύνδεσης
Η λειτουργία αποτυχίας που πρέπει να προσέξετε είναι το πρόβλημα των μικρών αρχείων. Η διαμέριση σε μια στήλη με πολύ υψηλή πληθικότητα - μια χρονική σήμανση ή ένα αναγνωριστικό πελάτη - παράγει χιλιάδες μικροσκοπικούς καταλόγους, ο καθένας από τους οποίους περιέχει ένα αρχείο πολύ μικρότερο από το μέγεθος μπλοκ HDFS. Αυτό διογκώνει τη μνήμη του NameNode και κάνει κάθε σάρωση πιο αργή, κάτι που ακριβώς ήταν το αποτέλεσμα που η διαμέριση είχε σκοπό να αποτρέψει. Η ομαδοποίηση αποφεύγει αυτό επειδή ο αριθμός των αρχείων περιορίζεται από τον ορισμό του πίνακα.
Η δημιουργία bucket έχει τη δική της προειδοποίηση: η διάταξη είναι σωστή μόνο εάν κάθε συγγραφέας την τηρεί. Ο αριθμός των bucket που δηλώνεται κατά τη δημιουργία είναι μεταδεδομένα, επομένως μια εργασία που γράφει στον πίνακα χωρίς σωστή ομαδοποίηση μπορεί να αφήσει αρχεία που δεν ταιριάζουν με τη δηλωμένη διάταξη και η μεταγενέστερη δειγματοληψία ή οι ενώσεις bucket θα διαβάσουν λάθος γραμμές.








