Οδηγός Apache Sqoop: ArchiΤεχνολογία, Εντολές & Παράδειγμα

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

Το Apache Sqoop μετακινεί μαζικά δεδομένα μεταξύ σχεσιακών βάσεων δεδομένων και HDFS χρησιμοποιώντας μια αρχιτεκτονική σύνδεσης, δημιουργώντας εργασίες MapReduce που εισάγουν πίνακες στο Hive ή το HBase και εξάγουν τα επεξεργασμένα αποτελέσματα πίσω στο σύστημα προέλευσης.

  • 🔘 Ορισμός: Το Sqoop μεταφέρει μαζικά δεδομένα μεταξύ δομημένων καταστημάτων και HDFS μέσω ενός επιπέδου σύνδεσης που βασίζεται σε πρόσθετα (plugins).
  • ☑️ Archiδομή: Κάθε εργασία μεταγλωττίζεται σε ένα πρόγραμμα MapReduce που χρησιμοποιεί μόνο χάρτη, του οποίου οι εργασίες τραβούν παράλληλα ξεχωριστά τμήματα του πίνακα.
  • Συνδέσεις: Πακέτο κάλυψης οδηγών MySQL, PostgreSQL, Oracle, SQL Server και DB2, καθώς και μια γενική εφεδρική έκδοση JDBC.
  • 🧪 εντολές: Το εργαλείο εισαγωγής τραβάει έναν πίνακα σε HDFS, Hive ή HBase, ενώ το εργαλείο εξαγωγής ωθεί τα επεξεργασμένα αρχεία πίσω σε έναν πίνακα.
  • Λειτουργίες φόρτωσης: Οι πλήρεις φορτώσεις αντιγράφουν έναν ολόκληρο πίνακα, ενώ οι λειτουργίες προσάρτησης και lastmodified αυξητικών τιμών ανακτούν μόνο νέες γραμμές.
  • ⚠️ Κατάσταση έργου: Ο Sqoop αποσύρθηκε στη σοφίτα των Apache τον Ιούλιο του 2021, οπότε Spark Οι JDBC και NiFi διαθέτουν πλέον νέους αγωγούς.

Εκπαιδευτικό σεμινάριο Apache Sqoop που καλύπτει την αρχιτεκτονική, τους συνδέσμους και τις εντολές εισαγωγής και εξαγωγής

Τι είναι το 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 που δείχνει το επίπεδο σύνδεσης που συνδέει ένα RDBMS με ένα σύμπλεγμα Hadoop

Κάτω από το επίπεδο σύνδεσης, το Sqoop δημιουργεί ένα Java κλάση που αντικατοπτρίζει μία γραμμή του πίνακα και στη συνέχεια υποβάλλει έναν χάρτη μόνο ΜΕΙΩΣΗ ΧΑΡΤΗ εργασία. Κάθε εργασία αντιστοίχισης διαβάζει το δικό της τμήμα του εύρους της διαιρεμένης στήλης, επομένως η απόδοση κλιμακώνεται με τον αριθμό των αντιστοιχιστών και όχι με έναν μόνο δρομέα JDBC.

Επιπλέον, το Sqoop διαθέτει διάφορες συνδέσεις τρίτων για αποθήκες δεδομένων, που κυμαίνονται από εταιρικά αποθήκες δεδομένων (συμπεριλαμβανομένων των Netezza, Teradata και Oracle) σε καταστήματα NoSQL (όπως το Couchbase). Ωστόσο, αυτοί οι σύνδεσμοι δεν συνοδεύονται από το πακέτο Sqoop. Αυτά πρέπει να ληφθούν χωριστά και μπορούν να προστεθούν εύκολα σε μια υπάρχουσα εγκατάσταση Sqoop.

Γιατί χρειαζόμαστε το Sqoop;

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

Σημαντικά ζητήματα:

  1. Φόρτωση δεδομένων χρησιμοποιώντας σενάρια — Η παραδοσιακή προσέγγιση της χρήσης σεναρίων για τη φόρτωση δεδομένων δεν είναι κατάλληλη για μαζική φόρτωση δεδομένων στο Hadoop. Αυτή η προσέγγιση είναι αναποτελεσματική και πολύ χρονοβόρα.
  2. Άμεση πρόσβαση σε εξωτερικά δεδομένα μέσω μιας εφαρμογής 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 όπως Τάλεντ Προκατασκευασμένες συνδέσεις, προγραμματισμός και γενεαλογία χωρίς χειρόγραφες εργασίες.

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

Το Sqoop 1 είναι ο μοναδικός πελάτης γραμμής εντολών που χρησιμοποιεί κάθε εκπαιδευτικό σεμινάριο. Το Sqoop 2 πρόσθεσε έναν διακομιστή, REST API και web UI, αλλά ποτέ δεν έφτασε στην ισοτιμία χαρακτηριστικών και ποτέ δεν χαρακτηρίστηκε ως έτοιμο για παραγωγή, επομένως η γραμμή 1.4.x παρέμεινε στάνταρ.

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

Το Copilot συντάσσει γρήγορα τον σκελετό των ορισμάτων, αλλά αναμειγνύει τη σύνταξη του Sqoop 1 και του Sqoop 2 και επινοεί σημαίες που καμία έκδοση δεν δέχεται. Ελέγξτε κάθε όρισμα με τον Οδηγό Χρήστη του Sqoop για την εγκατεστημένη έκδοση πριν προγραμματίσετε την εργασία.

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

Ένας κωδικός πρόσβασης που πληκτρολογείται στη γραμμή εντολών είναι ορατός σε οποιονδήποτε καταχωρεί διεργασίες. Αποθηκεύστε τον σε ένα αρχείο HDFS που είναι αναγνώσιμο μόνο από τον κάτοχο της εργασίας και κατευθύνετε το όρισμα password-file σε αυτόν ή χρησιμοποιήστε την διαδραστική προτροπή.

Το οριοθετημένο κείμενο είναι η προεπιλεγμένη επιλογή. Υποστηρίζονται επίσης τα SequenceFile, Avro και Parquet, καθένα από τα οποία επιλέγεται με το δικό του όρισμα. Το Columnar Parquet είναι κατάλληλο για μεταγενέστερα αναλυτικά ερωτήματα, ενώ το οριοθετημένο κείμενο παραμένει το πιο εύκολο στην επιθεώρηση και την εισαγωγή σε μια εξαγωγή.

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

A Java χρόνου εκτέλεσης, ένα διαμορφωμένο Hadoop πελάτης που μπορεί να φτάσει στο σύμπλεγμα και το JAR του προγράμματος οδήγησης JDBC για τη βάση δεδομένων προορισμού που βρίσκεται στον κατάλογο της βιβλιοθήκης Sqoop. Τα JAR προγραμμάτων οδήγησης που λείπουν είναι η πιο συνηθισμένη αποτυχία πρώτης εκτέλεσης.

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