Άκουσα για πρώτη φορά το Spark στα τέλη του 2013 όταν με ενδιέφερε η Scala, τη γλώσσα στην οποία γράφεται ο Spark. Λίγο αργότερα, έκανα ένα διασκεδαστικό έργο επιστήμης δεδομένων προσπαθώντας να προβλέψτε την επιβίωση στον Τιτανικό . Αυτό αποδείχθηκε ένας πολύ καλός τρόπος για να εισαγάγετε περαιτέρω τις έννοιες και τον προγραμματισμό του Spark. Το συνιστώ ανεπιφύλακτα για κάθε φιλοδοξία Προγραμματιστές Spark ψάχνω για ένα μέρος για να ξεκινήσετε.
Σήμερα, το Spark υιοθετείται από μεγάλους παίκτες όπως το Amazon, το eBay και το Yahoo! Πολλοί οργανισμοί εκτελούν το Spark σε ομάδες με χιλιάδες κόμβους. Σύμφωνα με το Spark FAQ, το μεγαλύτερο γνωστό σύμπλεγμα έχει πάνω από 8000 κόμβους. Πράγματι, το Spark είναι μια τεχνολογία που αξίζει να σημειωθεί και να μάθει.
Αυτό το άρθρο παρέχει μια εισαγωγή στο Spark, συμπεριλαμβανομένων περιπτώσεων χρήσης και παραδειγμάτων. Περιέχει πληροφορίες από τον ιστότοπο Apache Spark καθώς και από το βιβλίο Learning Spark - Ανάλυση δεδομένων μεγάλης ταχύτητας .
Σπίθα είναι ένα έργο Apache που διαφημίζεται ως 'lightning fast cluster computing'. Έχει μια ακμάζουσα κοινότητα ανοιχτού κώδικα και είναι το πιο ενεργό έργο Apache αυτή τη στιγμή.
Το Spark παρέχει μια ταχύτερη και γενικότερη πλατφόρμα επεξεργασίας δεδομένων. Το Spark σάς επιτρέπει να εκτελείτε προγράμματα έως και 100 φορές γρηγορότερα στη μνήμη ή 10 φορές πιο γρήγορα στον δίσκο, από το Hadoop. Πέρυσι, ο Spark ανέλαβε τον Hadoop ολοκληρώνοντας το διαγωνισμό Daytona GraySort 100 TB 3x πιο γρήγορα σε ένα δέκατο του αριθμού των μηχανημάτων και έγινε επίσης το γρηγορότερη μηχανή ανοιχτού κώδικα για τη διαλογή ενός petabyte .
Το Spark επιτρέπει επίσης τη γρήγορη σύνταξη κώδικα, καθώς έχετε στη διάθεσή σας περισσότερους από 80 χειριστές υψηλού επιπέδου. Για να το αποδείξουμε αυτό, ας ρίξουμε μια ματιά στο 'Hello World!' του BigData: το παράδειγμα Word Count. Γράφτηκε στην Java για το MapReduce έχει περίπου 50 γραμμές κώδικα, ενώ στο Spark (και το Scala) μπορείτε να το κάνετε απλά:
sparkContext.textFile('hdfs://...') .flatMap(line => line.split(' ')) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile('hdfs://...')
Μια άλλη σημαντική πτυχή κατά την εκμάθηση του τρόπου χρήσης του Apache Spark είναι το διαδραστικό κέλυφος (REPL) που παρέχει έξω από το κουτί. Χρησιμοποιώντας το REPL, μπορεί κανείς να δοκιμάσει το αποτέλεσμα κάθε γραμμής κώδικα χωρίς να χρειάζεται πρώτα να κωδικοποιήσει και να εκτελέσει ολόκληρη την εργασία. Η διαδρομή προς τον κώδικα εργασίας είναι επομένως πολύ μικρότερη και γίνεται δυνατή η ad hoc ανάλυση δεδομένων.
Επιπλέον βασικά χαρακτηριστικά του Spark περιλαμβάνουν:
Ο πυρήνας Spark συμπληρώνεται από ένα σύνολο ισχυρών βιβλιοθηκών υψηλότερου επιπέδου που μπορούν να χρησιμοποιηθούν απρόσκοπτα στην ίδια εφαρμογή. Αυτές οι βιβλιοθήκες περιλαμβάνουν επί του παρόντος SparkSQL, Spark Streaming, MLlib (για μηχανική εκμάθηση) και GraphX, καθένα από τα οποία περιγράφεται λεπτομερέστερα σε αυτό το άρθρο. Επί του παρόντος βρίσκονται επίσης υπό ανάπτυξη επιπλέον βιβλιοθήκες και επεκτάσεις Spark.
Spark Core είναι ο βασικός κινητήρας για παράλληλη και κατανεμημένη επεξεργασία δεδομένων μεγάλης κλίμακας. Είναι υπεύθυνο για:
Ο Spark εισάγει την έννοια ενός RDD (Ανθεκτικό κατανεμημένο σύνολο δεδομένων) , μια αμετάβλητη ανεκτική βλάβη, κατανεμημένη συλλογή αντικειμένων που μπορούν να λειτουργήσουν παράλληλα. Ένα RDD μπορεί να περιέχει οποιονδήποτε τύπο αντικειμένου και δημιουργείται φορτώνοντας ένα εξωτερικό σύνολο δεδομένων ή διανέμοντας μια συλλογή από το πρόγραμμα οδήγησης.
Τα RDD υποστηρίζουν δύο τύπους λειτουργιών:
Οι μετασχηματισμοί στο Spark είναι «τεμπέλης», που σημαίνει ότι δεν υπολογίζουν αμέσως τα αποτελέσματά τους. Αντ 'αυτού, απλώς «θυμούνται» τη λειτουργία που πρέπει να εκτελεστεί και το σύνολο δεδομένων (π.χ. αρχείο) στο οποίο πρόκειται να εκτελεστεί η λειτουργία. Οι μετασχηματισμοί υπολογίζονται μόνο όταν καλείται μια ενέργεια και το αποτέλεσμα επιστρέφεται στο πρόγραμμα οδήγησης. Αυτός ο σχεδιασμός επιτρέπει στο Spark να λειτουργεί πιο αποτελεσματικά. Για παράδειγμα, εάν ένα μεγάλο αρχείο μετασχηματίστηκε με διάφορους τρόπους και μεταβιβάστηκε στην πρώτη ενέργεια, το Spark θα επεξεργαζόταν και θα επέστρεφε μόνο το αποτέλεσμα για την πρώτη γραμμή, αντί να κάνει τη δουλειά για ολόκληρο το αρχείο.
Από προεπιλογή, κάθε μετασχηματισμένο RDD μπορεί να υπολογίζεται εκ νέου κάθε φορά που εκτελείτε μια ενέργεια σε αυτό. Ωστόσο, ενδέχεται επίσης να διατηρήσετε ένα RDD στη μνήμη χρησιμοποιώντας τη μέθοδο persist ή cache, οπότε το Spark θα διατηρήσει τα στοιχεία γύρω στο σύμπλεγμα για πολύ ταχύτερη πρόσβαση την επόμενη φορά που θα το ζητήσετε.
SparkSQL είναι ένα στοιχείο Spark που υποστηρίζει την αναζήτηση δεδομένων είτε μέσω SQL είτε μέσω του Γλώσσα ερωτήματος κυψέλης . Ξεκίνησε ως η θύρα Apache Hive για να τρέξει πάνω από το Spark (αντί του MapReduce) και τώρα είναι ενσωματωμένο στη στοίβα Spark. Εκτός από την παροχή υποστήριξης για διάφορες πηγές δεδομένων, καθιστά δυνατή την ύφανση ερωτημάτων SQL με μετασχηματισμούς κώδικα που οδηγούν σε ένα πολύ ισχυρό εργαλείο. Ακολουθεί ένα παράδειγμα ενός συμβατού ερωτήματος Hive:
// sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) sqlContext.sql('CREATE TABLE IF NOT EXISTS src (key INT, value STRING)') sqlContext.sql('LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src') // Queries are expressed in HiveQL sqlContext.sql('FROM src SELECT key, value').collect().foreach(println)
Ροή σπινθήρων υποστηρίζει την επεξεργασία δεδομένων ροής σε πραγματικό χρόνο, όπως αρχεία καταγραφής διακομιστή web παραγωγής (π.χ. Apache Flume και HDFS / S3), κοινωνικά μέσα όπως το Twitter και διάφορες ουρές μηνυμάτων όπως η Kafka. Κάτω από την κουκούλα, το Spark Streaming λαμβάνει τις ροές δεδομένων εισόδου και διαιρεί τα δεδομένα σε παρτίδες. Στη συνέχεια, υποβάλλονται σε επεξεργασία από τον κινητήρα Spark και δημιουργούν τελική ροή αποτελεσμάτων σε παρτίδες, όπως απεικονίζεται παρακάτω.
Το Spark Streaming API ταιριάζει πολύ με αυτό του Spark Core, καθιστώντας εύκολο για τους προγραμματιστές να εργάζονται στον κόσμο τόσο των δεδομένων δέσμης όσο και της ροής δεδομένων.
MLlib είναι μια βιβλιοθήκη μηχανικής μάθησης που παρέχει διάφορους αλγόριθμους που έχουν σχεδιαστεί για να κλιμακώνονται σε ένα σύμπλεγμα για ταξινόμηση, παλινδρόμηση, ομαδοποίηση, συλλογικό φιλτράρισμα και ούτω καθεξής (ανατρέξτε στο άρθρο του ApeeScape σχετικά με μηχανική εκμάθηση για περισσότερες πληροφορίες σχετικά με αυτό το θέμα). Μερικοί από αυτούς τους αλγόριθμους λειτουργούν επίσης με ροή δεδομένων, όπως η γραμμική παλινδρόμηση χρησιμοποιώντας συνηθισμένα ελάχιστα τετράγωνα ή k-σημαίνει ομαδοποίηση (και περισσότερα στο δρόμο). Απάχης Οδηγός ελέφαντος (μια βιβλιοθήκη μηχανικής μάθησης για το Hadoop) έχει ήδη απομακρυνθεί από το MapReduce και ένωσε τις δυνάμεις του στο Spark MLlib.
ΓράφημαX είναι μια βιβλιοθήκη για το χειρισμό γραφημάτων και την εκτέλεση παράλληλων γραφημάτων. Παρέχει ένα ομοιόμορφο εργαλείο για ETL, διερευνητική ανάλυση και επαναληπτικούς υπολογισμούς γραφημάτων. Εκτός από τις ενσωματωμένες λειτουργίες για χειρισμό γραφημάτων, παρέχει μια βιβλιοθήκη κοινών αλγορίθμων γραφημάτων όπως το PageRank.
Τώρα που έχουμε απαντήσει στην ερώτηση 'Τι είναι το Apache Spark;', ας σκεφτούμε τι είδους προβλήματα ή προκλήσεις θα μπορούσε να χρησιμοποιηθεί πιο αποτελεσματικά.
Πρόσφατα συνάντησα ένα άρθρο σχετικά με ένα πείραμα εντοπίστε έναν σεισμό αναλύοντας μια ροή Twitter . Είναι ενδιαφέρον ότι αποδείχθηκε ότι αυτή η τεχνική ήταν πιθανό να σας ενημερώσει για έναν σεισμό στην Ιαπωνία γρηγορότερα από την Ιαπωνική Μετεωρολογική Υπηρεσία. Παρόλο που χρησιμοποίησαν διαφορετική τεχνολογία στο άρθρο τους, νομίζω ότι είναι ένα εξαιρετικό παράδειγμα για να δούμε πώς θα μπορούσαμε να χρησιμοποιήσουμε το Spark με απλοποιημένα αποσπάσματα κώδικα και χωρίς τον κώδικα κόλλας.
Κατ 'αρχάς, θα πρέπει να φιλτράρουμε tweets που φαίνονται συναφή όπως «σεισμός» ή «κούνημα». Θα μπορούσαμε εύκολα να χρησιμοποιήσουμε το Spark Streaming για το σκοπό αυτό ως εξής:
TwitterUtils.createStream(...) .filter(_.getText.contains('earthquake') || _.getText.contains('shaking'))
Στη συνέχεια, θα πρέπει να εκτελέσουμε κάποια σημασιολογική ανάλυση στα tweets για να προσδιορίσουμε εάν φαίνεται να αναφέρονται σε ένα τρέχον συμβάν σεισμού. Tweets όπως 'Σεισμός!' ή 'Τώρα τρέμει', για παράδειγμα, θα θεωρούσε θετικούς αγώνες, ενώ tweets όπως 'Παρακολούθηση μιας Διάσκεψης Σεισμών' ή 'Ο χθες του σεισμού ήταν τρομακτικό' δεν θα. Οι συγγραφείς του χαρτιού χρησιμοποίησαν μια μηχανή φορέα υποστήριξης (SVM) για το σκοπό αυτό. Θα κάνουμε το ίδιο εδώ, αλλά μπορούμε επίσης να δοκιμάσουμε ένα έκδοση ροής . Ένα προκύπτον παράδειγμα κώδικα από το MLlib θα μοιάζει με το ακόλουθο:
// We would prepare some earthquake tweet data and load it in LIBSVM format. val data = MLUtils.loadLibSVMFile(sc, 'sample_earthquate_tweets.txt') // Split data into training (60%) and test (40%). val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) val training = splits(0).cache() val test = splits(1) // Run training algorithm to build the model val numIterations = 100 val model = SVMWithSGD.train(training, numIterations) // Clear the default threshold. model.clearThreshold() // Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label) } // Get evaluation metrics. val metrics = new BinaryClassificationMetrics(scoreAndLabels) val auROC = metrics.areaUnderROC() println('Area under ROC = ' + auROC)
Εάν είμαστε ικανοποιημένοι με το ποσοστό πρόβλεψης του μοντέλου, θα μπορούσαμε να προχωρήσουμε στο επόμενο στάδιο και να αντιδράσουμε κάθε φορά που ανακαλύπτουμε σεισμό. Για να ανιχνεύσουμε ένα χρειαζόμαστε έναν συγκεκριμένο αριθμό (δηλαδή, πυκνότητα) θετικών tweets σε ένα καθορισμένο χρονικό παράθυρο (όπως περιγράφεται στο άρθρο). Σημειώστε ότι, για tweets με ενεργοποιημένες τις υπηρεσίες τοποθεσίας Twitter, θα εξαγάγαμε επίσης την τοποθεσία του σεισμού. Οπλισμένοι με αυτήν τη γνώση, θα μπορούσαμε να χρησιμοποιήσουμε το SparkSQL και να ζητήσουμε έναν υπάρχοντα πίνακα Hive (αποθήκευση χρηστών που ενδιαφέρονται να λάβουν ειδοποιήσεις σεισμού) για να ανακτήσουν τις διευθύνσεις email τους και να τους στείλουμε ένα εξατομικευμένο email προειδοποίησης, ως εξής:
// sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) // sendEmail is a custom function sqlContext.sql('FROM earthquake_warning_users SELECT firstName, lastName, city, email') .collect().foreach(sendEmail)
Οι πιθανές περιπτώσεις χρήσης για το Spark ξεπερνούν κατά πολύ την ανίχνευση σεισμών.
Ακολουθεί μια γρήγορη (αλλά σίγουρα πουθενά σχεδόν εξαντλητική) δειγματοληψία άλλων περιπτώσεων χρήσης που απαιτούν την αντιμετώπιση της ταχύτητας, της ποικιλίας και του όγκου των Big Data, για τις οποίες το Spark είναι τόσο κατάλληλο:
Στη βιομηχανία παιχνιδιών, η επεξεργασία και η ανακάλυψη μοτίβων από το πιθανό firehose των γεγονότων σε πραγματικό χρόνο στο παιχνίδι και η δυνατότητα άμεσης ανταπόκρισης σε αυτά είναι μια ικανότητα που θα μπορούσε να αποφέρει μια προσοδοφόρα επιχείρηση, για σκοπούς όπως διατήρηση παικτών, στοχευμένη διαφήμιση, αυτόματη -προσαρμογή του επιπέδου πολυπλοκότητας και ούτω καθεξής.
Στον κλάδο του ηλεκτρονικού εμπορίου, οι πληροφορίες συναλλαγών σε πραγματικό χρόνο θα μπορούσαν να μεταδοθούν σε έναν αλγόριθμο ομαδοποίησης ροής όπως k-μέσα ή συλλογικό φιλτράρισμα όπως ΠΟΤΕ . Τα αποτελέσματα θα μπορούσαν τότε να συνδυαστούν με άλλες μη δομημένες πηγές δεδομένων, όπως σχόλια πελατών ή κριτικές προϊόντων και να χρησιμοποιηθούν για τη συνεχή βελτίωση και προσαρμογή των συστάσεων με την πάροδο του χρόνου με νέες τάσεις.
Στον τομέα της χρηματοδότησης ή της ασφάλειας, η στοίβα Spark θα μπορούσε να εφαρμοστεί σε ένα σύστημα εντοπισμού απάτης ή εισβολής ή ελέγχου ταυτότητας βάσει κινδύνου. Θα μπορούσε να επιτύχει κορυφαία αποτελέσματα συλλέγοντας τεράστια ποσά αρχειοθετημένων αρχείων καταγραφής, συνδυάζοντάς τα με εξωτερικές πηγές δεδομένων, όπως πληροφορίες σχετικά με παραβιάσεις δεδομένων και παραβιασμένους λογαριασμούς (δείτε, για παράδειγμα, https://haveibeenpwned.com/ ) και πληροφορίες από τη σύνδεση / αίτημα όπως γεωγραφική τοποθεσία IP ή ώρα.
Συνοψίζοντας, το Spark βοηθά στην απλοποίηση της απαιτητικής και υπολογιστικά εντατικής εργασίας της επεξεργασίας μεγάλων όγκων δεδομένων πραγματικού χρόνου ή αρχειοθετημένων, τόσο δομημένων όσο και μη δομημένων, ενσωματώνοντας απρόσκοπτα σχετικές πολύπλοκες δυνατότητες, όπως μηχανική εκμάθηση και αλγόριθμοι γραφημάτων. Το Spark φέρνει την επεξεργασία Big Data στις μάζες. Τσέκαρέ το!
Το Spark είναι ένα έργο Apache που διαφημίζεται ως 'lightning fast cluster computing'. Έχει μια ακμάζουσα κοινότητα ανοιχτού κώδικα και είναι το πιο ενεργό έργο Apache αυτή τη στιγμή.
Το Apache Spark είναι γραμμένο στη Σκάλα.
Το Spark συμβάλλει στην απλοποίηση του απαιτητικού και υπολογιστικά εντατικού έργου της επεξεργασίας μεγάλων όγκων σε πραγματικό χρόνο ή αρχειοθετημένων δεδομένων.