Πτυχιακή Εργασία. Θέμα: Υπολογισμός ερωτημάτων κορυφογραμμής 2 διαστάσεων σε κατανεμημένο περιβάλλον με τη βοήθεια της πλατφόρμας λογισμικού Hadoop.



Σχετικά έγγραφα
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Δομές Δεδομένων. Σημειώσεις από το εργαστήριο για τον χειρισμό του προγράμματος Eclipse. 5ο εξάμηνο. v1.0

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

SMPcache. Ένα εργαλείο για προσομοίωση-οπτικοποίηση κρυφής μνήμης (Cache)

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

Δημιουργία μιας εφαρμογής Java με το NetBeans

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

Δομές ελέγχου ροής προγράμματος

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

EPL 660: Lab 4 Introduction to Hadoop

EPL660: Information Retrieval and Search Engines Lab 5

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Αντικειµενοστρεφής Προγραµµατισµός

Οδηγός Εγκατάστασης και Χρήσης του Arebas Easy

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Εισαγωγή στον Προγραμματισμό

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Εισαγωγή στην Αριθμητική Ανάλυση

Τύποι δεδομένων, τελεστές, μεταβλητές

SPSS Statistical Package for the Social Sciences

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

ΠΛΗΡΟΦΟΡΙΚΗ Ι Εργαστήριο 1 MATLAB ΠΛΗΡΟΦΟΡΙΚΗ Ι ΕΡΓΑΣΤΗΡΙΟ 1. Θέμα εργαστηρίου: Εισαγωγή στο MATLAB και στο Octave

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

ΟΔΗΓΙΕΣ ΧΡΗΣΗΣ LIVETRIP TRAVELLER

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

public class ArrayStack implements Stack {

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

Βρίγκας Μιχαήλ Α.Μ.744 Μπράχος Χ. Ευάγγελος Α.Μ.795

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

ΑΝΤΙΓΡΑΦΗ ΑΡΧΕΙΟΥ ΣΕ ΔΙΣΚΕΤΑ ΑΝΤΙΓΡΑΦΗ ΑΡΧΕΙΟΥ ΑΠΟ ΔΙΣΚΕΤΑ. Από τον κατάλογο που εμφανίζεται επιλέγω: Αποστολή προς Δισκέτα (3,5)

Μπορείτε τα δείτε βιντεάκι με τη διαδικασία εδώ:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Γραφικά υπολογιστών Εργαστήριο 1 Εισαγωγή στην Python

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα μέσα σε αντικείμενα Αντικείμενα ως επιστρεφόμενες τιμές Αντικείμενα με πίνακες

Βιοϊατρική τεχνολογία

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΔΗΜΙΟΥΡΓΙΑ ΚΑΤΑΛΟΓΟΥ ΕΤΕΡΟΑΝΑΦΟΡΩΝ

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Γραφικά υπολογιστών Εργαστήριο 10 Εισαγωγή στα Sprites

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

ΕΡΓΑΣΤΗΡΙΟ 1: 1 Εισαγωγή, Χρήσιμες Εφαρμογές

Κλάσεις και Αντικείµενα

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

ZTrade Quick Start User Manual Version 2.2

Σημειωματάριο Τετάρτης 25 Οκτ. 2017

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

2.1 Αντικειµενοστρεφής προγραµµατισµός

EPL451: Data Mining on the Web Lab 3

Hase οδηγίες χρήσης.

Βαθμός Σχόλια. lab PASS 1194 PASS 1238 PASS 1239 PASS

ΜΕΛΕΤΗ ΣΧΕΔΙΑΣΗ ΕΦΑΡΜΟΓΗΣ ΣΕ ΥΠΟΛΟΓΙΣΤΙΚΟ ΝΕΦΟΣ (CLOUD COMPUTING) ΜΕ ΕΜΦΑΣΗ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΔΕΝΤΡΩΝ.

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2007 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

Από τη UML στον Κώδικα. Μέρος Α

3 ο Εργαστήριο Μεταβλητές, Τελεστές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Έλεγχος ισότητας String Interning Αποαναφοροποίηση - dereferencing

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΕΙΣΑΓΩΓΗ ΣΤΑ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Ερωτήσεις επανάληψης

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΛΟΓΙΣΜΙΚΟ ΠΡΟΣΟΜΟΙΩΣΗΣ ANYLOGIC

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών ΤΗΜΜΥ Α.Π.Θ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ.

Μ.Π.Σ. «ΠΡΟΗΓΜΕΝΕΣ ΜΕΘΟΔΟΙ ΚΑΤΑΣΚΕΥΗΣ ΠΡΟΙΟΝΤΩΝ ΑΠΟ ΞΥΛΟ» Μάθημα: Σχεδίαση και Εφαρμογές Διαδραστικών Συστημάτων. Διδάσκοντας: Α.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Οδηγίες για τη Χρήση του Google Drive

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Γ ΓΥΜΝΑΣΙΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ ΤΗ ΓΛΩΣΣΑ MicroWorlds Pro

Transcript:

Πτυχιακή Εργασία Θέμα: Υπολογισμός ερωτημάτων κορυφογραμμής 2 διαστάσεων σε κατανεμημένο περιβάλλον με τη βοήθεια της πλατφόρμας λογισμικού Hadoop. Πλιάκης Ιωάννης Α.Ε.Μ.: 1137 Υπεύθυνος καθηγητής: Παπαδόπουλος Απόστολος Θεσσαλονίκη, Ιούλιος 2010 1

Περιεχόμενα: 1. Σκοπός του έργου 2. Τι είναι η πλατφόρμα λογισμικού Hadoop 3. Κώδικας 4. Παράρτημα 5. Βιβλιογραφία 2

1) Σκοπός του έργου Η εφαρμογή έχει ως στόχο να βρίσκει σε κατανεμημένο περιβάλλον την ελάχιστη κορυφογραμμή από διάφορα σημεία στις 2 διαστάσεις. Ορίζεται δηλαδή ένας χώρος από 2 διαστάσεις στον οποίο ο χρήστης έχει επιλέξει να δώσει κάποια ορθογώνια όπου θα περιέχουν μέσα τυχαίους ακέραιους και θετικούς αριθμούς. Έπειτα ο χρήστης θα επιλέγει ένα ερώτημα σε μορφή ορθογωνίου κι αυτό. Το σύστημα θα ψάχνει να βρει το ερώτημα αυτό ποια από τα άλλα ορθογώνια ερωτήματα τέμνει, αν τέμνει κάποια. Στη συνέχεια θα υπολογίζονται τα σημεία που περικλείονται στην τομή του ερωτήματος και των διαφόρων άλλων ορθογωνίων και σε αυτά θα εφαρμόζεται το ερώτημα κορυφογραμμής για να επιστραφούν στο χρήστη τα καλύτερα σημεία με βάση το συγκεκριμένο αλγόριθμο. Στην ουσία, τα ερωτήματα κορυφογραμμής είναι ικανά να επιστρέψουν τα σημεία που μας ενδιαφέρουν από ένα τεράστιο χώρο σημείων με διάφορα κριτήρια. Η περισσότερη δουλειά που έχει γίνει με τα ερωτήματα κορυφογραμμής έχει να κάνει με κεντρικοποιημένη επεξεργασία των δεδομένων, όμως πρακτικά τα δεδομένα μπορεί πολύ συχνά να βρίσκονται κατανεμημένα σε διαφορετικά γεωγραφικά σημεία. Σε αυτήν την εργασία χειριζόμαστε ερωτήματα κορυφογραμμής σε μεγάλης κλίμακας κατανεμημένα περιβάλλοντα. Ένα παράδειγμα εφαρμογής αυτής της κατηγορίας προβλημάτων είναι το πρόβλημα του επενδυτή. Ένας επενδυτής είναι καλό να ξέρει ποιες μετοχές ανά τον κόσμο αξίζουν για να επενδύσει σε αυτές, βασιζόμενος σε στοιχεία προηγούμενης ημέρας. Για αυτό το λόγο είναι απαραίτητο να έχει πρόσβαση σε διαφορετικές βάσεις δεδομένων που περιέχουν στοιχεία για τις συγκεκριμένες μετοχές όπως στη Νέα Υόρκη, στο Λονδίνο, στο Τόκυο κτλ. Για κάθε μετοχή ο επενδυτής είναι καλό να λάβει υπ όψιν του διάφορα χαρακτηριστικά όπως η τελευταία τιμή πώλησης, το συνάλλαγμα, η τελευταία τιμή πριν κλείσει το χρηματιστήριο, εκτιμώμενη τιμή κτλ. Άρα ένα ερώτημα κορυφογραμμής μπορεί να βοηθήσει έναν τέτοιο επενδυτή για να βρει τις μετοχές που τον ενδιαφέρουν. Εύκολα καταλαβαίνει κανείς ότι για να γίνει κάτι τέτοιο σε περιβάλλον με ένα μόνο επεξεργαστή θέλει πάρα πολύ μεγάλο χρόνο, λόγω του ότι τα χαρακτηριστικά για μία μόνο μετοχή π.χ. μπορεί να είναι χιλιάδες και τα είδη των μετοχών εκατοντάδες. 3

Τα σημεία που ενδιαφέρουν ορίζονται ως εκείνα που δεν «κυριαρχούνται» από άλλα σημεία. Με τον όρο «κυριαρχούνται» εννοούμε ότι κάποιο σημείο αρκεί να είναι «καλύτερο» από ένα άλλο έστω σε μία μόνο διάσταση (χαρακτηριστικό). Στη συγκεκριμένη εργασία εδώ εννοούμε «καλύτερο» το μικρότερο στοιχείο. Επειδή η εφαρμογή αυτή έχει στηθεί για κατανεμημένο περιβάλλον κρίθηκε απαραίτητο να χρησιμοποιηθεί κάποιο κατάλληλο εργαλείο. Επιλέχθηκε το Hadoop που έχει τη δυνατότητα αυτή. Ο κώδικας είναι γραμμένος σε Java και το όλο περιβάλλον στήθηκε σε Ubuntu Linux έκδοση 10.04 LTS. Ο κώδικας γράφτηκε στο περιβάλλον Eclipse όπου μέσα από αυτό έτρεχε και το Hadoop με τη βοήθεια κάποιων ρυθμίσεων. Περισσότερα θα αναφερθούν στο παράρτημα για το στήσιμο της πλατφόρμας αυτής. 4

2) Τι είναι η πλατφόρμα λογισμικού Hadoop Το Hadoop είναι μια πλατφόρμα λογισμικού η οποία μπορεί να χρησιμοποιηθεί για την ανάλυση και επεξεργασία μεγάλου αριθμού δεδομένων επιπέδου petabyte. Αυτό που κάνει το Hadoop είναι να κατανέμει τα δεδομένα και την διαδικασία ανάλυσής τους σε ομάδες υπολογιστών (Clusters) ώστε να επεξεργαστούν παράλληλα τα δεδομένα, επιταχύνοντας έτσι τις διαδικασίες. Το Hadoop χρησιμοποιεί το προγραμματιστικό μοντέλο MapΡeduce το οποίο αναπτύχθηκε πρώτα από την Google για την υποστήριξη του συστήματος της στην ανάλυση δεδομένων. Αυτό που κάνει αυτή η τεχνική είναι, να μεταβιβάσει τα δεδομένα και το πρόβλημα στον υπολογιστή master του cluster, και αυτός στη συνέχεια θα διασπάσει το πρόβλημα σε μικρότερα προβλήματα και κάθε μικρότερο πρόβλημα θα το προωθήσει σε κάθε ένα από τους υπόλοιπους υπολογιστές του Cluster. Ο κάθε υπολογιστής του cluster θα επιλύσει το δικό του υποπρόβλημα που του έχει ανατεθεί και θα επιστρέψει τη λύση στον master υπολογιστή ο οποίος θα συνδυάσει τις λύσεις των υποπροβλημάτων για να βρει τη λύση στο πρόβλημα που το δόθηκε. Το Hadoop βασίζεται στην παραπάνω τεχνική με επιπρόσθετα πλεονεκτήματα όπως το ότι καταφέρνει να ανακτήσει δεδομένα σε περίπτωση που ένας υπολογιστής του cluster πάθει ζημιά και να μεταβιβάσει το υποπρόβλημα σε άλλον υπολογιστή. Μία ευρεία ποικιλία επιχειρήσεων κι οργανώσεων χρησιμοποιούν το Hadoop για την έρευνα και την παραγωγή. Ήδη η Yahoo χρησιμοποιεί το Hadoop και πιο πρόσφατα το εγκατέστησε και το facebook. Το πρόγραμμα Apache Hadoop αναπτύσσει ένα ανοιχτού κώδικα λογισμικό για τον αξιόπιστο, εξελικτικό και κατανεμημένο υπολογισμό. Το Hadoop περιλαμβάνει τα παρακάτω υποπρογράμματα: 5

Hadoop Common: Τα κοινά εργαλεία που υποστηρίζουν τα άλλα υποπρογράμματα του Hadoop. Chukwa: Ένα σύστημα συλλογής δεδομένων για τη διαχείριση μεγάλων κατανεμημένων συστημάτων. HBase: Μία εξελικτική, κατανεμημένη βάση δεδομένων που υποστηρίζει τη δομημένη αποθήκευση στοιχείων για τους μεγάλους πίνακες. HDFS: Ένα κατανεμημένο σύστημα αρχείων που παρέχει υψηλής απόδοσης πρόσβαση στα στοιχεία εφαρμογής. Hive: Μία υποδομή αποθήκης δεδομένων που παρέχει την περιληπτική παρουσίαση της πληροφορίας. MapReduce: Ένα πλαίσιο λογισμικού για κατανεμημένη επεξεργασία των μεγάλων συνόλων στοιχείων σε συστάδες υπολογισμού. Η φιλοσοφία του είναι στην ουσία ο Map να αναθέσει τις λειτουργίες που έχει να αναθέσει στους επεξεργαστές κι ο Reduce να συλλέξει τα αποτελέσματα και να τα στείλει πίσω στο χρήστη. Πάντα τα δεδομένα χωρίζονται όμως σε συγκεκριμένα ζευγαράκια του στυλ (key, value). Αυτά μπορεί να είναι οτιδήποτε, αριθμοί, κείμενο ή ότι άλλο θέλουμε. Πάντα όμως η επικοινωνία θα γίνεται με βάση αυτά τα ζευγαράκια. Pig: Ένα υψηλού επιπέδου πλαίσιο ροής πληροφορίας γλώσσας κι εκτέλεσης για παράλληλο υπολογισμό. ZooKeeper: Μία υψηλής απόδοσης υπηρεσία συντονισμού για τις κατανεμημένες εφαρμογές. 6

3)Κώδικας Ο κώδικας είναι γραμμένος σε Java και στο περιβάλλον Eclipse. Στο παράρτημα αναφέρεται αναλυτικά πως θα στηθεί το Hadoop σε Linux κι έπειτα ποιες διαδικασίες χρειάζεται να γίνουν ώστε να λειτουργήσει ο κώδικας. Εδώ εισάγουμε κάποιες βιβλιοθήκες για να χρησιμοποιήσουμε κάποια στοιχεία από αυτές package org.apache.hadoop.examples; java.io.datainput; java.io.dataoutput; java.io.ioexception; java.util.stringtokenizer; java.util.random; org.apache.hadoop.conf.configuration; org.apache.hadoop.fs.path; org.apache.hadoop.io.intwritable; org.apache.hadoop.io.longwritable; org.apache.hadoop.io.text; org.apache.hadoop.io.writablecomparable; org.apache.hadoop.io.writablecomparator; org.apache.hadoop.mapreduce.lib.input.fileinputformat; org.apache.hadoop.mapreduce.lib.output.fileoutputformat; org.apache.hadoop.mapreduce.job; org.apache.hadoop.mapreduce.mapper; org.apache.hadoop.mapreduce.partitioner; org.apache.hadoop.mapreduce.reducer; org.apache.hadoop.util.genericoptionsparser; Η βασική κλάση του αρχείου public class Skyline public static public static public static public static { int int int int x1 y1 x2 y2 = = = = 3; 14; 10; 40; 7

Οι παραπάνω μεταβλητές είναι οι συντεταγμένες του ορθογώνιου ερωτήματος. (x1,y1) αντιστοιχούν στην κάτω αριστερή γωνία του ορθογωνίου και (x2,y2) στην πάνω δεξιά. Έχουμε βάλει κάποιες καθορισμένες τιμές για το ερώτημα. Μπορούμε να τις αλλάξουμε για να δούμε διαφορετικά αποτελέσματα Εδώ ορίζουμε μία βοηθητική κλάση για να μπορέσουμε να δώσουμε στο Map να διαβάσει τα νούμερα που θέλουμε public static class IntPair implements WritableComparable<IntPair> { private int first = 0; private int second = 0; private int third = 0; private int fourth = 0; Τα νούμερα που θέλουμε να διαβάσει από το αρχείο που θα δώσει ο χρήστης είναι κι αυτά ορθογώνια (σε 2 διαστάσεις πάντα) με συντεταγμένες της κάτω αριστερής και της πάνω δεξιάς γωνίας public void set(int left1, int right1, int left2, int right2) { first = left1; second = right1; third = left2; fourth = right2; public int getfirst() { return first; public int getsecond() { return second; public int getthird() { return third; public int getfourth() { return fourth; Εδώ διαβάζουμε τους ακεραίους υπερφορτώνοντας τη μέθοδο readfields της διεπαφής WritableComparable @Override 8

public void readfields(datainput in) throws IOException { first = in.readint() + Integer.MIN_VALUE; second = in.readint() + Integer.MIN_VALUE; third = in.readint() + Integer.MIN_VALUE; fourth = in.readint() + Integer.MIN_VALUE; Εδώ γράφουμε τους ακεραίους υπερφορτώνοντας τη μέθοδο write της διεπαφής WritableComparable @Override public void write(dataoutput out) throws IOException { out.writeint(first - Integer.MIN_VALUE); out.writeint(second - Integer.MIN_VALUE); out.writeint(third - Integer.MIN_VALUE); out.writeint(fourth - Integer.MIN_VALUE); Υπερφορτώνουμε τη συνάρτηση κατακερματισμού για να γίνει η ανάθεση των δεδομένων στους επεξεργαστές @Override public int hashcode() { return first * 157 + second; Παρακάτω γίνεται υπερφόρτωση της μεθόδου equals για να γίνει έλεγχος στα αποτελέσματα έτσι ώστε να ταξινομηθούν παράλληλα και να τυπωθούν στην οθόνη κατά αύξουσα σειρά @Override public boolean equals(object right) { if (right instanceof IntPair) { IntPair r = (IntPair) right; return r.first == first && r.second == second && r.third == third && r.fourth == fourth; else { return false; 9

Κλάση σύγκρισης έτσι ώστε να μπορέσει να γίνει σύγκριση μεταξύ αντικειμένων IntPair public static class Comparator extends WritableComparator { public Comparator() { super(intpair.class); public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { return comparebytes(b1, s1, l1, b2, s2, l2); Αρχικοποίηση της παραπάνω κλάσης static { WritableComparator.define(IntPair.class, new Comparator()); Εδώ έχουμε τη δευτερεύουσα συνάρτηση σύγκρισης που την υπερφορτώνουμε έτσι ώστε να κάνει πρώτα τη σύγκριση του πρώτου στοιχείου από κάθε σειρά στο αρχείο κι αν βρει το πρώτο ίδιο προχωράει στα επόμενα στοιχεία. Αν τα βρει όλα ίδια επιστρέφει 0 public int compareto(intpair o) { if (first!= o.first) { return first < o.first? -1 : 1; else if (second!= o.second) { return second < o.second? -1 : 1; else if (third!= o.third) { return third < o.third? -1 :1; else if (fourth!= o.fourth) { return fourth < o.fourth? -1 :1; else return 0; Εδώ γίνεται διαμερισμός στους επεξεργαστές με βάση το πρώτο στοιχείο της 10

γραμμής public static class FirstPartitioner extends Partitioner<IntPair,IntWritable>{ @Override public int getpartition(intpair key, IntWritable value, int numpartitions) { return Math.abs(key.getFirst() * 127) % numpartitions; Κλάση Map που διαβάζει (LongWritable, Text) κι επιστρέφει (IntPair, IntWritable) public static class MapClass extends Mapper<LongWritable, Text, IntPair, IntWritable> { private final IntPair key = new IntPair(); private final IntWritable value = new IntWritable(); Υπερφορτώνουμε τη μέθοδο map έτσι ώστε να διαβάζει ένα ένα τα στοιχεία από την κάθε γραμμή στο αρχείο που έχει δώσει ο χρήστης με τους αριθμούς. Αμέσως αποθηκεύουμε τα νούμερα αυτά στους εξής πίνακες. Όλα τα x1 θα πάνε στον πίνακα left1, όλα τα y1 στον πίνακα right1, όλα τα x2 στον left2 κι όλα τα y2 στον πίνακα right2. Έπειτα θέτουμε ως key όλα τα στοιχεία της κάθε γραμμής κι ως value όποιο θέλουμε. Εδώ δηλώνουμε το y2 να είναι value. Δεν έχει όμως και πολύ σημασία αυτό μιας κι όλα τα στοιχεία θα πάνε σε διαφορετικούς επεξεργαστές μιας και δε μας ενδιαφέρει να ομαδοποιήσουμε τα δεδομένα μας. Εδώ το πρόβλημά μας είναι να βρούμε τα μικρότερα με βάση τον αλγόριθμο κορυφογραμμής @Override public void map(longwritable inkey, Text invalue, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(inValue.toString()); int left1 = 0; int right1 = 0; int left2 = 0; int right2 = 0; if (itr.hasmoretokens()) { left1 = Integer.parseInt(itr.nextToken()); if (itr.hasmoretokens()) { right1 = Integer.parseInt(itr.nextToken()); 11

if (itr.hasmoretokens()) { left2 = Integer.parseInt(itr.nextToken()); if (itr.hasmoretokens()) { right2 = Integer.parseInt(itr.nextToken()); key.set(left1, right1, left2, right2); value.set(right2); context.write(key, value); Κλάση Reduce. Εδώ θα γίνει σχεδόν όλη η δουλειά, αφού εδώ πέρα γράφεται ο κώδικας που θα εκτελεστεί σε κάθε μονάδα επεξεργασίας ταυτόχρονα. public static class Reduce extends Reducer<IntPair, IntWritable, IntWritable, IntWritable> { private final IntWritable first = new IntWritable(); private final IntWritable second = new IntWritable(); private final IntWritable third = new IntWritable(); private final IntWritable fourth = new IntWritable(); private final IntWritable xa = new IntWritable(); private final IntWritable ya = new IntWritable(); private final IntWritable xb = new IntWritable(); private final IntWritable yb = new IntWritable(); private final Random random = new Random(); private final IntWritable rn1 = new IntWritable(); private final IntWritable rn2 = new IntWritable(); Εδώ έχουμε μία συνάρτηση παραγωγής τυχαίων αριθμών μέσα σε συγκεκριμένο εύρος όμως. Αυτό που έχει ορίσει ο χρήστης στο αρχείο με τα δεδομένα ορθογώνια που θα δώσει private static int getrandominteger(int astart, int aend, Random arandom){ if ( astart > aend ) { throw new IllegalArgumentException("Start cannot exceed End."); long range = (long)aend - (long)astart + 1; long fraction = (long)(range * arandom.nextdouble()); int randomnumber = (int)(fraction + astart); return randomnumber; 12

Υπερφόρτωση συνάρτησης reduce. Αρχικά αναθέτουμε στους πίνακές μας τα στοιχεία που έχουμε πάρει από το Map και ταυτόχρονα αναθέτουμε και σε νέες μεταβλητές τα στοιχεία του ερωτήματος @Override public void reduce(intpair key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { first.set(key.getfirst()); second.set(key.getsecond()); third.set(key.getthird()); fourth.set(key.getfourth()); xa.set(x1); ya.set(y1); xb.set(x2); yb.set(y2); int[] a = new int[10]; int[] b = new int[10]; int[] c = new int[10]; int[] d = new int[10]; int[] e = new int[10]; int[] f = new int[10]; int oriox1 = 0; int orioy1 = 0; int oriox2 = 0; int orioy2 = 0; int q = 0; int w = 0; boolean dominated = false; Εδώ παράγουμε τους τυχαίους αριθμούς και γεμίζουμε τα ορθογώνια των δεδομένων που έχει δώσει ο χρήστης σε αρχείο for(int i=0;i<10;i++) { a[i] = getrandominteger(key.getfirst(), key.getthird(), random); b[i] = getrandominteger(key.getsecond(), key.getfourth(), random); Με τις συνθήκες ελέγχου αυτές βρίσκουμε την τομή του ορθογωνίου ερωτήματός μας με τα ορθογώνια των δεδομένων που τα διαβάζουμε από το αρχείο 13

if (((x1>=first.get() && x1<=third.get()) (x2<=third.get() && x2>=first.get())) && ((y1>=second.get() && y1<=fourth.get()) (y2<=fourth.get() && y2>=second.get()))) { if (x1>=first.get()) oriox1 = x1; else if (x1<first.get()) oriox1 = first.get(); if (y1>=second.get()) orioy1 = y1; else if (y1<second.get()) orioy1 = second.get(); if (x2<=third.get()) oriox2 = x2; else if (x2>third.get()) oriox2 = third.get(); if (y2<=fourth.get()) orioy2 = y2; else if (y2>fourth.get()) orioy2 = fourth.get(); Εδώ βρίσκουμε τα σημεία που περιέχονται στην τομή του ορθογωνίου του ερωτήματος και των ορθογωνίων των δεδομένων for(int j=0;j<10;j++) { if(a[j]>=oriox1 && a[j]<=oriox2 && b[j]>=orioy1 && b[j]<=orioy2) { c[q]=a[j]; d[q]=b[j]; q++; Εδώ στην ουσία βρίσκουμε την κορυφογραμμή. Είναι σημαντικό να αναφέρουμε ότι έχουμε ένα flag που μας δίνει την πληροφορία για το αν ένα σημείο κυριαρχείται από κάποιο άλλο. Στο τέλος μαζεύουμε μόνο εκείνα τα σημεία τα οποία δεν κυριαρχούνται από κανένα άλλο σημείο for(int i=0;i<q;i++) { for(int j=0;j<q;j++) { if( (c[i]>c[j] && d[i]>d[j]) ( (c[i]==c[j] && d[i]>d[j]) (c[i]>c[j] && d[i]==d[j])) { dominated = true; break; ) 14

if(dominated == true) { dominated = false; continue; else { e[w]=c[i]; f[w]=d[i]; w++; Εδώ μαζεύονται και τυπώνονται τα αποτελέσματα του ερωτήματος κορυφογραμμής σε μορφή (key,value) όπως έχουμε αναφέρει for(int i=0;i<w;i++) { rn1.set(e[i]); rn2.set(f[i]); context.write(rn1, rn2); Εδώ είναι κι η συνάρτηση main όπου καλούνται όλες οι υπόλοιπες συναρτήσεις για να λειτουργήσει το πρόγραμμα public static void main(string[] args) throws Exception { Configuration conf = new Configuration(); String[] otherargs = new GenericOptionsParser(conf, args).getremainingargs(); if (otherargs.length!= 2) { System.err.println("Mallon leipoun arguments!!!"); System.exit(2); Job job = new Job(conf, "Skyline"); job.setjarbyclass(skyline.class); job.setmapperclass(mapclass.class); job.setreducerclass(reduce.class); job.setpartitionerclass(firstpartitioner.class); job.setmapoutputkeyclass(intpair.class); job.setmapoutputvalueclass(intwritable.class); job.setoutputkeyclass(intwritable.class); job.setoutputvalueclass(intwritable.class); 15

FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true)? 0 : 1); 16

4)Παράρτημα Παρακάτω θα αναφερθούμε για το πως στήσαμε το Hadoop σε περιβάλλον Linux, πως κάνεις το Hadoop να δουλέψει και πως στήθηκε το Eclipse έτσι ώστε να δουλεύει εκεί πάνω το Hadoop. Τέλος θα δούμε και 2 παραδείγματα εκτέλεσης στο Hadoop. Το Hadoop το κατέβασα αρχικά από το site της Apache http://hadoop.apache.org/common/docs/current/quickstart.html#execution. Έπειτα χρειάστηκε να κάνω κάποιες ρυθμίσεις. Άνοιξα ένα παράθυρο κονσόλας στα Linux και πληκτρολόγησα τις κατάλληλες εντολές: $ sudo apt-get install ssh $ sudo apt-get install rsync Μετά χρειάστηκε να ανοίξω ένα αρχείο, το conf/hadoop-env.sh για να ορίσω τη μεταβλητή JAVA_HOME να δείχνει στον κατάλογο που έχω εγκατεστημένη την Java. Μόλις τα έκανα αυτά για να το δοκιμάσω αν τρέχει έπρεπε με την εντολή $ bin/hadoop να μου εμφανίζει την τεκμηρίωση για το Hadoop. Τώρα, υπάρχουν 3 διαφορετικές λειτουργίες με τις οποίες μπορεί κανείς να λειτουργήσει το Hadoop. Local (Standalone) Mode Pseudo Distributed Mode Fully Distributed Mode Εξ' ορισμού το Hadoop είναι ρυθμισμένο να τρέχει σε μη κατανεμημένη μορφή, απλά ως μία Java διαδικασία. Αυτό είναι χρήσιμο για debugging. Επίσης μπορεί να τρέχει σε έναν υπολογιστή σε ψευδό κατανεμημένη μορφή όπου κάθε εργαλείο του Hadoop τρέχει σε ξεχωριστή Java διαδικασία. Τέλος μπορεί να τρέξει όντως σε πολλούς παράλληλα συνδεδεμένους επεξεργαστές ως πραγματικά κατανεμημένη εργασία. Εμείς επιλέξαμε για τη δουλειά μας τη δεύτερη επιλογή, το Pseudo Distributed Mode. 17

Οι ρυθμίσεις που χρειάστηκαν να γίνουν είναι οι εξής: Στο αρχείο conf/core-site.xml: <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration> Στο αρχείο conf/hdfs-site.xml: <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> Στο αρχείο conf/mapred-site.xml: <configuration> <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> </configuration> Έπειτα ελέγχουμε αν μπορούμε να έχουμε πρόσβαση στο localhost χωρίς passphrase με την εντολή $ ssh localhost. Αν δεν μπορούμε, τότε πληκτρολογούμε τις παρακάτω εντολές: $ ssh-keygen -t dsa -P ' ' -f ~/.ssh/id_dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 18

Τώρα το Hadoop είναι έτοιμο να τρέξει. Πάντα κάθε φορά που ανοίγουμε τον υπολογιστή μας είναι απαραίτητο να γράφουμε την παρακάτω εντολή πριν τρέξουμε το Hadoop. $ bin/hadoop namenode -format. Έπειτα για να τρέξουμε το Hadoop πατάμε $ bin/start-all.sh. Το αρχείο log της εξόδου είναι αποθηκευμένο στον κατάλογο $ {HADOOP_LOG_DIR (εξ' ορισμού στο $ {HADOOP_HOME/logs). Μπορούμε να ανοίξουμε το διαδικτυακό περιβάλλον για το NameNode και το JobTracker που εξ' ορισμού βρίσκονται στα links του site που κατεβάσαμε το Hadoop. Εικόνα 1.NameNode 19

Εικόνα 2.JobTracker Όταν θέλουμε να κλείσουμε το Hadoop να μην ξεχνάμε ποτέ να τερματίζουμε όλες τις λειτουργίες του με την εντολή $ bin/stop-all.sh. Όσον αφορά τώρα το στήσιμο του Eclipse για να μπορούμε να γράψουμε κώδικα σε Java έτσι ώστε να έχουμε και τη βοήθεια του compiler ακολουθήθηκε η παρακάτω διαδικασία. Πηγαίνουμε στο φάκελο που έχουμε εγκαταστήσει το Hadoop με το όνομα contrib, μετά ανοίγουμε το φάκελο που λέγεται eclipse-plugin. Αυτό το φάκελο τον αντιγράφουμε μέσα στο φάκελο plugins μέσα στο 20

φάκελο που έχουμε κάνει εγκατάσταση το Eclipse. Ανοίγουμε το Eclipse και πατάμε Window Open Perspective Other Map/Reduce. Εικόνα 3.Open Perspective Κάτω στην κονσόλα υπάρχει μία επιλογή που λέει new Hadoop Location. Το ανοίγουμε με δεξί κλικ για να θέσουμε κάποιες συγκεκριμένες ρυθμίσεις. Στο Location name βάζουμε ότι όνομα θέλουμε. Στο Host βάζουμε localhost. Στο port βάζουμε 9001. Κάνουμε κλικ στην επιλογή που έχει Use M/R Master host και στο port βάζουμε 9000. Στο User name βάζουμε και πάλι ότι θέλουμε. 21

Εικόνα 4.Edit New Hadoop Location Τώρα για να τρέξουμε τον κώδικα που θέλουμε ανοίγουμε ένα αρχείο Java και γράφουμε τον κώδικά μας. Το αρχείο που θέλει ο χρήστης να δώσει στο πρόγραμμά μας θα πρέπει να το έχει δημιουργήσει και να λέγεται new.txt. Εκεί πέρα θα πρέπει να περιέχονται 4 αριθμοί σε κάθε σειρά με κενά ανάμεσά τους. Για να φορτώσουμε το αρχείο αυτό στο Hadoop αριστερά υπάρχει το DFS Locations κι αν το ανοίξουμε θα έχει το δικό μας που μόλις φτιάξαμε. Με δεξί κλικ θα κάνουμε upload files to DFS.. για να βάλουμε το αρχείο μας. Για να τρέξει το πρόγραμμα που 22

γράψαμε θα πατήσουμε Run Run Configurations.. Στο παράθυρο που θα ανοίξει χρειάζεται να γράψουμε από που θα διαβάσει τα input δεδομένα και που θα τα εκτυπώσει. Έτσι πάμε στην καρτέλα Arguments και γράφουμε: hdfs://localhost:9000/new hdfs://localhost:9000/output. Εικόνα 5.Arguments Έπειτα πατάμε Run και το πρόγραμμα αν δεν έχει κάποιο λάθος θα τρέξει κανονικά. Τώρα για να δούμε τα αποτελέσματα θα πάμε αριστερά εκεί που έχουμε το δικό μας DFS Location και θα κάνουμε δεξί κλικ και refresh. Θα εμφανιστεί ένας κατάλογος που θα λέγεται output κι εκεί μέσα θα βρίσκεται το αρχείο που είπαμε εμείς στα arguments ότι θέλουμε να μας τυπώσει τα αποτελέσματα. 23

Εικόνα 6.Σωστή εκτέλεση Τώρα θα δούμε ένα παράδειγμα εκτέλεσης στο Hadoop και τα αποτελέσματα που θα μας εμφανίσει. Στην αρχή θα τρέξουμε το πρόγραμμα για 1000 τυχαία σημεία σε κάθε ορθογώνιο με δεδομένα. Τα ορθογώνια με τα ερωτήματα είναι τα εξής: 24

Εικόνα 7.Ορθογώνια με δεδομένα Το ορθογώνιο ερώτημα είναι το εξής: (234,456,2345,567) πάντα σε μορφή (x1,y1,x2,y2). Παρακάτω βλέπουμε τα αποτελέσματα από την πρώτη εκτέλεση με 1000 σημεία σε κάθε ορθογώνιο. Στο κεντρικό αρχείο έχουμε τα αποτελέσματα από το ερώτημα κορυφογραμμής, ενώ στην 25

κονσόλα κάτω έχουμε κάποια στατιστικά. Για παράδειγμα εδώ διαβάστηκαν 180 HDFS Bytes και γράφτηκαν 81 HDFS Bytes. Εικόνα 8.Αποτελέσματα εκτέλεσης με 1000 σημεία Παρακάτω έχουμε το ίδιο παράδειγμα με 5000 σημεία σε κάθε ορθογώνιο αυτήν τη φορά. Εδώ παρατηρούμε ότι διαβάστηκαν 180 HDFS Bytes πάλι, όμως γράφτηκαν 130 HDFS Bytes. 26

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

5)Βιβλιογραφία http://hadoop.apache.org/ Parallel Distributed Processing of Constrained Skyline Queries by Filtering (Bin Cui, Hua Lu, Quanqing Xu, Lijiang Chen, Yafei Dai, Yongluan Zhou). http://www.vontikakis.com/blog/fullarticle/37 http://hadoop.apache.org/common/docs/current/quickstart.html#execution http://pages.cs.wisc.edu/~gibson/mapreducetutorial.html http://holumbus.fh-wedel.de/trac/wiki/mapreduceexamples http://code.google.com/intl/el-gr/edu/parallel/mapreduce-tutorial.html http://developer.yahoo.com/hadoop/tutorial/module4.html 28