Οδηγός Apache Sqoop: ArchiΤεχνολογία, Εντολές & Παράδειγμα
⚡ Έξυπνη Σύνοψη
Το Apache Sqoop μετακινεί μαζικά δεδομένα μεταξύ σχεσιακών βάσεων δεδομένων και HDFS χρησιμοποιώντας μια αρχιτεκτονική σύνδεσης, δημιουργώντας εργασίες MapReduce που εισάγουν πίνακες στο Hive ή το HBase και εξάγουν τα επεξεργασμένα αποτελέσματα πίσω στο σύστημα προέλευσης.
Τι είναι το SQOOP στο Hadoop;
Apache Sqoop (SQL-to-Hadoop) είναι ένα εργαλείο σχεδιασμένο για να υποστηρίζει μαζική εξαγωγή και εισαγωγή δεδομένων σε ΚΑΕ από δομημένα αποθετήρια δεδομένων όπως σχεσιακές βάσεις δεδομένων, αποθήκες δεδομένων επιχειρήσεων και συστήματα NoSQL. Είναι ένα εργαλείο μετεγκατάστασης δεδομένων που βασίζεται σε μια αρχιτεκτονική σύνδεσης που υποστηρίζει πρόσθετα (plugins) για την παροχή συνδεσιμότητας σε νέα εξωτερικά συστήματα.
Ένα παράδειγμα περίπτωσης χρήσης του Hadoop Sqoop είναι μια επιχείρηση που εκτελεί μια νυχτερινή εισαγωγή Sqoop για να φορτώσει τα δεδομένα της ημέρας από ένα συναλλακτικό RDBMS παραγωγής σε ένα Κυψέλη αποθήκη δεδομένων για περαιτέρω ανάλυση.
Στη συνέχεια, σε αυτό το σεμινάριο Apache Sqoop, θα μάθουμε για την αρχιτεκτονική Apache Sqoop.
Κουτάλα Archiδομή
Όλα τα υπάρχοντα Συστήματα διαχείρισης βάσεων δεδομένων έχουν σχεδιαστεί με SQL στάνταρ στο μυαλό. Ωστόσο, κάθε DBMS διαφέρει ως προς τη διάλεκτο σε κάποιο βαθμό. Έτσι, αυτή η διαφορά θέτει προκλήσεις όσον αφορά τις μεταφορές δεδομένων σε όλα τα συστήματα. Τα Sqoop Connectors είναι στοιχεία που βοηθούν στην αντιμετώπιση αυτών των προκλήσεων.
Η μεταφορά δεδομένων μεταξύ του Sqoop Hadoop και του εξωτερικού συστήματος αποθήκευσης γίνεται δυνατή με τη βοήθεια των υποδοχών του Sqoop.
Το Sqoop διαθέτει συνδέσμους για εργασία με μια σειρά δημοφιλών σχεσιακών βάσεων δεδομένων, μεταξύ των οποίων MySQL, PostgreSQL, Oracle, SQL Server και DB2. Κάθε μία από αυτές τις υποδοχές γνωρίζει πώς να αλληλεπιδρά με το σχετικό DBMS. Υπάρχει επίσης μια γενική υποδοχή JDBC για σύνδεση σε οποιαδήποτε βάση δεδομένων που υποστηρίζει Javaπρωτόκολλο JDBC. Επιπλέον, το Sqoop παρέχει επίσης βελτιστοποιημένες MySQL και PostgreSQL συνδέσεις που χρησιμοποιούν API ειδικά για βάση δεδομένων για την αποτελεσματική εκτέλεση μαζικών μεταφορών.
Το παρακάτω διάγραμμα τοποθετεί τον πελάτη Sqoop μεταξύ του εξωτερικού χώρου αποθήκευσης δεδομένων και του συμπλέγματος Hadoop, με το επίπεδο σύνδεσης στη μία πλευρά και τα HDFS, Hive και HBase στην άλλη.
Κάτω από το επίπεδο σύνδεσης, το Sqoop δημιουργεί ένα Java κλάση που αντικατοπτρίζει μία γραμμή του πίνακα και στη συνέχεια υποβάλλει έναν χάρτη μόνο ΜΕΙΩΣΗ ΧΑΡΤΗ εργασία. Κάθε εργασία αντιστοίχισης διαβάζει το δικό της τμήμα του εύρους της διαιρεμένης στήλης, επομένως η απόδοση κλιμακώνεται με τον αριθμό των αντιστοιχιστών και όχι με έναν μόνο δρομέα JDBC.
Επιπλέον, το Sqoop διαθέτει διάφορες συνδέσεις τρίτων για αποθήκες δεδομένων, που κυμαίνονται από εταιρικά αποθήκες δεδομένων (συμπεριλαμβανομένων των Netezza, Teradata και Oracle) σε καταστήματα NoSQL (όπως το Couchbase). Ωστόσο, αυτοί οι σύνδεσμοι δεν συνοδεύονται από το πακέτο Sqoop. Αυτά πρέπει να ληφθούν χωριστά και μπορούν να προστεθούν εύκολα σε μια υπάρχουσα εγκατάσταση Sqoop.
Γιατί χρειαζόμαστε το Sqoop;
Η αναλυτική επεξεργασία με χρήση του Hadoop απαιτεί τη φόρτωση τεράστιων ποσοτήτων δεδομένων από διαφορετικές πηγές σε συστάδες Hadoop. Αυτή η διαδικασία μαζικής φόρτωσης δεδομένων στο Hadoop, από ετερογενείς πηγές και στη συνέχεια επεξεργασίας τους, συνοδεύεται από ένα συγκεκριμένο σύνολο προκλήσεων. Η διατήρηση και η διασφάλιση της συνέπειας των δεδομένων και η διασφάλιση της αποτελεσματικής χρήσης των πόρων είναι ορισμένοι παράγοντες που πρέπει να ληφθούν υπόψη πριν επιλέξετε τη σωστή προσέγγιση για τη φόρτωση δεδομένων.
Σημαντικά ζητήματα:
- Φόρτωση δεδομένων χρησιμοποιώντας σενάρια — Η παραδοσιακή προσέγγιση της χρήσης σεναρίων για τη φόρτωση δεδομένων δεν είναι κατάλληλη για μαζική φόρτωση δεδομένων στο Hadoop. Αυτή η προσέγγιση είναι αναποτελεσματική και πολύ χρονοβόρα.
- Άμεση πρόσβαση σε εξωτερικά δεδομένα μέσω μιας εφαρμογής Map-Reduce — Η παροχή άμεσης πρόσβασης στα δεδομένα που βρίσκονται σε εξωτερικά συστήματα (χωρίς φόρτωση στο Hadoop) για εφαρμογές μείωσης χαρτών περιπλέκει αυτές τις εφαρμογές. Επομένως, αυτή η προσέγγιση δεν είναι εφικτή.
Εκτός από την ικανότητα να επεξεργάζεται τεράστια δεδομένα, το Hadoop μπορεί να επεξεργαστεί δεδομένα σε διάφορες μορφές. Έτσι, για να φορτώσει τέτοια ετερογενή δεδομένα στο Hadoop, έχουν αναπτυχθεί διαφορετικά εργαλεία. Κουτάλα και Ροή είναι δύο τέτοια εργαλεία φόρτωσης δεδομένων.
Στη συνέχεια, σε αυτό το σεμινάριο Sqoop με παραδείγματα, θα μάθουμε για τη διαφορά μεταξύ Sqoop, Flume και HDFS.
Sqoop vs Flume vs HDFS στο Hadoop
| Κουτάλα | Ροή | ΚΑΕ |
|---|---|---|
| Το Sqoop χρησιμοποιείται για την εισαγωγή δεδομένων από δομημένες πηγές δεδομένων όπως το RDBMS. | Το Flume χρησιμοποιείται για τη μεταφορά δεδομένων μαζικής ροής σε HDFS. | Το HDFS είναι ένα κατανεμημένο σύστημα αρχείων που χρησιμοποιείται από το οικοσύστημα Hadoop για την αποθήκευση δεδομένων. |
| Το Sqoop έχει αρχιτεκτονική που βασίζεται σε συνδέσμους. Οι σύνδεσμοι γνωρίζουν πώς να συνδέονται με την αντίστοιχη πηγή δεδομένων και να ανακτούν τα δεδομένα. | Το Flume έχει αρχιτεκτονική βασισμένη σε πράκτορες. Εδώ, γράφεται ένας κώδικας (ο οποίος ονομάζεται «πράκτορας») που φροντίζει για την ανάκτηση δεδομένων. | Το HDFS έχει μια κατανεμημένη αρχιτεκτονική όπου τα δεδομένα διανέμονται σε πολλούς κόμβους δεδομένων. |
| Το HDFS είναι ένας προορισμός για εισαγωγή δεδομένων με χρήση του Sqoop. | Τα δεδομένα ρέουν στο HDFS μέσω μηδέν ή περισσότερων καναλιών. | Το HDFS είναι ο απόλυτος προορισμός για αποθήκευση δεδομένων. |
| Η φόρτωση δεδομένων Sqoop δεν βασίζεται σε συμβάντα. | Το φορτίο δεδομένων ροής μπορεί να οδηγηθεί από ένα συμβάν. | Το HDFS απλώς αποθηκεύει δεδομένα που του παρέχονται με οποιοδήποτε μέσο. |
| Για να εισαγάγετε δεδομένα από πηγές δομημένων δεδομένων, πρέπει να χρησιμοποιήσετε μόνο εντολές Sqoop, επειδή οι σύνδεσμοί του ξέρουν πώς να αλληλεπιδρούν με πηγές δομημένων δεδομένων και να ανακτούν δεδομένα από αυτές. | Για να φορτωθούν δεδομένα ροής, όπως tweets που δημιουργούνται στο Twitter ή αρχεία καταγραφής ενός διακομιστή ιστού, θα πρέπει να χρησιμοποιείται το Flume. Οι πράκτορες Flume έχουν κατασκευαστεί για την ανάκτηση δεδομένων ροής. | Το HDFS έχει τις δικές του ενσωματωμένες εντολές κελύφους για την αποθήκευση δεδομένων σε αυτό. Το HDFS δεν μπορεί να εισαγάγει δεδομένα ροής. |
Βασικά χαρακτηριστικά του Sqoop
Η παραπάνω σύγκριση εξηγεί πού ανήκει το Sqoop. Το παρακάτω σύνολο χαρακτηριστικών αποφασίζει εάν ταιριάζει σε μια συγκεκριμένη εργασία κατάποσης.
- Πλήρες φορτίο: Μία μόνο εντολή αντιγράφει έναν ολόκληρο πίνακα και
import-all-tablesαντιγράφει κάθε πίνακα σε ένα σχήμα με ένα πέρασμα. - Αυξητικό φορτίο:
appendτρόπος tracks μια μονοτονικά αυξανόμενη στήλη όπως ένα υποκατάστατο κλειδί, ενώlastmodifiedτρόπος tracks μια στήλη χρονικής σήμανσης, επομένως μετακινούνται μόνο νέες ή τροποποιημένες γραμμές. - Παράλληλη μεταφορά: Η στήλη διαίρεσης διαιρεί το εύρος κλειδιών μεταξύ των εργασιών αντιστοίχισης και ο αριθμός των χαρτογράφων ορίζει πόσες εκτελούνται ταυτόχρονα.
- Εισαγωγή ερωτήματος ελεύθερης μορφής: Το αποτέλεσμα μιας αυθαίρετης πρότασης SQL μπορεί να εισαχθεί αντί για ολόκληρο τον πίνακα, κάτι που διατηρεί τις ενώσεις και τα φίλτρα στην πλευρά της βάσης δεδομένων.
- Άμεση φόρτωση στην αποθήκη: Μια εισαγωγή μπορεί να δημιουργήσει και να συμπληρώσει ένα Κυψέλη πίνακα ή εγγραφή απευθείας σε έναν πίνακα HBase αντί να σταματήσειping σε ακατέργαστα αρχεία HDFS.
- Συμπίεση και μορφές αρχείων: Η έξοδος μπορεί να γραφτεί ως οριοθετημένο κείμενο, SequenceFile, Avro ή Parquet, με προαιρετική συμπίεση σε επίπεδο κωδικοποιητή.
- Ασφάλεια: Το Sqoop ενσωματώνεται με το Kerberos και τα διαπιστευτήρια μπορούν να διαβαστούν από ένα αρχείο κωδικών πρόσβασης ή να ζητηθούν αντί να πληκτρολογηθούν στη γραμμή εντολών.
Εντολές εισαγωγής και εξαγωγής Sqoop
Και οι δύο κατευθύνσεις της μεταφοράς εκτελούνται μέσω ενός βοηθητικού προγράμματος γραμμής εντολών. Το εργαλείο εισαγωγής μετακινεί γραμμές από τη βάση δεδομένων στο Hadoop και το εργαλείο εξαγωγής μετακινεί αρχεία από το Hadoop πίσω σε έναν πίνακα βάσης δεδομένων.
Μια τυπική εισαγωγή ονομάζει τη σύνδεση JDBC, τον πίνακα προέλευσης, τον κατάλογο προορισμού, τη στήλη διαίρεσης και τον αριθμό του mapper:
sqoop import \ --connect jdbc:mysql://localhost:3306/employees \ --username hadoop \ --password-file /user/hadoop/.mysql.password \ --table employees \ --target-dir /user/hadoop/warehouse/employees \ --split-by emp_no \ --num-mappers 4
Μια εξαγωγή αντιστρέφει τη ροή. Διαβάζει τα οριοθετημένα αρχεία που βρίσκονται ήδη σε έναν κατάλογο HDFS και τα εισάγει σε έναν υπάρχοντα πίνακα, επομένως ο πίνακας-στόχος πρέπει πρώτα να δημιουργηθεί:
sqoop export \ --connect jdbc:mysql://localhost:3306/employees \ --username hadoop \ --password-file /user/hadoop/.mysql.password \ --table employee_summary \ --export-dir /user/hadoop/warehouse/employee_summary \ --input-fields-terminated-by ','
Μια νυχτερινή εργασία σπάνια χρειάζεται ολόκληρο τον πίνακα δύο φορές. Μια σταδιακή εισαγωγή καταγράφει την υψηλότερη τιμή που έχει ήδη δει και ξεκινά από εκεί στην επόμενη εκτέλεση:
sqoop import \ --connect jdbc:mysql://localhost:3306/sales \ --table orders \ --incremental append \ --check-column order_id \ --last-value 15000 \ --target-dir /user/hadoop/warehouse/orders
Αυτά είναι τα επιχειρήματα που εμφανίζονται σχεδόν σε κάθε δουλειά:
| Διαφωνία | Τι ελέγχει |
|---|---|
--connect |
JDBC URL της βάσης δεδομένων προέλευσης ή προορισμού. |
--table |
Πίνακας από τον οποίο διαβάζεται κατά την εισαγωγή ή στον οποίο γράφεται κατά την εξαγωγή. |
--target-dir |
Κατάλογος HDFS που λαμβάνει μια εισαγωγή. Δεν πρέπει να υπάρχει ήδη. |
--export-dir |
Κατάλογος HDFS του οποίου τα αρχεία διαβάζονται από μια εξαγωγή. |
--split-by |
Στήλη της οποίας το εύρος διαιρείται σε εργασίες χάρτη. |
--num-mappers (-m) |
Αριθμός παράλληλων εργασιών χάρτη. Η προεπιλογή είναι τέσσερις. |
--incremental |
Επιλέγει append or lastmodified αλλαγή tracΒασιλιάς. |
--hive-import |
Δημιουργεί τον αντίστοιχο πίνακα Hive και φορτώνει τα εισαγόμενα δεδομένα σε αυτόν. |
⚠️ Προσοχή: Μια εξαγωγή δεν είναι μία μόνο συναλλαγή. Κάθε εργασία αντιστοίχισης υποβάλλει τη δική της παρτίδα, επομένως μια αποτυχία στη μέση μπορεί να αφήσει μέρος των δεδομένων στον πίνακα προορισμού. Δρομολογήστε την εγγραφή μέσω ενός πίνακα σταδιακής κατάταξης όταν η φόρτωση πρέπει να είναι όλα ή τίποτα.
Κατάσταση Έργου Sqoop και Σύγχρονες Εναλλακτικές
Μία λεπτομέρεια έκδοσης έχει σημασία πριν οποιαδήποτε από τις παραπάνω εντολές εισέλθει σε έναν χρονοπρογραμματιστή.
Οι προγραμματιστές του Sqoop ψήφισαν να αποσυρθεί το έργο τον Ιούνιο του 2021 και η μετάβαση στο Σοφίτα Apache ολοκληρώθηκε τον Ιούλιο του 2021. Ο ιστότοπος, οι λίστες αλληλογραφίας, το αποθετήριο git, το τεύχος tracΤο ker και οι λήψεις παραμένουν διαθέσιμες, αλλά μόνο για ανάγνωση, και δεν έχουν προγραμματιστεί περαιτέρω κυκλοφορίες. Η τελευταία έκδοση παραγωγής είναι το Sqoop 1.4.7 από το 2017. Η ξεχωριστή σειρά Sqoop 2 (1.99.x) δεν έφτασε ποτέ στην ισοτιμία χαρακτηριστικών και δεν δηλώθηκε ποτέ έτοιμη για παραγωγή.
Οι υπάρχουσες εργασίες Sqoop εξακολουθούν να εκτελούνται και οι εμπορικές διανομές Hadoop συνεχίζουν να αποστέλλουν και να υποστηρίζουν το εργαλείο στις δικές τους πλατφόρμες. Ωστόσο, οι νέες εργασίες εισαγωγής συνήθως βασίζονται σε μία από αυτές:
| Εναλλακτική λύση | καλύτερη εφαρμογή |
|---|---|
| Spark με την πηγή δεδομένων JDBC | Πίνακας παρτίδας extracπου ήδη βρίσκονται μέσα σε ένα Spark αγωγός, με διαμερισμένες αναγνώσεις αντί για mappers. |
| Apache NiFi | Δρομολόγηση βασισμένη σε ροή, οπτικά διαμορφωμένη μεταξύ πολλών ετερογενών συστημάτων. |
| Kafka Connect με υποδοχή CDC | Συνεχής καταγραφή δεδομένων αλλαγών αντί για ένα νυχτερινό παράθυρο παρτίδας. |
| Διαχειριζόμενες πλατφόρμες ETL όπως Τάλεντ | Προκατασκευασμένες συνδέσεις, προγραμματισμός και γενεαλογία χωρίς χειρόγραφες εργασίες. |

