Μια σε βάθος εισαγωγή στην αρχιτεκτονική SQOOP

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

Ως μέρος αυτού του ιστολογίου, θα εξηγήσω πώς λειτουργεί η αρχιτεκτονική για την εκτέλεση μιας εντολής Sqoop. Θα καλύψω λεπτομέρειες όπως η δημιουργία βάζων μέσω του Codegen, η εκτέλεση της εργασίας MapReduce και τα διάφορα στάδια που εμπλέκονται στην εκτέλεση μιας εντολής εισαγωγής / εξαγωγής Sqoop.

Codegen

Η κατανόηση του Codegen είναι απαραίτητη, καθώς εσωτερικά αυτό μετατρέπει τη δουλειά μας στο Sqoop σε ένα βάζο που αποτελείται από πολλές κατηγορίες Java όπως POJO, ORM και μια κλάση που εφαρμόζει DBWritable, επεκτείνοντας το SqoopRecord για να διαβάζει και να γράφει τα δεδομένα από σχετικές βάσεις δεδομένων σε Hadoop & Vice- αντίστροφα.

Μπορείτε να δημιουργήσετε ένα Codegen ρητά όπως φαίνεται παρακάτω για να ελέγξετε τις τάξεις που υπάρχουν ως μέρος του βάζου.

sqoop codegen \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_db \ -- username retail_user \ -- password ******* \ -- table products

Το βάζο εξόδου θα γραφτεί στο τοπικό σας σύστημα αρχείων. Θα λάβετε ένα αρχείο Jar, ένα αρχείο Java και αρχεία java τα οποία μεταγλωττίζονται σε αρχεία .class:

Ας δούμε ένα απόσπασμα του κώδικα που θα δημιουργηθεί.

Κατηγορία ORM για πίνακες «προϊόντα» // Αντικειμενικός σχεσιακός τρόπος παραγωγής για χαρτογράφηση

Μέθοδοι Setter & Getter για λήψη τιμών:

Εσωτερικά χρησιμοποιεί JDBC προετοιμασμένες δηλώσεις για να γράψει στο Hadoop και στο ResultSet για να διαβάσει δεδομένα από το Hadoop.

Εισαγωγή Sqoop

Χρησιμοποιείται για την εισαγωγή δεδομένων από παραδοσιακές σχεσιακές βάσεις δεδομένων στο Hadoop.

Ας δούμε ένα δείγμα αποσπάσματος για το ίδιο.

sqoop import \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_db \ -- username retail_user \ -- password ******* \ -- table products \ -- warehouse-dir /user/jvanchir/sqoop_prac/import_table_dir \ -- delete-target-dir

Τα ακόλουθα βήματα πραγματοποιούνται εσωτερικά κατά την εκτέλεση του sqoop.

Βήμα 1 : Διαβάστε δεδομένα από τη MySQL σε ροή μόδας. Κάνει διάφορες λειτουργίες πριν γράψει τα δεδομένα σε HDFS.

Ως μέρος αυτής της διαδικασίας, θα δημιουργήσει πρώτα κώδικα (τυπικός κωδικός μείωσης χάρτη), ο οποίος δεν είναι παρά κώδικας Java Χρησιμοποιώντας αυτόν τον κώδικα Java θα προσπαθήσει να εισαγάγει.

  • Δημιουργήστε τον κωδικό. (Hadoop MR)
  • Μεταγλώττιση του κώδικα και δημιουργία του αρχείου Jar.
  • Υποβάλετε το αρχείο Jar και εκτελέστε τις εργασίες εισαγωγής

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

Βήμα 2 : Κατανοήστε τη δομή των δεδομένων και εκτελέστε το CodeGen

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

Βήμα 3 : Δημιουργήστε το αρχείο java, μεταγλωττίστε το και δημιουργήστε ένα αρχείο βάζου

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

Αυτό το αρχείο βάζου θα εγχυθεί σε δυαδικά Sqoop για να εφαρμόσει τη δομή στα εισερχόμενα δεδομένα.

Βήμα 4 : Διαγράψτε τον κατάλογο προορισμού εάν υπάρχει ήδη.

Βήμα 5 : Εισαγάγετε τα δεδομένα

Εδώ, συνδέεται με έναν διαχειριστή πόρων, παίρνει τον πόρο και ξεκινά τον κύριο εφαρμογών.

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

για να βρείτε τον ελάχιστο και μέγιστο αριθμό εγγραφών στον πίνακα.

Based on the max count, it will divide by the number of mappers and split it amongst each mapper.

It uses 4 mappers by default:

It executes these jobs on different executors as shown below:

The default number of mappers can be changed by setting the following parameter:

So in our case, it uses 4 threads. Each thread processes mutually exclusive subsets, that is each thread processes different data from the others.

To see the different values, check out the below:

Operations that are being performed under each executor nodes:

In case you perform a Sqooop hive import, one extra step as part of the execution takes place.

Step 6: Copy data to hive table

Sqoop Export

This is used to export data from Hadoop into traditional relational databases.

Let’s see a sample snippet for the same:

sqoop export \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_export \ -- username retail_user \ -- password ******* \ -- table product_sqoop_exp \ -- export-dir /user/jvanchir/sqoop_prac/import_table_dir/products

On executing the above command, the execution steps (1–4) similar to Sqoop import take place, but the source data is read from the file system (which is nothing but HDFS). Here it will use boundaries upon block size to divide the data and it is internally taken care by Sqoop.

The processing splits are done as shown below:

After connecting to the respective database to which the records are to be exported, it will issue a JDBC insert command to read data from HDFS and store it into the database as shown below.

Now that we have seen how Sqoop works internally, you can determine the flow of execution from jar generation to execution of a MapReduce task on the submission of a Sqoop job.

Note: The commands that were executed related to this post are added as part of my GIT account.

Similarly, you can also read more here:

  • Κυψέλη Αρχιτεκτονική σε βάθος με κωδικό .
  • Αρχιτεκτονική HDFS σε βάθος με κωδικό .

Αν θέλετε και εσείς, μπορείτε να συνδεθείτε μαζί μου στο LinkedIn - Jayvardhan Reddy.

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