Εκμάθηση HDFS: Αρχιτεκτονική, Ανάγνωση & Εγγραφή λειτουργίας χρησιμοποιώντας Java API

Πίνακας περιεχομένων:

Anonim

Τι είναι το HDFS;

Το HDFS είναι ένα κατανεμημένο σύστημα αρχείων για την αποθήκευση πολύ μεγάλων αρχείων δεδομένων, που εκτελούνται σε ομάδες υλικού υλικού. Είναι ανεκτικό σε σφάλματα, επεκτάσιμο και εξαιρετικά απλό να επεκταθεί. Το Hadoop συνοδεύεται από HDFS ( Hadoop Distributed File Systems ).

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

Σε αυτό το σεμινάριο, θα μάθουμε,

  • Τι είναι το HDFS;
  • Αρχιτεκτονική HDFS
  • Διαβάστε τη λειτουργία
  • Εγγραφή λειτουργίας
  • Αποκτήστε πρόσβαση σε HDFS χρησιμοποιώντας το JAVA API
  • Αποκτήστε πρόσβαση σε HDFS χρησιμοποιώντας το COMMAND-LINE INTERFACE

Αρχιτεκτονική HDFS

Το σύμπλεγμα HDFS αποτελείται κυρίως από ένα NameNode που διαχειρίζεται τα μεταδεδομένα του συστήματος αρχείων και ένα DataNodes που αποθηκεύει τα πραγματικά δεδομένα .

  • NameNode: Το NameNode μπορεί να θεωρηθεί κύριος του συστήματος. Διατηρεί το δέντρο συστήματος αρχείων και τα μεταδεδομένα για όλα τα αρχεία και τους καταλόγους που υπάρχουν στο σύστημα. Δύο αρχεία «Namespace image» και το «edit log» χρησιμοποιούνται για την αποθήκευση πληροφοριών μεταδεδομένων. Το Namenode έχει γνώση όλων των datanodes που περιέχουν μπλοκ δεδομένων για ένα δεδομένο αρχείο, ωστόσο, δεν αποθηκεύει μόνιμα τις θέσεις μπλοκ. Αυτές οι πληροφορίες αναδημιουργούνται κάθε φορά από datanodes κατά την έναρξη του συστήματος.
  • DataNode: Τα DataNode είναι σκλάβοι που βρίσκονται σε κάθε υπολογιστή σε ένα σύμπλεγμα και παρέχουν τον πραγματικό χώρο αποθήκευσης. Είναι υπεύθυνη για την εξυπηρέτηση, την ανάγνωση και τη σύνταξη αιτημάτων για τους πελάτες.

Οι λειτουργίες ανάγνωσης / εγγραφής σε HDFS λειτουργούν σε επίπεδο μπλοκ. Τα αρχεία δεδομένων σε HDFS χωρίζονται σε τεμάχια μεγέθους μπλοκ, τα οποία αποθηκεύονται ως ανεξάρτητες μονάδες. Το προεπιλεγμένο μέγεθος μπλοκ είναι 64 MB.

Το HDFS λειτουργεί σε μια έννοια αντιγραφής δεδομένων όπου δημιουργούνται πολλαπλές αντιγραφές μπλοκ δεδομένων και διανέμονται σε κόμβους σε ένα σύμπλεγμα για να επιτρέπουν υψηλή διαθεσιμότητα δεδομένων σε περίπτωση αποτυχίας κόμβου.

Γνωρίζεις? Ένα αρχείο σε HDFS, το οποίο είναι μικρότερο από ένα μπλοκ, δεν καταλαμβάνει την πλήρη αποθήκευση ενός μπλοκ.

Διαβάστε τη λειτουργία σε HDFS

Το αίτημα ανάγνωσης δεδομένων εξυπηρετείται από HDFS, NameNode και DataNode. Ας καλέσουμε τον αναγνώστη ως «πελάτη». Το παρακάτω διάγραμμα απεικονίζει τη λειτουργία ανάγνωσης αρχείων στο Hadoop.

  1. Ένας πελάτης ξεκινά αίτημα ανάγνωσης καλώντας τη μέθοδο "open ()" του αντικειμένου FileSystem. είναι ένα αντικείμενο του τύπου DistributedFileSystem .
  2. Αυτό το αντικείμενο συνδέεται με το όνομα ονόματος χρησιμοποιώντας RPC και λαμβάνει πληροφορίες μεταδεδομένων, όπως οι θέσεις των μπλοκ του αρχείου. Λάβετε υπόψη ότι αυτές οι διευθύνσεις αποτελούνται από λίγα πρώτα μπλοκ ενός αρχείου.
  3. Σε απάντηση σε αυτό το αίτημα μεταδεδομένων, επιστρέφονται οι διευθύνσεις των DataNodes που έχουν αντίγραφο αυτού του μπλοκ.
  4. Μόλις ληφθούν διευθύνσεις DataNodes, ένα αντικείμενο τύπου FSDataInputStream επιστρέφεται στον υπολογιστή-πελάτη. Το FSDataInputStream περιέχει DFSInputStream που φροντίζει για τις αλληλεπιδράσεις με το DataNode και το NameNode. Στο βήμα 4 που φαίνεται στο παραπάνω διάγραμμα, ένας πελάτης επικαλείται τη μέθοδο «read ()» που κάνει το DFSInputStream να δημιουργήσει μια σύνδεση με το πρώτο DataNode με το πρώτο μπλοκ ενός αρχείου.
  5. Τα δεδομένα διαβάζονται με τη μορφή ροών στις οποίες ο πελάτης επικαλείται επανειλημμένα τη μέθοδο «read ()» . Αυτή η διαδικασία λειτουργίας ανάγνωσης () συνεχίζεται μέχρι να φτάσει στο τέλος του μπλοκ.
  6. Μόλις φτάσει το τέλος ενός μπλοκ, το DFSInputStream κλείνει τη σύνδεση και κινείται για να εντοπίσει τον επόμενο DataNode για το επόμενο μπλοκ
  7. Μόλις ένας πελάτης έχει ολοκληρώσει την ανάγνωση, καλεί μια μέθοδο κλεισίματος () .

Εγγραφή λειτουργίας σε HDFS

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

  1. Ένας πελάτης ξεκινά τη λειτουργία εγγραφής καλώντας τη μέθοδο 'create ()' του αντικειμένου DistributedFileSystem που δημιουργεί ένα νέο αρχείο - Βήμα αρ. 1 στο παραπάνω διάγραμμα.
  2. Το αντικείμενο DistributedFileSystem συνδέεται στο NameNode χρησιμοποιώντας κλήση RPC και ξεκινά τη δημιουργία νέων αρχείων. Ωστόσο, αυτό το αρχείο δημιουργεί λειτουργία δεν συσχετίζει κανένα μπλοκ με το αρχείο. Είναι ευθύνη του NameNode να επαληθεύσει ότι το αρχείο (το οποίο δημιουργείται) δεν υπάρχει ήδη και ότι ένας πελάτης έχει τα σωστά δικαιώματα για τη δημιουργία ενός νέου αρχείου. Εάν υπάρχει ήδη ένα αρχείο ή ο πελάτης δεν έχει επαρκή άδεια για τη δημιουργία ενός νέου αρχείου, τότε το IOException ρίχνεται στον πελάτη. Διαφορετικά, η λειτουργία πετυχαίνει και δημιουργείται μια νέα εγγραφή για το αρχείο από το NameNode.
  3. Μόλις δημιουργηθεί μια νέα εγγραφή στο NameNode, ένα αντικείμενο τύπου FSDataOutputStream επιστρέφεται στον υπολογιστή-πελάτη. Ένας πελάτης το χρησιμοποιεί για να γράψει δεδομένα στο HDFS. Χρησιμοποιείται μέθοδος εγγραφής δεδομένων (βήμα 3 στο διάγραμμα).
  4. Το FSDataOutputStream περιέχει αντικείμενο DFSOutputStream που φροντίζει την επικοινωνία με DataNodes και NameNode. Ενώ ο πελάτης συνεχίζει να γράφει δεδομένα, το DFSOutputStream συνεχίζει να δημιουργεί πακέτα με αυτά τα δεδομένα. Αυτά τα πακέτα τοποθετούνται σε ουρά που ονομάζεται DataQueue .
  5. Υπάρχει ένα ακόμη στοιχείο που ονομάζεται DataStreamer που καταναλώνει αυτό το DataQueue . Το DataStreamer ζητά επίσης το NameNode για την κατανομή νέων μπλοκ επιλέγοντας έτσι τα επιθυμητά DataNodes που θα χρησιμοποιηθούν για αναπαραγωγή.
  6. Τώρα, η διαδικασία αναπαραγωγής ξεκινά δημιουργώντας έναν αγωγό χρησιμοποιώντας DataNodes. Στην περίπτωσή μας, έχουμε επιλέξει ένα επίπεδο αναπαραγωγής του 3 και ως εκ τούτου υπάρχουν 3 DataNodes στο στάδιο της διαδικασίας.
  7. Το DataStreamer ρίχνει πακέτα στον πρώτο DataNode στον αγωγό.
  8. Κάθε DataNode σε έναν αγωγό αποθηκεύει ένα πακέτο που λαμβάνει και προωθεί το ίδιο με το δεύτερο DataNode σε έναν αγωγό.
  9. Μια άλλη ουρά, το "Ack Queue" διατηρείται από το DFSOutputStream για την αποθήκευση πακέτων που περιμένουν αναγνώριση από τα DataNodes.
  10. Μόλις ληφθεί επιβεβαίωση για ένα πακέτο στην ουρά από όλους τους DataNodes στον αγωγό, αφαιρείται από το "Ack Queue". Σε περίπτωση οποιασδήποτε αποτυχίας του DataNode, χρησιμοποιούνται πακέτα από αυτήν την ουρά για την εκκίνηση της λειτουργίας.
  11. Αφού ολοκληρωθεί ένας πελάτης με τα δεδομένα γραφής, καλεί τη μέθοδο κλεισίματος () (Βήμα 9 στο διάγραμμα) Κλήση για κλείσιμο (), οδηγεί σε έξαψη των υπολειπόμενων πακέτων δεδομένων στον αγωγό ακολουθούμενη από αναμονή για επιβεβαίωση.
  12. Μόλις ληφθεί μια τελική επιβεβαίωση, έρχεται σε επαφή το NameNode για να του πει ότι η λειτουργία εγγραφής αρχείου έχει ολοκληρωθεί.

Αποκτήστε πρόσβαση σε HDFS χρησιμοποιώντας το JAVA API

Σε αυτήν την ενότητα, προσπαθούμε να κατανοήσουμε τη διεπαφή Java που χρησιμοποιείται για την πρόσβαση στο σύστημα αρχείων του Hadoop.

Για να αλληλεπιδράσετε με το σύστημα αρχείων του Hadoop μέσω προγραμματισμού, το Hadoop παρέχει πολλές κλάσεις JAVA. Το πακέτο με το όνομα org.apache.hadoop.fs περιέχει τάξεις χρήσιμες για το χειρισμό ενός αρχείου στο σύστημα αρχείων του Hadoop. Αυτές οι λειτουργίες περιλαμβάνουν, άνοιγμα, ανάγνωση, εγγραφή και κλείσιμο. Στην πραγματικότητα, το API αρχείων για Hadoop είναι γενικό και μπορεί να επεκταθεί για να αλληλεπιδράσει με άλλα συστήματα αρχείων εκτός από HDFS.

Διαβάζοντας ένα αρχείο από HDFS, μέσω προγραμματισμού

Το αντικείμενο java.net.URL χρησιμοποιείται για την ανάγνωση περιεχομένων ενός αρχείου. Κατ 'αρχάς, πρέπει να κάνουμε την Java να αναγνωρίσει το σχήμα URL hdfs του Hadoop. Αυτό γίνεται καλώντας τη μέθοδο setURLStreamHandlerFactory σε αντικείμενο URL και μεταβιβάζεται μια παρουσία του FsUrlStreamHandlerFactory. Αυτή η μέθοδος πρέπει να εκτελεστεί μόνο μία φορά ανά JVM, επομένως περικλείεται σε ένα στατικό μπλοκ.

Ένα παράδειγμα κώδικα είναι-

public class URLCat {static {URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());}public static void main(String[] args) throws Exception {InputStream in = null;try {in = new URL(args[0]).openStream();IOUtils.copyBytes(in, System.out, 4096, false);} finally {IOUtils.closeStream(in);}}}

Αυτός ο κωδικός ανοίγει και διαβάζει τα περιεχόμενα ενός αρχείου. Η διαδρομή αυτού του αρχείου σε HDFS μεταφέρεται στο πρόγραμμα ως όρισμα γραμμής εντολών.

Αποκτήστε πρόσβαση σε HDFS χρησιμοποιώντας το COMMAND-LINE INTERFACE

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

Μπορούμε να εκτελέσουμε το "$ HADOOP_HOME / bin / hdfs dfs -help" για να λάβουμε λεπτομερή βοήθεια σε κάθε εντολή. Εδώ, το «dfs» είναι μια εντολή κελύφους του HDFS που υποστηρίζει πολλές υπο-εντολές.

Μερικές από τις ευρέως χρησιμοποιούμενες εντολές παρατίθενται παρακάτω μαζί με κάποιες λεπτομέρειες καθεμιάς.

1. Αντιγράψτε ένα αρχείο από το τοπικό σύστημα αρχείων στο HDFS

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

Αυτή η εντολή αντιγράφει το αρχείο temp.txt από το τοπικό σύστημα αρχείων στο HDFS.

2. Μπορούμε να παραθέσουμε τα αρχεία που υπάρχουν σε έναν κατάλογο χρησιμοποιώντας -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Μπορούμε να δούμε ένα αρχείο 'temp.txt' (αντιγράφηκε νωρίτερα) να αναφέρεται στον κατάλογο '/' .

3. Εντολή για να αντιγράψετε ένα αρχείο στο τοπικό σύστημα αρχείων από HDFS

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

Μπορούμε να δούμε το temp.txt να αντιγράφεται σε ένα τοπικό σύστημα αρχείων.

4. Εντολή για δημιουργία νέου καταλόγου

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Ελέγξτε εάν έχει δημιουργηθεί ένας κατάλογος ή όχι. Τώρα, πρέπει να ξέρετε πώς να το κάνετε ;-)