Προγραμματισμός

Γεφυρώστε το κενό SQL-NoSQL με το Apache Phoenix

Το Apache Phoenix είναι ένα σχετικά νέο έργο ανοιχτού κώδικα Java που παρέχει πρόγραμμα οδήγησης JDBC και πρόσβαση SQL στη βάση δεδομένων NoSQL του Hadoop: HBase. Δημιουργήθηκε ως εσωτερικό έργο στο Salesforce, ανοιχτού κώδικα στο GitHub και έγινε έργο υψηλού επιπέδου Apache τον Μάιο του 2014. Εάν έχετε ισχυρές δεξιότητες προγραμματισμού SQL και θα θέλατε να τις χρησιμοποιήσετε με μια ισχυρή βάση δεδομένων NoSQL, Phoenix θα μπορούσε να είναι ακριβώς αυτό που ψάχνετε!

Αυτό το σεμινάριο εισάγει προγραμματιστές Java στο Apache Phoenix. Δεδομένου ότι το Phoenix τρέχει πάνω από το HBase, θα ξεκινήσουμε με μια επισκόπηση του HBase και πώς διαφέρει από σχεσιακές βάσεις δεδομένων. Θα μάθετε πώς το Phoenix γεφυρώνει το χάσμα μεταξύ SQL και NoSQL και πώς βελτιστοποιείται για αποτελεσματική αλληλεπίδραση με το HBase. Χωρίς αυτά τα βασικά, θα ξοδέψουμε το υπόλοιπο του άρθρου μαθαίνοντας πώς να συνεργαζόμαστε με το Phoenix. Θα ρυθμίσετε και θα ενσωματώσετε το HBase και το Phoenix, θα δημιουργήσετε μια εφαρμογή Java που συνδέεται με το HBase μέσω του Phoenix και θα γράψετε τον πρώτο σας πίνακα, θα εισαγάγετε δεδομένα και θα εκτελέσετε μερικά ερωτήματα σε αυτό.

Τέσσερις τύποι αποθήκευσης δεδομένων NoSQL

Είναι ενδιαφέρον (και κάπως ειρωνικό) ότι τα καταστήματα δεδομένων NoSQL κατηγοριοποιούνται από ένα χαρακτηριστικό που τους λείπει, δηλαδή το SQL. Τα καταστήματα δεδομένων NoSQL διατίθενται σε τέσσερις γενικές γεύσεις:

  1. Καταστήματα κλειδιών / τιμών αντιστοιχίστε ένα συγκεκριμένο κλειδί σε μια τιμή, η οποία μπορεί να είναι ένα έγγραφο, ένας πίνακας ή ένας απλός τύπος. Παραδείγματα καταστημάτων κλειδιών / τιμών περιλαμβάνουν το Memcached, το Redis και το Riak.
  2. Καταστήματα εγγράφων Διαχειριστείτε έγγραφα, τα οποία είναι συνήθως δομές χωρίς σχήμα, όπως το JSON, που μπορεί να έχουν αυθαίρετη πολυπλοκότητα. Τα περισσότερα καταστήματα εγγράφων παρέχουν υποστήριξη για πρωτεύοντα ευρετήρια, καθώς και δευτερεύοντα ευρετήρια και σύνθετα ερωτήματα. Παραδείγματα καταστημάτων εγγράφων περιλαμβάνουν τα MongoDB και CouchBase.
  3. Βάσεις δεδομένων γραφήματος επικεντρωθείτε κυρίως στις σχέσεις μεταξύ αντικειμένων στις οποίες τα δεδομένα αποθηκεύονται σε κόμβους και στις σχέσεις μεταξύ κόμβων. Ένα παράδειγμα βάσης δεδομένων γραφήματος είναι το Neo4j.
  4. Βάσεις δεδομένων προσανατολισμένες στη στήλη Αποθηκεύστε δεδομένα ως τμήματα στηλών δεδομένων και όχι ως σειρές δεδομένων. Το HBase είναι μια βάση δεδομένων προσανατολισμένη στη στήλη, όπως και η Cassandra.

HBase: Ένα αστάρι

Το Apache HBase είναι μια βάση δεδομένων NoSQL που τρέχει πάνω από το Hadoop ως ένα κατανεμημένο και επεκτάσιμο μεγάλο κατάστημα δεδομένων. Το HBase είναι μια βάση δεδομένων προσανατολισμένη στη στήλη που αξιοποιεί τις κατανεμημένες δυνατότητες επεξεργασίας του συστήματος διανομής αρχείων Hadoop (HDFS) και του προτύπου προγραμματισμού MapReduce του Hadoop. Σχεδιάστηκε για να φιλοξενεί μεγάλα τραπέζια με δισεκατομμύρια σειρές και δυνητικά εκατομμύρια στήλες, όλα σε ένα σύμπλεγμα εξοπλισμού βασικών προϊόντων.

Το Apache HBase συνδυάζει την ισχύ και την επεκτασιμότητα του Hadoop με τη δυνατότητα αναζήτησης ερωτήσεων για μεμονωμένες εγγραφές και να εκτελεί διαδικασίες MapReduce.

Εκτός από τις δυνατότητες που κληρονομούνται από το Hadoop, το HBase είναι από μόνη του μια ισχυρή βάση δεδομένων: συνδυάζει ερωτήματα σε πραγματικό χρόνο με την ταχύτητα ενός καταστήματος κλειδιού / αξίας, μια ισχυρή στρατηγική σάρωσης πίνακα για γρήγορο εντοπισμό εγγραφών και υποστηρίζει μαζική επεξεργασία χρησιμοποιώντας το MapReduce. Ως εκ τούτου, το Apache HBase συνδυάζει την ισχύ και την επεκτασιμότητα του Hadoop με τη δυνατότητα αναζήτησης ερωτήσεων για μεμονωμένες εγγραφές και να εκτελεί διαδικασίες MapReduce.

Το μοντέλο δεδομένων της HBase

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

  1. Πλήκτρο σειράς: Κάθε σειρά έχει ένα μοναδικό πλήκτρο γραμμής που αντιπροσωπεύεται εσωτερικά από έναν πίνακα byte, αλλά δεν έχει τυπικό τύπο δεδομένων.
  2. Στήλη οικογένεια: Τα δεδομένα που περιέχονται σε μια σειρά χωρίζονται σε οικογένειες στηλών; κάθε σειρά έχει το ίδιο σύνολο οικογενειών στηλών, αλλά κάθε οικογένεια στηλών δεν χρειάζεται να διατηρήσει το ίδιο σύνολο προκριματικών στηλών. Μπορείτε να θεωρήσετε ότι οι οικογένειες στηλών είναι παρόμοιες με πίνακες σε σχεσιακή βάση δεδομένων.
  3. Προσδιοριστής στήλης: Αυτά είναι παρόμοια με τις στήλες σε μια σχεσιακή βάση δεδομένων.
  4. Εκδοχή: Κάθε στήλη μπορεί να έχει έναν διαμορφώσιμο αριθμό εκδόσεις. Εάν ζητήσετε τα δεδομένα που περιέχονται σε μια στήλη χωρίς να καθορίσετε μια έκδοση, τότε θα λάβετε την πιο πρόσφατη έκδοση, αλλά μπορείτε να ζητήσετε παλαιότερες εκδόσεις καθορίζοντας έναν αριθμό έκδοσης.

Το Σχήμα 1 δείχνει πώς σχετίζονται αυτές οι τέσσερις διαστάσεις συντεταγμένες.

Στίβεν Χάινς

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

Εάν μοντελοποιούσαμε ένα άτομο, το κλειδί σειράς μπορεί να είναι ο αριθμός κοινωνικής ασφάλισης του ατόμου (για να τα αναγνωρίσει με μοναδικό τρόπο) και ενδέχεται να έχουμε οικογένειες στηλών όπως διεύθυνση, απασχόληση, εκπαίδευση και ούτω καθεξής. μεσα στην διεύθυνση οικογένεια στηλών μπορεί να έχουμε στήλες δρόμου, πόλης, πολιτείας και ταχυδρομικού κώδικα, και κάθε έκδοση μπορεί να αντιστοιχεί στο πού ζούσε το άτομο κάθε δεδομένη στιγμή. Η τελευταία έκδοση ενδέχεται να αναφέρει την πόλη "Λος Άντζελες", ενώ η προηγούμενη έκδοση ενδέχεται να περιλαμβάνει τη λίστα "Νέα Υόρκη" Μπορείτε να δείτε αυτό το παράδειγμα μοντέλου στο Σχήμα 2.

Στίβεν Χάινς

Συνοπτικά, το HBase είναι μια βάση δεδομένων προσανατολισμένη στη στήλη που αντιπροσωπεύει δεδομένα σε ένα τετραδιάστατο μοντέλο. Είναι χτισμένο πάνω από το Hadoop Distributed File System (HDFS), το οποίο χωρίζει δεδομένα σε δυνητικά χιλιάδες μηχανήματα εμπορευμάτων. Οι προγραμματιστές που χρησιμοποιούν το HBase μπορούν να έχουν άμεση πρόσβαση σε δεδομένα, μεταβαίνοντας σε ένα πλήκτρο γραμμής, πραγματοποιώντας σάρωση σε ένα εύρος πλήκτρων γραμμής ή χρησιμοποιώντας επεξεργασία παρτίδας μέσω του MapReduce.

Θεμελιώδης έρευνα

Ίσως ή όχι να είστε εξοικειωμένοι με τα διάσημα Λευκά Βιβλία Big Data. Δημοσιεύθηκε από την Google Research μεταξύ 2003 και 2006, αυτές οι λευκές βίβλοι παρουσίασαν την έρευνα για τρεις πυλώνες του οικοσυστήματος Hadoop, όπως το γνωρίζουμε:

  • Σύστημα αρχείων Google (GFS): Το Hadoop Distributed File System (HDFS) είναι μια εφαρμογή ανοιχτού κώδικα του GFS και καθορίζει τον τρόπο διανομής δεδομένων σε ένα σύμπλεγμα μηχανημάτων βασικών προϊόντων.
  • MapReduce: Ένα λειτουργικό παράδειγμα προγραμματισμού για την ανάλυση δεδομένων που διανέμονται σε ένα σύμπλεγμα HDFS.
  • Bigtable: Ένα κατανεμημένο σύστημα αποθήκευσης για τη διαχείριση δομημένων δεδομένων που έχει σχεδιαστεί σε κλίμακα σε πολύ μεγάλα μεγέθη - petabytes δεδομένων σε χιλιάδες βασικά μηχανήματα. Το HBase είναι μια εφαρμογή ανοιχτού κώδικα του Bigtable.

Γέφυρα του κενού NoSQL: Apache Phoenix

Το Apache Phoenix είναι ένα έργο Apache ανώτερου επιπέδου που παρέχει μια διασύνδεση SQL στο HBase, χαρτογράφηση μοντέλων HBase σε έναν σχεσιακό κόσμο βάσεων δεδομένων. Φυσικά, το HBase παρέχει το δικό του API και κέλυφος για εκτέλεση λειτουργιών όπως σάρωση, λήψη, τοποθέτηση, λίστα και ούτω καθεξής, αλλά περισσότεροι προγραμματιστές είναι εξοικειωμένοι με το SQL από το NoSQL. Ο στόχος του Phoenix είναι να παρέχει μια κοινά κατανοητή διεπαφή για το HBase.

Όσον αφορά τις δυνατότητες, η Phoenix κάνει τα εξής:

  • Παρέχει ένα πρόγραμμα οδήγησης JDBC για αλληλεπίδραση με το HBase.
  • Υποστηρίζει μεγάλο μέρος του προτύπου ANSI SQL.
  • Υποστηρίζει λειτουργίες DDL όπως CREATE TABLE, DROP TABLE και ALTER TABLE.
  • Υποστηρίζει λειτουργίες DML όπως UPSERT και DELETE.
  • Συγκεντρώνει ερωτήματα SQL σε εγγενείς σαρώσεις HBase και στη συνέχεια χαρτογραφεί την απόκριση στα JDBC ResultSets.
  • Υποστηρίζει διαμορφωμένα σχήματα.

Εκτός από την υποστήριξη ενός τεράστιου συνόλου λειτουργιών SQL, το Phoenix είναι επίσης πολύ υψηλής απόδοσης. Αναλύει τα ερωτήματα SQL, τα κατανέμει σε πολλαπλές σαρώσεις HBase και τα εκτελεί παράλληλα, χρησιμοποιώντας το εγγενές API αντί για τις διαδικασίες MapReduce.

Το Phoenix χρησιμοποιεί δύο στρατηγικές - συν-επεξεργαστές και προσαρμοσμένα φίλτρα - για να φέρει τους υπολογισμούς πιο κοντά στα δεδομένα:

  • Συν-επεξεργαστές εκτελεί λειτουργίες στο διακομιστή, που ελαχιστοποιεί τη μεταφορά δεδομένων πελάτη / διακομιστή.
  • Προσαρμοσμένα φίλτρα μείωση του ποσού των δεδομένων που επιστρέφονται σε μια απάντηση ερωτήματος από το διακομιστή, γεγονός που μειώνει περαιτέρω την ποσότητα των μεταφερόμενων δεδομένων. Τα προσαρμοσμένα φίλτρα χρησιμοποιούνται με μερικούς τρόπους:
    1. Κατά την εκτέλεση ενός ερωτήματος, ένα προσαρμοσμένο φίλτρο μπορεί να χρησιμοποιηθεί για τον προσδιορισμό μόνο των βασικών οικογενειών στηλών που απαιτούνται για την ικανοποίηση της αναζήτησης.
    2. ΕΝΑ παράλειψη φίλτρου σάρωσης χρησιμοποιεί το SEEK_NEXT_USING_HINT του HBase για γρήγορη πλοήγηση από τη μία εγγραφή στην άλλη, η οποία επιταχύνει τα ερωτήματα σημείων.
    3. Ένα προσαρμοσμένο φίλτρο μπορεί να "αλατίσει τα δεδομένα", που σημαίνει ότι προσθέτει ένα haste byte στην αρχή του κλειδιού σειράς έτσι ώστε να μπορεί να εντοπίσει γρήγορα εγγραφές.

Εν ολίγοις, το Phoenix αξιοποιεί την άμεση πρόσβαση σε API HBase, συν-επεξεργαστές και προσαρμοσμένα φίλτρα για να σας δώσει απόδοση χιλιοστών του δευτερολέπτου για μικρά σύνολα δεδομένων και απόδοση δεύτερου επιπέδου για μεγάλα. Πάνω απ 'όλα, η Phoenix εκθέτει αυτές τις δυνατότητες στους προγραμματιστές μέσω μιας οικείας διεπαφής JDBC και SQL.

Ξεκινήστε με το Phoenix

Για να χρησιμοποιήσετε το Phoenix, πρέπει να κάνετε λήψη και εγκατάσταση τόσο του HBase όσο και του Phoenix. Μπορείτε να βρείτε τη σελίδα λήψης του Phoenix (και τις σημειώσεις συμβατότητας HBase) εδώ.

Λήψη και ρύθμιση

Τη στιγμή αυτής της γραφής, η τελευταία έκδοση του Phoenix είναι 4.6.0 και η σελίδα λήψης αναφέρει ότι το 4.x είναι συμβατό με την έκδοση HBase 0.98.1+. Για παράδειγμα, έκανα λήψη της τελευταίας έκδοσης του Phoenix που έχει διαμορφωθεί ώστε να λειτουργεί με το HBase 1.1. Μπορείτε να το βρείτε στο φάκελο: phoenix-4.6.0-HBase-1.1 /.

Εδώ είναι η εγκατάσταση:

  1. Πραγματοποιήστε λήψη και αποσυμπίεση αυτού του αρχείου και, στη συνέχεια, χρησιμοποιήστε μία από τις προτεινόμενες σελίδες καθρέφτη εδώ για να κατεβάσετε το HBase. Για παράδειγμα, επέλεξα έναν καθρέφτη, πλοήγησα στο φάκελο 1.1.2 και έκανα λήψη hbase-1.1.2-bin.tar.gz.
  2. Αποσυμπιέστε αυτό το αρχείο και δημιουργήστε ένα HBASE_HOME μεταβλητή περιβάλλοντος που δείχνει για παράδειγμα, πρόσθεσα τα ακόλουθα στο δικό μου ~ / .bash_profile αρχείο (σε Mac): εξαγωγή HBASE_HOME = / Χρήστες / shaines / Λήψεις / hbase-1.1.2.

Ενσωματώστε το Phoenix με το HBase

Η διαδικασία ενσωμάτωσης του Phoenix στο HBase είναι απλή:

  1. Αντιγράψτε το ακόλουθο αρχείο από τον ριζικό κατάλογο Phoenix στο HBase lib Ευρετήριο: phoenix-4.6.0-HBase-1.1-server.jar.
  2. Ξεκινήστε το HBase εκτελώντας το ακόλουθο σενάριο από το HBase's αποθήκη Ευρετήριο:./start-hbase.sh.
  3. Με την εκτέλεση του HBase, ελέγξτε ότι το Phoenix λειτουργεί εκτελώντας την κονσόλα SQLLine, εκτελώντας την ακόλουθη εντολή από το Phoenix's αποθήκη Ευρετήριο: ./sqlline.py localhost.

Η κονσόλα SQLLine

sqlline.py είναι ένα σενάριο Python που ξεκινά μια κονσόλα που συνδέεται με τη διεύθυνση Zookeeper του HBase. localhost σε αυτήν την περίπτωση. Μπορείτε να δείτε ένα παράδειγμα που πρόκειται να συνοψίσω σε αυτήν την ενότητα εδώ.

Αρχικά, ας δούμε όλους τους πίνακες στο HBase εκτελώντας !τραπέζι:

 0: jdbc: phoenix: localhost>! Πίνακες + --------------------------------------- --- + ------------------------------------------ + --- --------------------------------------- + ---------- -------------------------------- + ----------------- --------- + | ΠΙΝΑΚΑΣ_CAT | ΠΙΝΑΚΑΣ_SCHEM | ΠΙΝΑΚΑΣ | ΠΙΝΑΚΑΣ_ΤΥΠΟΣ | ΠΑΡΑΤΗΡΗΣΕΙΣ | + ------------------------------------------ + ------ ------------------------------------ + ------------- ----------------------------- + -------------------- ---------------------- + -------------------------- + | | ΣΥΣΤΗΜΑ | ΚΑΤΑΛΟΓΟΣ | ΠΙΝΑΚΑΣ ΣΥΣΤΗΜΑΤΟΣ | | | | ΣΥΣΤΗΜΑ | ΛΕΙΤΟΥΡΓΙΑ | ΠΙΝΑΚΑΣ ΣΥΣΤΗΜΑΤΟΣ | | | | ΣΥΣΤΗΜΑ | ΑΚΟΛΟΥΘΙΑ | ΠΙΝΑΚΑΣ ΣΥΣΤΗΜΑΤΟΣ | | | | ΣΥΣΤΗΜΑ | ΚΑΤΑΣΤΑΣΕΙΣ | ΠΙΝΑΚΑΣ ΣΥΣΤΗΜΑΤΟΣ | | + ------------------------------------------ + ------ ------------------------------------ + ------------- ----------------------------- + -------------------- ---------------------- + -------------------------- + 

Επειδή πρόκειται για μια νέα παρουσία του HBase, οι μόνοι πίνακες που υπάρχουν είναι πίνακες συστήματος. Μπορείτε να δημιουργήσετε έναν πίνακα εκτελώντας ένα δημιουργία πίνακα εντολή:

 0: jdbc: phoenix: localhost>δημιουργία δοκιμής πίνακα (ακέραιος αριθμός κλειδιού όχι μηδενικό πρωτεύον κλειδί, mycolumn varchar). Δεν επηρεάζονται σειρές (2.448 δευτερόλεπτα) 

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

 0: jdbc: phoenix: localhost>αυξάνεται στις τιμές δοκιμής (1, «Γεια»). Επηρεάστηκε 1 σειρά (0,142 δευτερόλεπτα) 0: jdbc: phoenix: localhost>αυξάνεται στις τιμές δοκιμής (2, «Κόσμος!»). Επηρεάστηκε 1 σειρά (0,008 δευτερόλεπτα) 

ΥΠΑΡΧΕΙ είναι μια εντολή SQL για την εισαγωγή μιας εγγραφής εάν δεν υπάρχει ή για την ενημέρωση μιας εγγραφής εάν το κάνει. Σε αυτήν την περίπτωση, εισαγάγαμε (1, «Γεια») και (2, «Κόσμος!»). Μπορείτε να βρείτε την πλήρη αναφορά εντολών Phoenix εδώ. Τέλος, ρωτήστε τον πίνακα σας για να δείτε τις τιμές που εφαρμόσατε εκτελώντας επιλέξτε * από τη δοκιμή:

 0: jdbc: phoenix: localhost>επιλέξτε * από τη δοκιμή. + ------------------------------------------ + ------ ------------------------------------ + | ΜΥΚΕΥ | ΜΥΚΟΛΟΥΜΝ | + ------------------------------------------ + ------ ------------------------------------ + | 1 | Γεια σας | 2 | Κόσμος! | + ------------------------------------------ + ------ ------------------------------------ + 2 σειρές επιλέχθηκαν (0,111 δευτερόλεπτα) 

Όπως αναμενόταν, θα δείτε τις τιμές που μόλις εισαγάγατε. Εάν θέλετε να καθαρίσετε τον πίνακα, εκτελέστε ένα δοκιμή πτώσης πίνακα εντολή.