ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τµήµα Πληροφορικής ΕΠΛ 646 Προχωρηµένα Θέµατα Βάσεων Δεδοµένων ΑΣΚΗΣΗ 4 Υλοποίηση Προγράµµατος Ανάλυσης Μεγάλων Δεδοµένων στο Hadoop MapReduce Ι. Στόχος Άσκησης (Επερώτηση k nearest neighbors Self-Join) Ηµεροµηνία Ανάθεσης: Πέµπτη, 19/11/2015 Ηµεροµηνία Παράδοσης: Τέταρτη, 2/12/2015 (13 ηµέρες) Διδάσκων: Δηµήτρης Ζεϊναλιπούρ (Να υποβληθεί η λύση ως ένα συµπιεσµένο αρχείο µέσω του Moodle) Ο στόχος της άσκησης είναι η εξοικείωση µε µια πλατφόρµα επεξεργασίας µεγάλων δεδοµένων. Ειδικότερα, θα κληθείτε να χρησιµοποιήσετε το Apache Hadoop για να διατυπώσετε στο Προγραµµατιστικό Μοντέλο Map Reduce την λύση της επερώτησης «Εύρεση κ κοντινότερων γειτόνων για ΟΛΑ τα σηµεία (Αll kνν)» ή αλλιώς γνωστό ως «kνν self-join». Η επίλυση του θέµατος θα πρέπει να γίνει στα πλαίσια του εικονικού µηχανήµατος το οποίο σας έχει δοθεί στο εργαστήριο. ΙI. Η Επερώτηση knn Self-Join Οι k κοντινότεροι γείτονες ενός αντικειµένου q είναι τα k αντικείµενα των οποίων τα γνωρίσµατα, π.χ., η θέση (x,y), είναι πιο κοντινά µε τα γνωρίσµατα του q χρησιµοποιώντας µια δεδοµένη µετρική απόσταση, π.χ., ευκλείδεια απόσταση µεταξύ των (x,y) θέσεων. Τυπικά, αυτό διατυπώνεται µε τον πιο κάτω ορισµό: knn(q, O): Δεδοµένου ενός πολυδιάστατου σηµείου επερώτησης q, βρες τα k αντικείµενα στο O τα οποία έχουν την µικρότερη απόσταση από το q. Η knn αναζήτηση είναι ένα από τα παλαιότερα προβλήµατα στην επιστήµη των υπολογιστών µε πολλές εφαρµογές στην υπολογιστική γεωµετρία, επεξεργασία εικόνας, χωρικές βάσεις δεδοµένων και πρόσφατα στα κοινωνικά δίκτυα. Εάν ψάχνουµε για τους knn γείτονες ΟΛΩΝ των στοιχείων στο O, τότε αναφερόµαστε στο γνωστό All knn πρόβληµα. Το συνολο των λύσεων στο εν λόγω AkNN(O) πρόβληµα (ή αλλιώς επερώτηση) διατυπώνονται ως ακολούθως: AkNN(O): Δεδοµένων τριών αντικειµένων o a o b o c, o b knn(o a, O) και o c O - knn(o a, O) ισχύει ότι dist(o a,o b ) dist(o a,o c ), όπου dist είναι µια µετρική απόσταση όπως την Ευκλείδεια απόσταση. 1 από 5
Εάν υποθέσουµε ότι το O είναι µια σχέση, όπως για παράδειγµα ένας πίνακας βάσης δεδοµένων που καταγράφει κάποια αντικείµενα µαζί µε επιπλέον γνωρίσµατα, τότε το AKNN(O) µπορεί εναλλακτικά να διατυπωθεί και ως knn Self-Join: O knn O = {(o a, o b ) o a, o b O and o b knn(o a, O)} Παράδειγµα Για να αντιληφθούµε το AkNN(O) (ή O knn O) δείτε το Σχήµα 1, όπου έχουµε 8 αντικείµενα Ο = {P 1, P 2,,P 8 } (το πλέγµα παρατίθεται για καλύτερη αναγνώριση της απόστασης µεταξύ των σηµείων). Καταρχήν παρατηρήστε, ότι ο κοντινότερος γείτονας για το σηµείο P 7 είναι ο Ρ 3 γιατί η ευκλείδεια απόσταση µεταξύ P 7 και P 3 είναι η ελάχιστη µεταξύ όλων των άλλων σηµείων. Εποµένως το 1NN(P 7,O)={P 3 }. Σχήµα 1: Διάταξη 8 αντικειµένων Εάν επεκτείνουµε το παράδειγµα για όλους τους κόµβους τότε: A1NN(O)={(P 1,P 7 ), (P 2,P 3 ), (P 7,P 3 ), (P 3,P 7 ), (P 5,P 6 ), (P 6,P 5 ), (P 4,P 8 ), (P 8,P 4 )}. Οµοίως επιχειρήστε να βρείτε το A2NN(O). ΙIΙ. Υλοποίηση Τεχνικής knn Self-Join Υπάρχει µια πλειάδα αλγορίθµων για την επίλυση του AkNN προβλήµατος σε συστήµατα βάσεων δεδοµένων. Υπάρχουν επίσης εξειδικευµένοι αλγόριθµοι επίλυσης του ΑkNN προβλήµατος στο MapReduce τους οποίους ωστόσο δεν θα δούµε. Στόχος της άσκησης είναι να εµπεδώσετε το Hadoop MapReduce, εποµένως θα υλοποιήσουµε την απλούστερη, και οµολογούµενους αργότερη, προσέγγιση επίλυσης του AkNN επερωτήµατος µε χρήση της Ευκλείδειας απόστασης. Ειδικότερα, στα πλαίσια της εργασίας καλείστε να υπολογίσετε την πιο κάτω λογική: Παράξετε το καρτεσιανό γινόµενο OxO και στη συνέχεια θα επιλέξετε τα k κοντινότερα αντικείµενα για κάθε αντικείµενο. Αφαιρετικά, καλείστε να υλοποιήσετε τον αλγόριθµο: σ top-k (O x O) 2 από 5
ΙV. Προεργασία και Εκκίνηση του Apache Hadoop Εγκαταστήστε το Hadoop αν δεν είναι ήδη εγκατεστηµένο στο Virtual Machine (VM) που σας έχει δοθεί ή στον προσωπικό σας Η/Υ. Στη συνέχεια σιγουρευτείτε ότι εγκαταστήσατε επιτυχηµένα το Hadoop ανοίγοντας το τερµατικό στο VM και εκτελώντας τις πιο κάτω εντολές. Α) Συνδεθείτε στο VPS σας από την γραµµή εντολών: ssh -l root <my-vps-name>.in.cs.ucy.ac.cy Eάν δεν είστε στο Παν. Κύπρου κάντε πρώτα VPN (δείτε http://www2.cs.ucy.ac.cy/~dzeina/courses/epl132/links.html), µετά συνδεθείτε σε κάποια µηχανή των εργαστηρίων, π.χ., 103ws1.in.cs.ucy.ac.cy ή 103ws2.in.cs.ucy.ac.cy, κτλ, και µετά το πιο πάνω. A) Εφόσον το VPS σας έχει περιορισµένους υπολογιστικούς πόρους, πριν ξεκινήσουµε το Hadoop θα απενεργοποιήσουµε κάποιες αχρείαστες διεργασίες µε την πιο κάτω εντολή: service couchdb stop service apache2 stop # Stop the CouchDB Daemon # Stop the Apache Webserver Daemon B) Βεβαιωθείτε ότι το PATH είναι ορθά ρυθµισµένο (ή ενηµερώστε το ~/.bashrc στο τέλος του για να ισχύει κάθε φορά που συνδέεστε µε το VPS σας) # Set Hadoop-related environment variables export HADOOP_HOME=/usr/local/Hadoop # Add Hadoop sbin/ bin/ directory to PATH export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin C) Εκκινήστε το HDFS και το YARN του Hadoop. Η απάντηση θα πρέπει να µοιάζει µε αυτή που ακολουθεί στο (YARN-based) Hadoop v2.7.1: $ start-dfs.sh Starting namenodes on [Ephyra] Ephyra: starting namenode, logging to /usr/local/hadoop-2.7.1/logs/hadooproot-namenode-your-vps-name.out localhost: starting datanode, logging to /usr/local/hadoop-2.7.1/logs/hadooproot-datanode-your-vps-name.out Starting secondary namenodes [0.0.0.0] 0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop- 2.7.1/logs/hadoop-root-secondarynamenode-YOUR-VPS-NAME.out # Παρακαλώ περιµένετε 1-5 λεπτά µέχρι να εµφανιστούν τα πιο πάνω!!! $ start-yarn.sh starting yarn daemons starting resourcemanager, logging to /usr/local/hadoop-2.7.1/logs/yarn-rootresourcemanager-your-vps-name.out localhost: starting nodemanager, logging to /usr/local/hadoop- 2.7.1/logs/yarn-root-nodemanager-YOUR-VPS-NAME.out 3 από 5
Σε πιο παλιές εγκαταστάσεις (YARN-less) Hadoop v0.20.2, χρειαζόταν απλά start-all.sh, όπου θα παίρνατε κάτι της µορφής: starting namenode, logging to /usr/local/hadoop/bin/../logs/hadoop-epl646- namenode-ubuntu.out localhost: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-epl646-datanode-ubuntu.out localhost: starting secondarynamenode, logging to /usr/local/hadoop/bin/../logs/hadoop-epl646-secondarynamenode-ubuntu.out starting jobtracker, logging to /usr/local/hadoop/bin/../logs/hadoop-epl646- jobtracker-ubuntu.out localhost: starting tasktracker, logging to /usr/local/hadoop/bin/../logs/hadoop-epl646-tasktracker-ubuntu.out Πάρτε µια σηµείωση για τα πιο πάνω αρχεία, εφόσον σε περιπτώσεις σφαλµάτων µπορεί να περιέχουν χρήσιµες πληροφορίες. D) Τα πιο κάτω δεν χρειάζονται για σκοπούς άσκησης αλλά παρατίθενται για δική σας χρήση: # Επανεκκίνηση του VPS σας shutdown -r now # Εγκατάσταση κάποιας υπηρεσίας στο VPS σας export http_proxy='http://proxy.cs.ucy.ac.cy:8008' yum install V. Εισαγωγή Δεδοµένων στο HDFS Τα απαραίτητα δεδοµένα θα τα κατεβάσετε από τη σελίδα του µαθήµατος µε όνοµα αρχείου as4- supplementary.zip. Μεταφέρετε τα αρχεία στο VPS σας και στη συνέχεια να τα εισάγετε τα στο HDFS (Hadoop Distributed File System) το οποίο βρίσκεται ρυθµισµένο µέσα στο VPS σας. Το συµπιεσµένο αρχείο as4-supplementary.zip περιέχει τα ακόλουθα CSV αρχεία: random.1000000.data.txt (25MB) random.100000.data.txt (2.4MB) random.10000.data.txt (228KB) random.10.data.txt (201B) Ο αριθµός στο όνοµα του αρχείου υποδηλώνει πόσους χρήστες (n) έχει κάθε αρχείο. Το περιεχόµενο των αρχείων αποτελείται από εγγραφές της ακόλουθης µορφής: <userid1,longitude1,latitude1>. <useridn,longituden,latituden> Μπορείτε να ανεβάσετε ένα αρχείο στο HDFS µε την εντολή: hadoop fs -put <localsrc>... <HDFS_dest_Path> π.χ., hadoop fs -put./random.10.data /user/epl646/ Για σκοπούς επίλυσης του knn self join O knn O, µπορείτε να εισάγετε κάθε αρχείο µε όνοµα «Ο» δυο φορές στο HDFS (π.χ., Ο1 και O2) και να υπολογίσετε το O1 knn O2. 4 από 5
VΙ. Δηµιουργία MapReduce Eργασιών Για να µπορέσετε να δηµιουργήσετε µια εργασία MapReduce θα πρέπει να υλοποιήσετε µια κλάση που κληρονοµεί την Mapper και υπερκαλύπτει-µεταβάλλει (override) την συνάρτηση map. Το αντίστοιχο θα πρέπει να γίνει µε την Reducer και reduce. H εκτέλεση του προγράµµατος σας θα πρέπει να γίνει ως ακολούθως: hadoop jar <filename>.jar <main-class> Λύση µε Πολλαπλούς Reducers (Σκέλος για Επιπλέον Μονάδες) Για να µπορέσετε να τρέξετε το πρόγραµµα µε πολλαπλούς reducers ενδέχεται να χρειαστεί η αλυσίδωση (chaining) πολλαπλών MapReduce εργασιών. Ειδικότερα, θα πρέπει η έξοδος της µιας MapReduce εργασίας να είναι είσοδος για την άλλη (δείτε παραδείγµατα στο εργαστήριο). Μπορείτε να ορίσετε σε πόσους Reducers µπορεί να τρέξει η εργασία µέσα από τον κώδικα σας, χρησιµοποιώντας το πιο κάτω: job.setnumreducetasks(4); // 4 reducers Επίσης όταν τρέχετε το πρόγραµµα σας µέσα από το IDE (π.χ., Eclipse) τότε το MapReduce πρόγραµµα τρέχει µόνο µε ένα Mapper και ένα Reducer. Κατά συνέπεια, θα πρέπει να δηµιουργήσετε ένα.jar αρχείο και να τρέξετε το MapReduce πρόγραµµα µε τον σωστό αριθµό των Reducers ως ακολούθως στο τερµατικό: hadoop D mapred.reduce.tasks=4 jar <filename>.jar <main-class> VI. Παραδοτέα Παραδώστε όλα τα πηγαία αρχεία σας µέσω του Moodle σε 1 συµπιεσµένο αρχείο (as4.zip): Παράδειγµα εκτέλεσης Με είσοδο το αρχείο «random.10.data.txt» όπως φαίνεται στην αριστερή στήλη και k=8, θα πρέπει να πάρετε το αποτέλεσµα στη δεξιά στήλη. Οι υπολογισµοί είναι µε την ευκλείδεια απόσταση (αντί της haversine απόστασης που χρησιµοποιείται σε long/lat υπολογισµούς). 1 -> 9 235.47984, 10 166.8724, 5 150.29001, 3 132.34007, 7 88.92536, 4 59.63813, 2 43.857162, 1 0.0 2 -> 9 198.60611, 3 129.52536, 10 125.238365, 5 106.47466, 7 57.180965, 4 51.68107, 1 43.857162, 2 0.0 3 -> 5 180.03531, 4 179.1341, 9 174.48692, 10 154.67604, 1 132.34007, 2 129.52536, 7 92.174324, 3 0.0 4 -> 9 240.15988, 3 179.1341, 10 160.2636, 5 126.36455, 7 107.28807, 1 59.63813, 2 51.68107, 4 0.0 5 -> 8 134.35233, 9 133.89711, 6 129.90901, 4 126.36455, 2 106.47466, 7 92.498665, 10 51.962746, 5 0.0 6 -> 3 237.67155, 2 225.01944, 7 185.24959, 5 129.90901, 10 100.631096, 9 75.51821, 8 51.103195, 6 0.0 7 -> 9 146.74573, 4 107.28807, 5 92.498665, 3 92.174324, 1 88.92536, 10 85.817184, 2 57.180965, 7 0.0 8 -> 2 210.98764, 3 198.19362, 7 162.42148, 5 134.35233, 10 89.06446, 6 51.103195, 9 25.730808, 8 0.0 9 -> 2 198.60611, 3 174.48692, 7 146.74573, 5 133.89711, 10 83.877144, 6 75.51821, 8 25.730808, 9 0.0 10 -> 3 154.67604, 2 125.238365, 6 100.631096, 8 89.06446, 7 85.817184, 9 83.877144, 5 51.962746, 10 0.0 Καλή Επιτυχία! 5 από 5