ΠΑΝΔΠΙΣΗΜΙΟ ΘΔΑΛΙΑ ΣΜΗΜΑ ΜΗΥΑΝΙΚΧΝ ΗΛΔΚΣΡΟΝΙΚΧΝ ΤΠΟΛΟΓΙΣΧΝ ΣΗΛΔΠΙΚΟΙΝΧΝΙΧΝ ΚΑΙ ΓΙΚΣΤΧΝ Ομαδοποίηζη εγγράθφν ηοσ παγκόζμιοσ ιζηού ζε καηανεμημένα περιβάλλονηα με MapReduce και Hadoop ΓΙΠΛΧΜΑΣΙΚΗ ΔΡΓΑΙΑ Παπαδόποσλος Ανδρέας Βόλος, Ιούνιος 2010
Ανδρέας Παπαδόποσλος ΑΕΜ: 600 2
ΠΑΝΔΠΙΣΗΜΙΟ ΘΔΑΛΙΑ ΣΜΗΜΑ ΜΗΥΑΝΙΚΧΝ ΗΛΔΚΣΡΟΝΙΚΧΝ ΤΠΟΛΟΓΙΣΧΝ ΣΗΛΔΠΙΚΟΙΝΧΝΙΧΝ ΚΑΙ ΓΙΚΣΤΧΝ Ομαδοποίηζη εγγράθφν ηοσ παγκόζμιοσ ιζηού ζε καηανεμημένα περιβάλλονηα με MapReduce και Hadoop ΓΙΠΛΧΜΑΣΙΚΗ ΔΡΓΑΙΑ Παπαδόποσλος Ανδρέας Δπηβιέπνληαο: Καηζαξόο Γεκήηξηνο Βόλος, Ιούνιος 2010 Ανδρέας Παπαδόποσλος ΑΕΜ: 600 3
Περίληυη Σν πξνγξακκαηηζηηθό κνληέιν Map Reduce πξνηάζεθε από ηελ Google ην 2004. θνπόο ηνπ είλαη λα επεμεξγάδεηαη κεγάια δεδνκέλα εηζόδνπ θαη λα παξάγεη ηα δεδνκέλα εμόδνπ ρξεζηκνπνηώληαο έλα ζύλνιν από δηαζπλδεδεκέλνπο ππνινγηζηέο (cluster) παξαιιειίδνληαο απηόκαηα ηελ εθηέιεζε ηεο εξγαζίαο πάλσ ζε απηό ην δίθηπν ππνινγηζηώλ. ην πιαίζην απηήο ηεο Γηπισκαηηθήο Δξγαζίαο ζα αζρνιεζώ κε κηα ζπγθεθξηκέλε πινπνίεζε ηνπ πξνγξακκαηηζηηθνύ κνληέινπ MapReduce, ην Hadoop, κηαο πινπνίεζεο αλνηρηνύ θώδηθα γξακκέλε ζε Java. Υξεζηκνπνηώληαο ηελ πξνγξακκαηηζηηθή δηεπαθή (API) ηνπ Hadoop ζα πινπνηήζσ έλα αιγόξηζκν γηα co-clustering εγγξάθσλ. Σν co-clustering έρεη κειεηεζεί θαη ρξεζηκνπνηεζεί ζε δηάθνξα ζπζηήκαηα όπσο εμόξπμε γλώζεο από θείκελν, βηνπιεξνθνξηθή, ζπζηήκαηα εηζεγήζεσλ θαη εμόξπμεο δεδνκέλσλ από γξαθήκαηα. Λόγσ ηνπ κεγάινπ όγθνπ δεδνκέλσλ πνπ ρξεηάδεηαη λα επεμεξγαζηνύκε πνιιέο θνξέο δελ είλαη δπλαηή ε εθαξκνγή ηνπ co-clustering ζε κεγάινπο πίλαθεο (κεξηθά εθαηνκκύξηα γξακκέο) γηα απηό ρξεζηκνπνηώληαο ην Hadoop κπνξνύκε λα νκαδνπνηήζνπκε θαηαλεκεκέλα κεγάιν όγθν δεδνκέλσλ. Πην ζπγθεθξηκέλα ζην ζηάδην ηεο αξρηθνπνίεζεο ηα έγξαθα αλαιύνληαη κε βάζε ηηο ιέμεηο θαη ηελ ζπρλόηεηα πνπ εκθαλίδνληαη ζε απηά. ηελ ζπλέρεηα κε βάζε απηή ηελ πιεξνθνξία γίλεηαη ηαπηόρξνλα νκαδνπνίεζε ηόζν γηα ηηο γξακκέο (ιέμεηο) όζν θαη γηα ηηο ζηήιεο (όλνκα αξρείνπ ή δηεύζπλζε ζηνλ παγθόζκην ηζηό) (co-clustering) κε βάζε ηελ νκνηόηεηα ζπλεκίηνλνπ (cosine similarity) ή θάπνην άιιν θξηηήξην απόζηαζεο. ε αληίζεζε κε ηελ απιή νκαδνπνίεζε (clustering), νκαδνπνίεζε κόλν κε βάζε ηηο γξακκέο ή κόλν κε βάζε ηηο ζηήιεο, βξίζθνπκε ππνπίλαθεο πνπ έρνπλ θνηλέο ηδηόηεηεο. ηελ ζπλέρεηα ζα θάλσ θάπνηα πεηξάκαηα θαη ζα παξνπζηάζσ γξαθηθά ηα απνηειέζκαηα. Σέινο ζπγθξίλνληαο ηα απνηειέζκαηα απηά παξνπζηάδσ ηα ζπκπεξάζκαηα κνπ θαη ηνπο κειινληηθνύο ζηόρνπο γηα ηελ δηπισκαηηθή εξγαζία κνπ. ΘΔΜΑΣΙΚΗ ΠΔΡΙΟΥΗ: Δμόξπμε γλώζεο ΛΔΞΔΙ ΚΛΔΙΓΙΑ: Hadoop, MapReduce, co-clustering, νκαδνπνίεζε εγγξάθσλ Ανδρέας Παπαδόποσλος ΑΕΜ: 600 4
ΠΔΡΙΔΥΟΜΔΝΑ ΠΔΡΙΔΥΟΜΔΝΑ... 5 ΔΙΑΓΧΓΗ... 7 ΚΙΝΗΣΡΟ... 7 ΣΟ ΠΡΟΓΡΑΜΜΑΣΙΣΙΚΟ ΜΟΝΣΔΛΟ MAP REDUCE... 7 ΠΑΡΑΓΔΙΓΜΑΣΑ... 8 Παράδειγμα1: WordCount... 8 Παράδειγμα2: Inverted Index... 9 Περιζζόηερα Παραδείγμαηα... 10 ΔΠΙΚΟΠΗΗ HADOOP... 10 Hadoop Distributed File System HDFS... 10 Ο μητανιζμός ηοσ Map Reduce... 12 Επιζκόπηζη ηης εκηέλεζης μιας Map Reduce εργαζίας... 13 Χρήζεις ηοσ Hadoop... 14 CO-CLUSTERING... 15 ΟΡΓΑΝΧΗ... 15 HADOOP... 16 ΒΑΙΚΔ ΔΝΣΟΛΔ ΥΡΗΗ HADOOP... 16 ΠΧ ΝΑ ΓΡΑΦΔΣΔ ΔΝΑ ΠΡΟΓΡΑΜΜΑ HADOOP... 17 ΠΧ ΝΑ ΣΡΔΞΔΣΔ ΔΝΑ ΠΡΟΓΡΑΜΜΑ HADOOP... 18 CO-CLUSTERING ΔΓΓΡΑΦΧΝ... 20 CO-CLUSTERING ΔΓΓΡΑΦΧΝ... 20 ΔΙΡΙΑΚΟ ΑΛΓΟΡΙΘΜΟ CO-CLUSTERING ΔΓΓΡΑΦΧΝ... 20 Αρτικοποίηζη Υπολογιζμός πίνακα γειηνίαζης... 20 Αλγόριθμος... 20 CO-CLUSTERING ΔΓΓΡΑΦΧΝ ΜΔ MAP REDUCE ΚΑΙ HADOOP... 21 ΑΛΓΟΡΙΘΜΟ CO-CLUSTERING ΔΓΓΡΑΦΧΝ ΜΔ MAP REDUCE... 21 Αρτικοπίηζη Υπολογιζμός πίνακα γειηνίαζης... 21 Αλγόριθμος... 22 Στόλια για ηον κώδικα... 24 ΑΠΟΣΔΛΔΜΑΣΑ ΠΔΙΡΑΜΑΣΧΝ... 25 ΠΛΑΣΦΟΡΜΔ ΔΚΣΔΛΔΗ... 25 ΑΠΟΣΔΛΔΜΑΣΑ ΠΔΙΡΑΜΑΣΧΝ... 25 Αποηελέζμαηα από ζσλλογή 1... 26 Αποηελέζμαηα από ζσλλογή 2... 27 Αποηελέζμαηα από ζσλλογή 3... 28 Αποηελέζμαηα από ζσλλογή 4... 29 ΤΓΚΡΙΗ ΑΠΟΣΔΛΔΜΑΣΧΝ... 30 ΤΜΠΔΡΑΜΑΣΑ ΚΑΙ ΜΔΛΛΟΝΣΙΚΗ ΔΡΓΑΙΑ... 33 Ανδρέας Παπαδόποσλος ΑΕΜ: 600 5
ΤΜΠΔΡΑΜΑΣΑ... 33 ΜΔΛΛΟΝΣΙΚΗ ΔΡΓΑΙΑ... 33 ΒΙΒΛΙΟΓΡΑΦΙΑ... 35 ΠΑΡΑΡΣΗΜΑ Α ΚΧΓΙΚΑ ΠΑΡΑΓΔΙΓΜΑΣΧΝ... 36 ΚΧΓΙΚΑ ΠΑΡΑΓΔΙΓΜΑΣΟ 1 WORD COUNT... 36 ΚΧΓΙΚΑ ΠΑΡΑΓΔΙΓΜΑΣΟ 2 INVERTED INDEX... 37 ΠΑΡΑΡΣΗΜΑ Β ΔΝΣΟΛΔ ΥΡΗΗ HADOOP... 39 ΔΠΙΚΟΠΙΗ... 39 Γενικές Επιλογές - Generic Options... 39 ΔΝΣΟΛΔ ΥΡΗΣΧΝ - USER COMMANDS... 40 archive... 40 distcp... 40 fs... 40 fsck... 43 jar... 44 job... 44 pipes... 45 queue... 45 version... 45 CLASSNAME... 45 ΔΝΣΟΛΔ ΓΙΑΥΔΙΡΙΣΧΝ - ADMINISTRATION COMMANDS... 46 balancer... 46 daemonlog... 46 datanode... 46 dfsadmin... 46 jobtracker... 47 namenode... 47 secondarynamenode... 47 tasktracker... 47 ΠΑΡΑΡΣΗΜΑ Γ HADOOP STREAMING... 48 PRACTICAL HELP... 49 Ανδρέας Παπαδόποσλος ΑΕΜ: 600 6
ΔΙΑΓΧΓΗ ΚΙΝΗΣΡΟ Η ξαγδαία αλάπηπμε ηνπ παγθόζκηνπ ηζηνύ έρεη δεκηνπξγήζεη ηελ αλάγθε ηεο γξήγνξεο θαη απνδνηηθήο επεμεξγαζίαο κεγάινπ όγθνπ δεδνκέλσλ (ην Google επεμεξγάδεηαη θαζεκεξηλά πεξίπνπ 20 petabytes δεδνκέλσλ). Γηα ηελ απαξαίηεηε επεμεξγαζία δελ είλαη πιένλ δπλαηή ε ρξήζε ελόο απινύ ππνινγηζηή θαη γηα ην ιόγν απηό έρνπκε νδεγεζεί ζηελ αλαπόθεπθηε ρξήζε ζπζηεκάησλ πνιπεπεμεξγαζηώλ (clusters). Απηά ηα ζπζηήκαηα ζπλήζσο απνηεινύληαη από αξθεηνύο δηαζπλδεδεκέλνπο ππνινγηζηέο. Η ηζρύο θαη απνδνηηθόηεηα ησλ ζπζηεκάησλ απηώλ ζίγνπξα είλαη έλα ζεηηθό ζηνηρείν αιιά δελ είλαη επαξθήο. Πνιιέο θνξέο είκαζηε αλαγθαζκέλνη λα κεηώζνπκε ησλ όγθν δεδνκέλσλ θαη λα πινπνηήζνπκε απνδνηηθνύο αιγνξίζκνπο γηα ηελ επίιπζε ησλ δηάθνξσλ πξνβιεκάησλ πνπ παξνπζηάδνληαη θαζεκεξηλά. Έλαο ηξόπνο λα θάλνπκε ηελ επεμεξγαζία πνπ ζέινπκε πην γξήγνξα, παίξλνληαο ηα ίδηα απνηειέζκαηα, είλαη ε νκαδνπνίεζε (clustering). Η νκαδνπνίεζε είλαη λα ηνπνζεηήζνπκε ηα δεδνκέλα πνπ ζέινπκε λα επεμεξγαζηνύκε ζε νκάδεο θαη αθνινύζσο λα επεμεξγαζηνύκε απηέο ηηο νκάδεο κεηώλνληαο έηζη θαηά κεγάιν βαζκό ηνλ ρξόλν πνπ ρξεηάδεηαη γηα ηελ επεμεξγαζία ηεξάζηησλ ζπλόισλ δεδνκέλσλ. Η νκαδνπνίεζε (clustering) γίλεηαη κε επεμεξγαζία κόλν ηεο κία δηάζηαζεο ελόο πίλαθα (κόλν γξακκέο ή κόλν ζηήιεο) κε αιγόξηζκνπο όπσο ν K-means, QT θιπ. ην clustering έξρεηαη λα πξνζηεζεί ην co-clustering. Σν co-clustering είλαη ε ηαπηόρξνλε νκαδνπνίεζε ηόζν ησλ γξακκώλ όζν θαη ησλ ζηειώλ ελόο πίλαθα (νκαδνπνίεζε ζε δύν δηαζηάζεηο) κε απνηέιεζκα λα έρνπκε πνιύ κηθξόηεξνπ όγθνπ δεδνκέλα λα επεμεξγαζηνύκε. Σν co-clustering έρεη κειεηεζεί θαη ρξεζηκνπνηεζεί ζε δηάθνξα ζπζηήκαηα όπσο εμόξπμε γλώζεο από θείκελν, βηνπιεξνθνξηθή, ζπζηήκαηα εηζεγήζεσλ θαη εμόξπμεο δεδνκέλσλ από γξαθήκαηα θιπ. ηα πιαίζηα απηήο ηεο εξγαζίαο ζα αζρνιεζώ κε ηελ πινπνίεζε θαη αμηνιόγεζε ελόο αιγόξηζκνπ co-clustering ρξεζηκνπνηώληαο ην Hadoop, έλα ινγηζκηθό αλνηρηνύ θώδηθα πνπ παξέρεη κηα πινπνίεζε ηνπ πξνγξακκαηηζηηθνύ κνληέινπ Map Reduce. ΣΟ ΠΡΟΓΡΑΜΜΑΣΙΣΙΚΟ ΜΟΝΣΔΛΟ MAP REDUCE Σν Map Reduce είλαη έλα κνληέιν πξνγξακκαηηζκνύ γηα ηελ επεμεξγαζία θαη παξαγσγή κεγάισλ ζπλόισλ δεδνκέλσλ πάλσ ζε έλα δίθηπν ππνινγηζηώλ (cluster) πνπ αξρηθά πξνηάζεθε από ην Google ην 2004. Σν κνληέιν είλαη αξθεηά απιό ζηε ρξήζε θαη επξέσο δηαδεδνκέλν. Σν Google έρεη πινπνηήζεη πάλσ από 10000 πξνγξάκκαηα θαη θαηά κέζν όξν θάζε κέξα ηξέρνπλ ζηα clusters ηνπ Google 1000 μερσξηζηέο εξγαζίεο Map Reduce πνπ ζπλνιηθά επεμεξγάδνληαη πάλσ από 20 petabytes δεδνκέλσλ. Η ηδέα ηνπ MapReduce είλαη λα παίξλεη ζαλ είζνδν έλα ζύλνιν από δεπγάξηα <θιεηδί εηζόδνπ ηηκή> θαη λα παξάγεη ζηελ έμνδν έλα ζύλνιν από δεπγάξηα <θιεηδί εμόδνπ απνηέιεζκα>. Ο πξνγξακκαηηζηήο εθθξάδεη/πινπνηεί ηνλ αιγόξηζκν ζαλ δύν ζπλαξηήζεηο/ κεζόδνπο, ηελ map θαη ηελ reduce. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 7
Η ζπλάξηεζε map δέρεηαη ζαλ είζνδν έλα δεύγνο θιεηδί-ηηκή θαη παξάγεη ζαλ έμνδν έλα δεύγνο θιεηδί-ηηκή. Η έμνδνο ηεο ζπλάξηεζεο map, ηαμηλνκεκέλε κε βάζε ην θιεηδί, είλαη ε είζνδνο ηεο ζπλάξηεζεο reduce. Η ζπλάξηεζε reduce παίξλεη ζαλ είζνδν ηελ έμνδν ηεο ζπλάξηεζεο map ζηελ κνξθή θιεηδί-ελδηάκεζεο ηηκέο θαη ηελ επεμεξγάδεηαη. πλήζσο γηα θάζε θιεηδί έρνπκε κία ηηκή ζηελ έμνδν. Γηα ηελ επίιπζε θάπνηνπ πξνβιήκαηνο κε ην Map Reduce, ν πξνγξακκαηηζηήο πξέπεη λα πινπνηήζεη ηνπιάρηζηνλ ηελ ζπλάξηεζε map. Κάπνηεο απιέο εξγαζίεο κπνξνύλ λα πινπνηεζνύλ κόλν κε ηελ ρξήζε ηεο ζπλάξηεζεο map. τήμα 1. Αναπαράζηαζη Map Reduce ζσναρηήζεφν ΠΑΡΑΓΔΙΓΜΑΣΑ ΠΑΡΑΓΔΙΓΜΑ1: WORDCOUNT Σν παξάδεηγκα απηό παίξλεη ζαλ είζνδν δηάθνξα αξρεία θεηκέλνπ θαη κεηξά ηεο εκθαλίζεηο θάζε ιέμεο κέζα ζε όια ηα αξρεία πνπ έρεη πάξεη ζαλ είζνδν. Η map, αθνύ πάξεη ηα αξρεία, δίλεη ζε θάζε εκθάληζε κηαο ιέμεο κηα πξνζσξηλή ηηκή ίζε κε έλα. Όηαλ ε map ηειεηώζεη ηελ εθηέιεζε ηεο θαη δώζεη ηα απνηειέζκαηα ηεο ζηελ reduce, ηόηε ε reduce ζα αζξνίζεη ηεο απηέο ηεο πξνζσξηλέο κεηαβιεηέο γηα θάζε κνλαδηθή ιέμε θαη ζα ηεο δώζεη πίζσ ζαλ απνηέιεζκα ηνλ αξηζκό εκθάληζεο ηεο θάζε κνλαδηθήο ιέμεο κέζα ζηα αξρεία. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 8
Map Input: a document Output: key=word value=1 Map(void *input) { for each word w in input EmitIntermediate(w, 1); Reduce Input: key=word values=list of values (1) Output: key=word value=occurrences (SumOfInputValues) Reduce(String key, Iterator values) { int result = 0; for each v in values result += v; Emit(w, result); Πίνακας 1. Φεσδοκώδικας WordCount Από ηνλ ςεπδνθώδηθα βιέπνπκε πόζν απιό είλαη λα ιύζνπκε παξάιιεια ην πην πάλσ πξόβιεκα. Μπνξνύλ παξάιιεια λα ηξέρνπλ ηόζεο map ζπλαξηήζεηο όζα είλαη θαη ηα αξρεία θεηκέλνπ πνπ έρνπκε, ή αθόκα θαη όζεο είλαη νη γξακκέο ζε όια ηα αξρεία κε κνλαδηθό πεξηνξηζκό ην πιηθό πνπ δηαζέηνπκε. Παξόκνηα κπνξνύλ λα ηξέρνπλ παξάιιεια ηόζεο reduce ζπλαξηήζεηο όζα θαη ηα θιεηδηά εμόδνπ ησλ map ζπλαξηήζεσλ (ιέμεηο). Σν Hadoop παξαιειινπνηεί ηελ εξγαζία ρσξίο ν πξνγξακκαηηζηήο λα αλεζπρεί πσο ζα γίλεη ε εθηέιεζε. ΠΑΡΑΓΔΙΓΜΑ2: INVERTED INDEX ην παξάδεηγκα απηό ζα δνύκε πσο κπνξνύκε εύθνια κε ρξήζε ηνπ Map Reduce λα θαηαζθεπάζνπκε έλα inverted index. αλ είζνδν έρνπκε θαη πάιη κηα ζπιινγή εγγξάθσλ ζηα νπνία ζέινπκε λα θηίζνπκε ην επξεηήξην, δειαδή ζε πνηα αξρεία βξίζθεηαη θάζε ιέμε. Map Input: a document Output: key=word value=filename Map(void *input) { for each word w in input EmitIntermediate(w, filename); Reduce Input: key=word value=list of values(filenames) Output: key=word value=files Reduce(String key, Iterator values) { String files = ; for each v in values files += v+ - ; Emit(w, files); Πίνακας 2. Φεσδοκώδικας Inverted Index Σν παξάδεηγκα απηό κπνξεί εύθνια λα επεθηαζεί νύησο ώζηε ζην επξεηήξην λα ζπκπεξηιάβνπκε θαη πόζεο θνξέο εκθαλίδεηαη ε θάζε ιέμε ζην θάζε αξρείν. Απηό κπνξεί λα γίλεη κε ειάρηζηε επηπιένλ δνπιεηά ζηελ ζπλάξηεζε reduce. ην παξάδεηγκα απηό εάλ κία ιέμε εκθαλίδεηαη δύν ή πεξηζζόηεξεο θνξέο ζην ίδην αξρείν ηόηε ζηελ έμνδν ζα έρνπκε ζηελ ηηκή (files) δύν ή πεξηζζόηεξεο θνξέο ηελ ίδηα ελδηάκεζε ηηκή (ίδην αξρείν). Άξα απιά κεηξώληαο πόζεο θνξέο έρνπκε ην ίδην αξρείν-ελδηάκεζε ηηκή κπνξνύκε λα βξνύκε θαη πόζεο θνξέο ε θάζε ιέμε εκθαλίδεηαη ζην θάζε αξρείν. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 9
ΠΔΡΙΟΣΔΡΑ ΠΑΡΑΓΔΙΓΜΑΣΑ Distributed Grep Count of URL Access Frequency Reverse Web-Link Graph Distributed Sort Map Δάλ κία γξακκή από ηελ είζνδν ηαηξηάδεη κε ην πξόηππν (pattern) ηόηε δίλεη ζηελ έμνδν ηελ ζπγθεθξηκέλε γξακκή. Γηα θάζε εγγξαθή (πξόζβαζε ζε θάπνηα ζειίδα) ζηα αξρεία ηζηνξηθνύ(logs) δίλεη έμνδν <URL, 1> Γηα θάζε ζύλδεζκν από κία ζειίδα (source URL) πξνο κηα άιιε ζειίδα (target URL) δίλεη έμνδν <target, source> Γηα θάζε εγγξαθή βξίζθεη ην θιεηδί θαη δίλεη έμνδν <key, record> Πίνακας 3. Περιζζόηερα Παραδείγμαηα Reduce Αληηγξάθεη ηελ έμνδν ηεο map. Μπνξεί λα παξαιεθζεί εάλ δελ ζέινπκε ηαμηλνκεκέλε έμνδν. Πξνζζέηεη όιεο ηηο ηηκέο θαη δίλεη έμνδν <URL, total count> Γηα θάζε θιεηδί (target) δίλεη ζηελ έμνδν ηελ ιίζηα από ηηο ζειίδεο πνπ έρνπλ ζύλδεζκν πξνο απηή <target, list(source)> Γίλεη ζηελ έμνδν όια ηα δεύγε πνπ πήξε ζαλ είζνδν. ΔΠΙΚΟΠΗΗ HADOOP Σν Hadoop είλαη έλα ινγηζκηθό αλνηρηνύ θώδηθα πνπ ππνζηεξίδεη θαηαλεκεκέλε επεμεξγαζία κεγάινπ όγθνπ δεδνκέλσλ (petabytes) θαη παξέρεη κηα πινπνίεζε ηνπ MapReduce. Σν Hadoop βαζίζηεθε ζην Google Map Reduce framework θαη ην Google File System (GFS). Δίλαη έλα έξγν ηνπ Apache Software Foundation πνπ αλαπηύζζεηε θαη ρξεζηκνπνηείηε από αλζξώπνπο από όιν ηνλ θόζκν θαη θπξίσο ηελ Yahoo!. HADOOP DISTRIBUTED FILE SYSTEM HDFS Σν HDFS είλαη έλα θαηαλεκεκέλν ζύζηεκα αξρείσλ γηα απνζήθεπζε κεγάισλ αξρείσλ (ηδαληθά κεγέζνπο πνιιαπιάζην ηνπ 64Mb) παξόκνην κε ην Google File System(GFS). Δπηηπγράλεη λα είλαη αμηόπηζην απνζεθεύνληαο ηα δεδνκέλα ζε πεξηζζόηεξνπο από έλα θόκβνπο. Οη θόκβνη επηθνηλσλνύλ κεηαμύ ηνπο γηα εμηζνξξόπεζε ησλ δεδνκέλσλ, αληηγξαθή ή κεηαθίλεζε ησλ δεδνκέλσλ, γηα λα θξαηεζεί ςειά ν ιόγνο αληηγξαθήο (replication). Σν ζύζηεκα αξρείσλ HDFS ρξεζηκνπνηεί έλα θεληξηθό θόκβν, ηνλ name node, ν νπνίνο είλαη θαη ην κνλαδηθό ζεκείν απνηπρίαο (single point of failure), πνπ θξαηά ηηο πιεξνθνξίεο γηα ην πνπ βξίζθεηαη θάζε δεδνκέλν ζην HDFS. Αλ απηόο δελ είλαη δηαζέζηκνο ηόηε δελ ππάξρεη πξόζβαζε ζην ζύζηεκα αξρείσλ. Δπηπιένλ ρξεζηκνπνηεί αθόκα έλα αθόκα θόκβν, ηνλ Secondary Namenode, ν νπνίνο θξαηά snapshots ησλ θαθέισλ ηνπ name node θαη καδί κε ηα αξρεία ηζηνξηθνύ (logs) ηνπ name node επαλαθέξεη ην ζύζηεκα αξρείσλ κεηά από απνηπρία. Οη ππόινηπνη θόκβνη νλνκάδνληαη datanodes θαη απιά απνζεθεύνπλ δεδνκέλα. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 10
τήμα 2. Αρτιηεκρονική Hadoop Cluster Ανδρέας Παπαδόποσλος ΑΕΜ: 600 11
Ο ΜΗΥΑΝΙΜΟ ΣΟΤ MAP REDUCE τήμα 3. Μητανιζμός MapReduce Ο κεραληζκόο ηνπ Map Reduce αθνινπζεί ην κνληέιν αξρηηεθηνληθήο master/slave. O θεληξηθόο master server, jobtracker, αλαιακβάλεη ηνλ δηακεξηζκό ησλ εξγαζηώλ ζηνπο ππόινηπνπο θόκβνπο, slave servers tasktrackers. Ο ρξήζηεο ζηέιλεη ηηο map θαη reduce εξγαζίεο ηνπ ζηνλ jobtracker, ν νπνίνο κε πνιηηηθή FIFO (First In First Out) ηηο ζηέιλεη ζηνπο tasktrackers γηα εθηέιεζε. Οη tasktrackers απιά εθηεινύλ ηηο εξγαζίεο πνπ ηνπ αλαζέηεη ν jobtracker. Πξηλ από ηελ έθδνζε 0.21 εάλ έλαο tasktracker απνηύγραλε ηόηε ε αληίζηνηρε εξγαζία έπξεπε λα εθηειεζηεί από ηελ αξρή. Master Slave MapReduce jobtracker tasktracker ΗDFS namenode datanode Πίνακας 4. Master/Slave - MapReduce και DFS Ανδρέας Παπαδόποσλος ΑΕΜ: 600 12
ΔΠΙΚΟΠΗΗ ΣΗ ΔΚΣΔΛΔΗ ΜΙΑ MAP REDUCE ΔΡΓΑΙΑ Αξρηθά ε είζνδνο κνηξάδεηαη ζε Μ θνκκάηηα, πνπ κπνξνύλ λα επεμεξγαζηνύλ παξάιιεια, θάζε έλα από ηα νπνία ζα πάεη ζε μερσξηζηή map δηεξγαζία. Σα ελδηάκεζα θιεηδηά κνηξάδνληαη ζηνπο R Reducers κε ρξήζε θάπνηαο ζπλάξηεζεο θαηαθεξκαηηζκνύ (π.ρ. hash (key) mod R). Η όιε εθηέιεζε παξνπζηάδεηαη ζην πην θάησ ζρήκα θαη νη ελέξγεηεο γίλνληαη κε ηελ εμήο ζεηξά: 1. Η βηβιηνζήθε Map Reduce δηαζπά ηελ είζνδν ζε Μ θνκκάηηα, ζπλήζσο κεγέζνπο 16-64Mb, θαη μεθηλά αξθεηά αληίγξαθα ηνπ πξνγξάκκαηνο ζηνπο θόκβνπο. 2. Ο master node - jobtracker αλαιακβάλεη λα βξεη ηνπο αλελεξγνύο θόκβνπο, tasktrackers, θαη λα ηνπο αλαζέζεη κηα εξγαζία map ή reduce. 3. Δάλ ζην θόκβν, tasktracker, έρεη αλαηεζεί κηα εξγαζία map ηόηε δηαβάδεη ην θνκκάηη εηζόδνπ πνπ ηνπ αληηζηνηρεί θαη ην δηακνξθώλεη σο θιεηδί-ηηκή θαη ην δίλεη σο παξάκεηξν ζηελ ζπλάξηεζε map. Σα ελδηάκεζα απνηειέζκαηα θξαηνύληαη ζηελ κλήκε. 4. Με βάζε ηελ ζπλάξηεζε θαηαθεξκαηηζκνύ ηα ελδηάκεζα απνηειέζκαηα γξάθνληαη ζην ηνπηθό δίζθν (ζε R κέξε). Οη ζέζεηο ησλ απνηειεζκάησλ ζηέιλνληαη ζηνλ master - jobtracker ν νπνίνο είλαη ππεύζπλνο λα ηηο δηακνηξάζεη ζηνπο R reducers - tasktrackers. 5. Όηαλ θάπνηνο reducer εηδνπνηεζεί γηα απηέο ηηο ηνπνζεζίεο δηαβάδεη απνκαθξπζκέλα ηα δεδνκέλα από ην δίζθν ηνπ αληίζηνηρνπ mapper. Αθνύ δηαβάζεη όια ηα δεδνκέλα ηα ηαμηλνκεί κε βάζε ην θιεηδί θαη νκαδνπνηεί ηηκέο πνπ αληηζηνηρνύλ ζην ίδην θιεηδί. Δάλ ηα δεδνκέλα δελ ρσξάλε ζηελ κλήκε ηόηε ρξεζηκνπνηείηαη θάπνηνο αιγόξηζκνο εμσηεξηθήο ηαμηλόκεζεο. 6. Σα ηαμηλνκεκέλα ελδηάκεζα απνηειέζκαηα πεξληνύληαη ζηελ ζπλάξηεζε reduce γηα λα παξαρζεί ε ηειηθή έμνδνο ε νπνία γξάθεηαη ζην ηέινο ελόο αξρείνπ γηα ηελ έμνδν ηεο ζπγθεθξηκέλεο δηακέξηζεο. 7. Αθνύ ηειεηώζνπλ όιεο νη εξγαζίεο ζηνπο tasktrackers (map θαη reduce) ν master - jobtracker επηζηξέθεη θαη ε εθηέιεζε ζπλερίδεηαη από ηνλ θώδηθα ηνπ ρξήζηε. ην θαηάινγν πνπ έρεη νξηζζεί γηα ηελ έμνδν ππάξρνπλ R αξρεία (έλα γηα θάζε reducer). πλήζσο απηά ρξεζηκνπνηνύληαη ζαλ είζνδνο ζε θάπνηα άιιε Map Reduce εξγαζία θαη δελ ρξεηάδεηαη λα ζπγρσλεπηνύλ. Σα νλόκαηα ησλ αξρείσλ, ν αξηζκόο ησλ reducers θαζώο θαη ν δηακεξηζκόο ηεο εηζόδνπ κπνξνύλ λα νξηζηνύλ από ηνλ ρξήζηε. ε όιεο ηηο θάζεηο εθηειείηε δηαρείξηζε ζθαικάησλ θαη ζε πεξίπησζε απνηπρίαο ην Hadoop κπνξεί λα επαλεθθηλήζεη ηελ εξγαζία πνπ απέηπρε ζε θάπνην άιιν θόκβν ή λα αλαθάκςεη θαη λα ζπλερίζεη ηελ εθηέιεζε (hadoop v0.21) κε κηθξό overhead. To hadoop επηηπγράλεη θαιό load balancing ιόγσ ηνπ κεγάινπ αξηζκνύ tasktrackers. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 13
τήμα 4. Φάζεις εκηέλεζης μιας εργαζίας MapReduce ΥΡΗΔΙ ΣΟΤ HADOOP Σν Hadoop ζήκεξα είλαη ε πην δηαδεδνκέλε πινπνίεζε ηνπ MapReduce θαη ρξεζηκνπνηείηαη γηα δηδαθηηθνύο ζθνπνύο ζε αξθεηά παλεπηζηήκηα ηνπ θόζκνπ, αιιά θαη ζε κεγάινπο νξγαληζκνύο αλά ην παγθόζκην γηα ηελ επεμεξγαζία κεγάισλ δεδνκέλσλ εηζόδνπ. Κάπνηνη από ηνπο νξγαληζκνύο, πνπ δηαηεξνύλ clusters γηα εθηέιεζε Hadoop εξγαζηώλ είλαη: Yahoo!, Amazon, AOL, Alibaba, Cornell University Web Lab, ETH Zurich Systems Group, Facebook, Google, IBM, New York Times θ.α. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 14
CO-CLUSTERING Σν co-clustering είλαη κία ηερληθή εμόξπμεο γλώζεο πνπ νκαδνπνηεί ηαπηόρξνλα ηηο γξακκέο θαη ηηο ζηήιεο ελόο πίλαθα. πγθεθξηκέλα δνζέληνο ελόο πίλαθα mxn έλαο αιγόξηζκνο co-clustering δίλεη ζηελ έμνδν νκάδεο γξακκώλ πνπ έρνπλ παξόκνηα ραξαθηεξηζηηθά ζε θάπνην ππνζύλνιν ζηειώλ θαη αληίζηξνθα. Σν πξόβιεκα αλήθεη ζηελ θαηεγνξία NP-Complete γηα απηό γηα ηελ επίιπζε ηνπ απαηηείηαη κεγάιε ππνινγηζηηθή ηζρύο θαη/ή ρξήζε θάπνηαο επξεηηθήο ζπλάξηεζεο κε κηθξό ζθάικα γηα επίζπεπζε ησλ ππνινγηζκώλ. Σν co-clustering αλαθέξεηαη ζηελ βηβιηνγξαθία θαη κε ηνπο όξνπο biclustering, biodimentional clustering, θαη subspace clustering. Γηα ηελ επίιπζε ηνπ co-clustering πξνηάζεθαλ αξθεηνί αιγόξηζκνη κεξηθνί από ηνπο νπνίνπο είλαη νη αθόινπζνη: Block clustering, CTWC, ITWC, δ-bicluster, δ-pcluster, δ-pattern, FLOC, OPC, Plaid Model, OPSMs, Gibbs, SAMBA, Robust Biclustering Algorithm (RoBA), Crossing Minimization, cmonkey, PRMs, DCC, LEB(Localize and Extract Biclusters), QBUIC(QUalitative BIClustering) θαη BCCA(Bi- Correlation Clustering Algorithm). Οη πην πάλσ αιγόξηζκνπ δίλνπλ δηαθνξεηηθά απνηειέζκαηα θαη αξθεηέο θνξέο δελ είλαη ληεηεξκηληζηηθνί. Λόγσ έιιεηςεο ελόο πξνηύπνπ θαη ιόγσ ηεο κε επηβιεπόκελεο θαηεγνξηνπνίεζεο δελ είκαζηε ζε ζέζε λα θξίλνπκε θαηά πόζν ην απνηέιεζκα είλαη αμηόπηζην. Μηα ιύζε ζην πξόβιεκα απηό είλαη λα ηξέμνπκε αξθεηνύο αιγνξίζκνπο θαη λα επηιέμνπκε ην θαιύηεξν απνηέιεζκα. Παξόια απηά ην co-clustering έρεη κειεηεζεί θαη ρξεζηκνπνηεζεί ζε δηάθνξα ζπζηήκαηα όπσο εμόξπμε γλώζεο από θείκελν, βηνπιεξνθνξηθή, ζπζηήκαηα εηζεγήζεσλ θαη εμόξπμεο δεδνκέλσλ θιπ. ΟΡΓΑΝΧΗ ην επόκελν θεθάιαην παξνπζηάδνληαη βαζηθέο εληνιέο γηα ηελ ρξήζε ηνπ Hadoop θαζώο θαη νδεγίεο γηα ηελ ζύληαμε ελόο πξνγξάκκαηνο. ηελ ζπλέρεηα ζην θεθάιαην 3 παξνπζηάδεηαη κηα ιύζε ζην πξόβιεκα ηνπ co-clustering κε ζεηξηαθό αιγόξηζκν θαη ζην θεθάιαην 4 αθνινπζεί κηα ιύζε βαζηζκέλε ζην κεραληζκό Map Reduce θαη Hadoop. Αθνινύζσο ζην θεθάιαην 5 παξαηίζεληαη ηα απνηειέζκαηα από πεηξακαηηθέο κεηξήζεηο πνπ έγηλαλ θαη ηέινο ζην θεθάιαην 6 παξνπζηάδνληαη ηα ζπκπεξάζκαηα θαη νη κειινληηθνί ζηόρνη ηεο παξνύζαο εξγαζίαο. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 15
HADOOP ΒΑΙΚΔ ΔΝΣΟΛΔ ΥΡΗΗ HADOOP Γηα ην ρεηξηζκό ηνπ Hadoop όιεο νη εληνιέο εθηεινύληαη ζηνλ θεληξηθό θόκβν (master node). ε απηό ην ηκήκα παξνπζηάδνληαη νη βαζηθέο εληνιέο πνπ πηζαλόλ λα ρξεηαζηνύλ γηα ηελ ιεηηνπξγία ηνπ. Όιεο νη εληνιέο εθηεινύληαη από ηνλ θαηάινγν εγθαηάζηαζεο ηνπ Hadoop. Δληνιή bin/hadoop namenode -format bin/start-all.sh bin/hadoop dfs copyfromlocal [source dir] [destination dir] bin/hadoop dfs copytolocal [source dir] [destination dir] bin/hadoop dfs -ls bin/hadoop jar [hadoop program] [input] [output] bin/hadoop dfs cat [path to file] bin/hadoop dfs rmr [directory] Απνηέιεζκα θαη ζρόιηα Γίλεηαη format ην ζύζηεκα αξρείσλ. Πξέπεη λα εθηειεζηεί ακέζσο κεηά ηελ εγθαηάζηαζε γηα λα αξρηθνπνηεζεί ην namenode. Γελ πξέπεη λα εθηειεζηεί μαλά, γηαηί ζα ραζνύλ όια ηα δεδνκέλα από ην file system. Δθθίλεζε ηνπ Hadoop ζην cluster. Πξέπεη λα εθηειεζηεί νύησο ώζηε λα αξρίζνπλ λα ηξέρνπλ όινη νη ζπζηαηηθνί θόκβνη ηνπ Hadoop (namenode, datanode, jobtracker θαη tasktracker). Αληηγξαθή δεδνκέλσλ από ην ηνπηθό ζύζηεκα αξρείσλ ζην HDFS. Αληηγξάθεη ην [source dir] από ην ηνπηθό ζύζηεκα αξρείσλ ζην ζύζηεκα αξρείσλ ηνπ Hadoop (HDFS) ζηνλ θαηάινγν [destination dir]. Αληηγξαθή δεδνκέλσλ από ην HDFS ζην ηνπηθό ζύζηεκα αξρείσλ. Αληηγξάθεη ην [source dir] από ην HDFS ζην ηνπηθό ζύζηεκα αξρείσλ ζηνλ θαηάινγν [destination dir]. Πξνβνιή πεξηερνκέλσλ HDFS. Μπνξεί λα ρξεζηκνπνηεζεί αθξηβώο όπσο ε εληνιή ls ησλ Unix κε επηπιένλ παξάκεηξν ην όλνκα ελόο θαθέινπ ηνπ HDFS. Δθηέιεζε πξνγξάκκαηνο Hadoop. H εληνιή απηή ηξέρεη ην [hadoop program] πάλσ ζην Hadoop θαη ρξεζηκνπνηεί ζαλ είζνδν ηνλ θαηάινγν [input] θαη έμνδν ηνλ θαηάινγν [output]. Kαη νη δύν θαηάινγνη βξίζθνληαη ζην HDFS. Πξνβνιή αξρείσλ. Η εληνιή απηή κπνξεί λα ρξεζηκνπνηεζεί γηα λα έρεη θαλείο πξόζβαζε ζην πεξηερόκελν ελόο αξρείνπ πνπ βξίζθεηαη κέζα ζην HDFS. Έρεη ίδηα ιεηηνπξγία κε ηελ εληνιή cat ησλ Unix. Γηαγξαθήο ελόο θαηάινγνπ από ην HDFS. Η ζπγθεθξηκέλε εληνιή δηαγξάθεη ηνλ θαηάινγν [directory] από ην HDFS είηε είλαη άδεηνο είηε όρη. Πίνακας 5. Βαζικές ενηολές τρήζης Hadoop Πιήξεο νδεγόο εληνιώλ ηνπ Hadoop βξίζθεηαη ζην Παξάξηεκα Β. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 16
ΠΧ ΝΑ ΓΡΑΦΔΣΔ ΔΝΑ ΠΡΟΓΡΑΜΜΑ HADOOP Αλ θαη ην Hadoop είλαη γξακκέλν ζε Java, ηα πξνγξάκκαηα ηα νπνία ηξέρνπκε ζε απηό δελ πξέπεη θαηά αλάγθε λα είλαη θαη απηά γξακκέλα ζε Java. Μηα εθαξκνγή Hadoop κπνξεί λα είλαη γξακκέλε εθηόο από Java ζε γιώζζεο όπσο Python ή C++ (από ηελ έθδνζε 0.14.1 θαη κεηά). ην παξάδεηγκα πνπ ζα πεξηγξάςσ πην θάησ ζα εμεγήζσ πώο λα γξάςνπκε ην δηθό καο πξόγξακκα Word Count, ζε γιώζζα Python, ην νπνίν θάλεη ρξήζε ηνπ HadoopStreaming API, γηα λα καο επηηξέςεη λα πεξλνύκε δεδνκέλα κεηαμύ ηνπ mapper θαη ηνπ reducer θάλνληαο ρξήζε ηνπ STDIN (standard input) θαη STDOUT (standard output). Πξώηα πξέπεη λα πινπνηήζνπκε ηελ κέζνδν map, ε νπνία ζα κεηξά ηηο εκθαλίζεηο ηεο θάζε ιέμεο ζην ζύλνιν εηζόδνπ. Η map, ε νπνία ζα θπιαρζεί ζε μερσξηζηό αξρείν (π.ρ map.py), ζα γξάθεη ηα απνηειέζκαηα ηεο ζην STDOUT. map.py #!/usr/bin/env python import sys # input comes from STDIN (standard input) for line in sys.stdin: # remove leading and trailing whitespace line = line.strip() # split the line into words words = line.split() # increase counters for word in words: # write the results to STDOUT (standard output); # what we output here will be the input for the # Reduce step, i.e. the input for reducer.py # tab-delimited; the trivial word count is 1 print '%s\t%s' % (word, 1) Πίνακας 6. Κώδικας ηης ζσνάρηηζης map για ηο παράδειγμα WordCount ζε Python ηελ ζπλέρεηα ζα πινπνηήζνπκε ηε κέζνδν reduce, ε νπνία ζα αζξνίδεη ηελ θάζε εκθάληζε ηεο θάζε ιέμεο θαη ζα παξνπζηάδεη ηα ηειηθά απνηειέζκαηα. Η reduce, ε νπνία ζα θπιαρζεί ζε μερσξηζηό αξρείν (π.ρ reduce.py), ζα παίξλεη ηελ είζνδν ηεο από ην STDIN. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 17
reduce.py #!/usr/bin/env python from operator import itemgetter import sys # maps words to their counts word2count = { # input comes from STDIN for line in sys.stdin: # remove leading and trailing whitespace line = line.strip() # parse the input we got from mapper.py word, count = line.split('\t', 1) # convert count (currently a string) to int try: count = int(count) word2count[word] = word2count.get(word, 0) + count except ValueError: # count was not a number, so silently # ignore/discard this line pass # sort the words lexigraphically; # this step is NOT required, we just do it so that our # final output will look more like the official Hadoop # word count examples sorted_word2count = sorted(word2count.items(), key=itemgetter(0)) # write the results to STDOUT (standard output) for word, count in sorted_word2count: print '%s\t%s'% (word, count) Πίνακας 7. Κώδικας ηης ζσνάρηηζης reduce για ηο παράδειγμα WordCount ζε Python Αθνύ απνζεθεύζνπκε ηα αξρεία map.py θαη reduce.py ζηνλ θαηάινγν πνπ έρνπκε εγθαηαζηήζεη ην Hadoop, κπνξνύκε λα δνθηκάζνπκε ην πξόγξακκα καο κε ηελ εληνιή bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar mapper mapper.py - reducer reducer.py -input [input directory] -output [output directory] Πιήξεο νδεγόο γηα ην Hadoop Streaming API βξίζθεηαη ζην Παξάξηεκα Γ. ΠΧ ΝΑ ΣΡΔΞΔΣΔ ΔΝΑ ΠΡΟΓΡΑΜΜΑ HADOOP Γηα λα ηξέμεηε έλα πξόγξακκα Hadoop πξέπεη πξώηα λα εγθαηαζηήζεηε κηα έθδνζε ηνπ Hadoop ζε έλα θάθειν ηεο επηινγήο ζαο. Δπεηδή όια ηα δεδνκέλα εηζόδνπ πξέπεη λα είλαη ζην HDFS πξέπεη λα ηα αληηγξάςεηε από ην ηνπηθό ζύζηεκα αξρείσλ ηνπ ιεηηνπξγηθνύ ζαο. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 18
Πξώηα πξέπεη λα μεθηλήζνπκε ην Hadoop ηξέρνληαο, από ηνλ θάθειν πνπ ην εγθαηαζηήζακε, ηελ εληνιή: bin/start-all.sh Απηή ε εληνιή ζα μεθηλήζεη ηα Namenode, Datanode, Jobtracker θαη Tasktracker. Με ηελ εληνιή: bin/hadoop dfs -copyfromlocal [source dir] [destination dir] αληηγξάθεηε ηα δεδνκέλα εηζόδνπ ζην HDFS. Γηα λα εθηειέζεηε ην πξόγξακκα ηξέμεηε ηελ εληνιή: bin/hadoop jar [program] [input] [output] Δπηπιένλ παξάκεηξνη γηα ηελ ζπγθεθξηκέλε εθηέιεζε κπνξνύλ λα ηνπνζεηεζνύλ πξηλ από ην όλνκα ηνπ πξνγξάκκαηνο (π.ρ. bin/hadoop jar -Dmapred.task.timeout=0 [program] [input] [output] ) Γηα λα κεηαθέξεηε ηα απνηειέζκαηα από ην HDFS ζην ηνπηθό ζύζηεκα αξρείσλ ηνπ ιεηηνπξγηθνύ ζαο εθηειείηε ηελ εληνιή: bin/hadoop dfs copytolocal [source dir] [destination dir] Σα απνηειέζκαηα κπνξνύλ λα παξνπζηαζηνύλ ρσξίο λα αληηγξαθνύλ ζην ηνπηθό ζύζηεκα αξρείσλ κε ηελ εληνιή: bin/hadoop dfs cat [dir]/* Ανδρέας Παπαδόποσλος ΑΕΜ: 600 19
CO-CLUSTERING ΔΓΓΡΑΦΧΝ CO-CLUSTERING ΔΓΓΡΑΦΧΝ Γηα ην co-clustering εγγξάθσλ ε ζπιινγή αλαπαξηζηάηαη ζηελ κνξθή πίλαθα D ηνπ νπνίνπ νη γξακκέο νξίδνπλ ηηο ιέμεηο θαη νη ζηήιεο ηα έγγξαθα. Σν ζηνηρείν D ij δειώλεη πόζεο θνξέο ε ιέμε i εκθαλίδεηαη ζην έγγξαθν j. ηελ ζπλέρεηα εθαξκόδεηαη θάπνηνο αιγόξηζκνο γηα λα βξεζνύλ νη νκάδεο εγγξάθσλ πνπ πεξηέρνπλ ηηο ίδηεο νκάδεο ιέμεσλ. ΔΙΡΙΑΚΟ ΑΛΓΟΡΙΘΜΟ CO-CLUSTERING ΔΓΓΡΑΦΧΝ ΑΡΥΙΚΟΠΟΙΗΗ ΤΠΟΛΟΓΙΜΟ ΠΙΝΑΚΑ ΓΔΙΣΝΙΑΗ ην ζηάδην ηεο αξρηθνπνίεζεο ηα έγξαθα αλαπαξίζηαληαη κε δύν πίλαθεο. Σν πίλαθα D θαη ηνλ αλάζηξνθν ηνπ. Ο ςεπδνθώδηθαο γηα ηνλ ππνινγηζκό ηνπ πίλαθα D είλαη: For each word w in the collection of documents For each document d in the collection Count occurrence of w in d Print w [occurrences] ΑΛΓΟΡΙΘΜΟ Ο ςεπδνθώδηθαο γηα ηνλ ζεηξηαθό αιγόξηζκν co-clustering εγγξάθσλ είλαη ν εμήο: 1. Given a partition, calculate the prototype of each row cluster. 2. Assign each row x to its nearest cluster. 3. Update the probabilities based on the new row clusters and then compute new column cluster prototype. 5. Assign each column y to its nearest cluster. 6. Update the probabilities based on the new column clusters and then compute new row cluster prototype. 8. If converge, stop. Otherwise go to Step 2. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 20
CO-CLUSTERING ΔΓΓΡΑΦΧΝ ΜΔ MAP REDUCE ΚΑΙ HADOOP ΑΛΓΟΡΙΘΜΟ CO-CLUSTERING ΔΓΓΡΑΦΧΝ ΜΔ MAP REDUCE ΑΡΥΙΚΟΠΙΗΗ ΤΠΟΛΟΓΙΜΟ ΠΙΝΑΚΑ ΓΔΙΣΝΙΑΗ ην ζηάδην ηεο αξρηθνπνίεζεο ππνινγίδνπκε ηνλ πίλαθα D θαη ηνλ αλάζηξνθν ηνπ. Ο πίλαθαο D πεξηέρεη κία γξακκή γηα θάζε ιέμε (w) πνπ εκθαλίδεηαη ζηε ζπιινγή εγγξάθσλ θαη κία ζηήιε γηα θάζε έγγξαθν (d) ηεο ζπιινγήο. Σν ζηνηρείν ζηελ ζέζε D i,j αληηζηνηρεί ζην πόζεο θνξέο εκθαλίδεηαη ε ιέμε i ζην έγγξαθν j. Η αξρηθνπνίεζε, δειαδή ν ππνινγηζκόο ηνπ πίλαθα D θαζώο θαη ηνπ αληίζηξνθνπ ηνπ, κπνξεί λα γίλεη κε ρξήζε ηνπ κεραληζκνύ Map Reduce. Παξαθάησ παξαηίζεηαη ν ςεπδνθώδηθαο γηα ηηο ζπλαξηήζεηο map θαη reduce γηα ηνλ ππνινγηζκό ηνπ πίλαθα D πνπ παίξλεη ζαλ είζνδν ηελ ζπιινγή εγγξάθσλ πνπ ζέινπκε. Map Input: Any document For each word w in input EmitIntermediate( w, 1-filename) Reduce Output: For each input output a vector of occurrences in documents for each input key Sum values per filename output word_id [occurrences] Πίνακας 8. Φεσδοκώδικας για σπολογιζμού ηοσ πίνακα γειηνίαζης με Map Reduce Η ζπλάξηεζε map πξνζπειάδεη όια ηα αξρεία ζηελ ζπιινγή θαη γηα θάζε ιέμε δίλεη έμνδν ην δεύγνο <ιέμε, 1-όλνκα αξρείνπ>. Η ηηκή 1 δίλεηαη ζηελ έμνδν νύησο ώζηε λα είλαη δπλαηή ε ρξήζε κηα θιάζεο ηύπνπ combiner γηα κείσζε ηνπ όγθνπ δεδνκέλσλ πνπ ζα ζηαινύλ πάλσ από ην δίθηπν. Κάζε reducer παίξλεη όια ηα δεύγε <ιέμε, εκθαλίζεηο αξρείν> γηα κηα ιέμε θαη έρνληαο κηα αληηζηνίρηζε γηα ηα αξρεία ζε αξηζκνύο δίλεη ζηελ έμνδν ην δεύγνο < αξηζκόο πνπ αληηζηνηρεί ζηελ ιέμε(θιεηδί) - έλα αξαηό δηάλπζκα κε ηηο εκθαλίζεηο ηεο ιέμεο ζηα έγγξαθα>. Η ρξήζε αξαηώλ δηαλπζκάησλ κεηώλεη ζεκαληηθά ηνλ όγθν δεδνκέλσλ ζηελ έμνδν θαζώο κηα ιέμε κπνξεί λα εκθαλίδεηαη κόλν ζε πνιύ ιίγα αξρεία. Σα έγγξαθα θαζώο θαη νη ιέμεηο αληηζηνηρίδνληαη ζε αθέξαηνπο αξηζκνύο. Έηζη δελ ρξεηάδεηαη λα κεηαθέξνπκε νιόθιεξε ηελ ιέμε ή νιόθιεξν ην όλνκα ελόο εγγξάθνπ αιιά έλαλ αθέξαην αξηζκό. Γηα ηνλ ππνινγηζκό ηνπ αληίζηξνθνπ πίλαθα D T κπνξνύκε θαη πάιη λα ρξεζηκνπνηήζνπκε ηνλ κεραληζκό Map Reduce. Μπνξνύκε λα αληηζηξέςνπκε ηνλ πην πάλσ πίλαθα ρσξίο λα είλαη απαξαίηεηε ε γλώζε νπνηαζδήπνηε πιεξνθνξίαο γηα ηελ ζπιινγή εγγξάθσλ πνπ ζέινπκε λα νκαδνπνηήζνπκε. Ο πην θάησ ςεπδνθώδηθαο παίξλεη ζαλ είζνδν κόλν ηνλ πίλαθα D πνπ ζα αληηζηξέςνπκε. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 21
Map Input: D for each record r in input for each element e in r EmitIntermediate( Index Of e, r Index-value) Reduce Output: D T for each input key output e [values ordered by r] Πίνακας 9. Φεσδοκώδικας σπολογιζμού ηοσ ανηίζηροθοσ πίνακα γειηνίαζης με Map Reduce Κάζε map παίξλεη ζαλ είζνδν έλα θνκκάηη ηνπ πίλαθα D. Γηα θάζε γξακκή ζην πίλαθα ε ζπλάξηεζε map δίλεη ζηελ έμνδν ην δεύγνο < ζηήιε ζηνηρείνπ, γξακκή ζηνηρείνπ ηηκή ζηνηρείνπ>. ηε ζπλέρεηα ν θάζε reducer ζα πάξεη όια ηα ζηνηρεία πνπ αλήθνπλ ζηελ ίδηα ζηήιε. Με βάζε ηελ γξακκή πνπ εκθαλίδεηαη ην ζηνηρείν ζην αξρηθό πίλαθα ηα ηαμηλνκεί θαη δίλεη έμνδν ην δεύγνο <ζηήιε αξαηό δηάλπζκα κε ηηκέο>. Με ρξήζε θαηάιιειεο δνκήο δελ είλαη απαξαίηεηε ε ηαμηλόκεζε κε βάζε ηνλ αξηζκό γξακκήο π.ρ. έλαο πίλαθαο πνπ ζηηο ζέζεηο r έρεη ηελ ηηκή πνπ πήξε ζαλ είζνδν θαη 0 αιινύ. Κάζε reducer παξάγεη ην αξαηό δηάλπζκα γηα θάζε γξακκή ηνπ αξρηθνύ πίλαθα θαη ηέινο όια καδί δίλνπλ ηνλ αληίζηξνθν ηνπ αξρηθνύ πίλαθα.p. Otherwise go to Step 2. ΑΛΓΟΡΙΘΜΟ Καηά ην πξώην ζηάδην εθηέιεζεο πξέπεη λα ππνινγηζηνύλ θάπνηα αξρηθά θέληξα ζηα νπνία ζα ηαμηλνκεζνύλ ηα δεδνκέλα. Ο αξηζκόο ησλ αξρηθώλ θέληξσλ επηιέγεηαη από ηνλ ρξήζηε αιιά ν ηειηθόο αξηζκόο νκάδσλ κπνξεί λα δηαθέξεη από απηόλ. Γηα ην ππνινγηζκό ησλ αξρηθώλ θέληξσλ ρξεζηκνπνηείηαη ν πην θάησ θώδηθαο. Map Input: records (r) (sparse vectors) of matrix D Init: Number of initial cluster centers (k) Cluster Centers - C = { If (C.size!=k) { For any center c in C If (r.cos_similarity(c) > 0.5) { Emit(c id,r) Return C += {(new id,r) Emit(r id,r) else { For any center c in C If (r.cos_similarity(c) > 0.5) { Emit(c id,r) Return; Emit(k,r) Reduce Output: Initial Cluster Centers Init: Number of initial cluster centers (k) Create a new ClusterDescriptor cd from values If (key == k) { Split cd using first element as center For any new ClusterDescriptor ncd { Output(key+i,ncd.centroid) Transpose ncd Output2(key+I,ncd.centroid) else { Output(key,cd.centroid) Transpose cd Ouptut2(key,cd.centroid) Πίνακας 10. Φεσδοκώδικας αρτικοποίηζης CoClustering με Map Reduce Ανδρέας Παπαδόποσλος ΑΕΜ: 600 22
Σν ζύλνιν C, πνπ πεξηέρεη ηα κέρξη ζηηγκήο θέληξα ησλ λέσλ clusters, είλαη θνηλό γηα όινπο ηνπο mappers. Κάζε mapper πξνζπειάδεη έλα κέξνο από ηνλ πίλαθα D θαη ηνπνζεηεί θάζε λέα εγγξαθή (αξαηό δηάλπζκα) ηνπ πίλαθα ζην cluster πνπ βξίζθεη όηη έρεη νκνηόηεηα (cosine similarity) κεγαιύηεξε από έλα θαηώθιη (0.5). Δάλ ην ζύλνιν C δελ είλαη κεγέζνπο k ηόηε ε εγγξαθή πξνζηίζεηαη ζην ζύλνιν πξηλ ηελ έμνδν. Δάλ ην ζύλνιν C είλαη κεγέζνπο k θαη κηα εγγξαθή δελ έρεη νκνηόηεηα κεγαιύηεξε από ην θαηώθιη (ζην θώδηθα 0.5) ηόηε ην θιεηδί είλαη ν αξηζκόο k. Σα ελδηάκεζα απνηειέζκαηα ηαμηλνκνύληαη κε βάζε ην θιεηδί (id cluster) θαη θαιείηε ε ζπλάξηεζε reduce. Όινη νη reducers γλσξίδνπλ από πξηλ ηνλ αξηζκό k πνπ έρεη θαζνξίζεη ν ρξήζηεο. Έηζη ν reducer πνπ παίξλεη ηα ελδηάκεζα απνηειέζκαηα κε θιεηδί = k γλσξίδεη όηη απηά δελ κπνξνύλ λα βξίζθνληαη ζην ίδην cluster γηαηί είλαη απηά πνπ δελ είραλ νκνηόηεηα κεγαιύηεξε από ην θαηώθιη κε θαλέλα ππάξρνλ cluster. Έηζη ηα ηνπνζεηεί ζε έλα λέν cluster ην νπνίν ζηελ ζπλέρεηα κνηξάδεη ζεσξώληαο σο θέληξν ην πξώην ζηνηρείν. Γηα θάζε λέν cluster πνπ ππνινγίδεη βξίζθεη ην θέληξν θαη ην δίλεη ζηελ έμνδν. Σα ππόινηπα θιεηδηά έρνπλ ζηνηρεία κε νκνηόηεηα κεγαιύηεξε από ην θαηώθιη ζε ζρέζε κε ην πξώην ζηνηρείν. Έηζη από απηά ππνινγίδεηαη ην πξαγκαηηθό θέληξν ηνπ cluster ην νπνίν δίδεηαη θαη ζηελ έμνδν. Δπηπιένλ γηα θάζε θέληξν πνπ δίδεηαη ζηελ έμνδν ππνινγίδεηαη θαη ην θέληξν γηα ην αληίζηνηρν cluster ησλ ζηειώλ. Ο πην πάλσ θώδηθαο παξνπζηάδεη έλα απιό θαη εύθνιν ηξόπν γηα ηνλ ππνινγηζκό ησλ αξρηθώλ θέληξσλ. Δάλ ν ρξήζηεο επηζπκεί κπνξεί λα νξίζεη απηόο ηα αξρηθά θέληξα (θαη λα απνθεπρζεί ν ππνινγηζκόο απηόο) ή λα ρξεζηκνπνηήζεη θάπνηα άιιε κέζνδν (π.ρ. canopy) γηα ηνλ ππνινγηζκό ηνπο. Αθνύ ππνινγηζηνύλ ηα αξρηθά θέληξα ησλ clusters ν αιγόξηζκνο εθηειείηαη επαλαιεπηηθά κέρξη λα ζπγθιίλεη. Γηα ηελ ζύγθιηζε κπνξνύκε λα νξίζνπκε ζαλ θξηηήξην όηαλ θαλέλα cluster δελ κεηαβάιιεηαη ή όηαλ ηα λέα clusters πνπ ππνινγίδνληαη απέρνπλ κηθξόηεξε απόζηαζε από έλα θαηώθιη. ε θάζε επαλάιεςε ν ςεπδνθώδηθαο είλαη ν εμήο: Map Input: records (r) (sparse vectors) of matrix D or D T Init: Centroids from previous iteration C For any center c in C If (r.similarity(c) > 0.5) { Emit(c id,r) Return; Emit(k,r) Reduce Output: New Cluster Centers Init: Number of cluster centers from previous iteration (k) Create a new ClusterDescriptor cd from values If (key == k) { Split cd using first element as center For any new ClusterDescriptor ncd { Output(key+i,ncd.centroid) Transpose ncd Output2(key+i,ncd.centroid) else { Output(key,cd.centroid) Transpose cd Ouptut2(key,cd.centroid) Πίνακας 11. Φεσδοκώδικας CoClustering με Map Reduce Ανδρέας Παπαδόποσλος ΑΕΜ: 600 23
ην θώδηθα απηό ζε θάζε επαλάιεςε ρξεηάδεηαη νη mappers λα πξνζπειάζνπλ όιν ηνλ πίλαθα D γηα ππνινγηζκό ησλ clusters γηα ηηο γξακκέο ηνπ πίλαθα ή όιν ηνλ πίλαθα D T γηα ππνινγηζκό ησλ clusters ησλ ζηειώλ ηνπ πίλαθα. Ο θώδηθαο ηεο ζπλάξηεζεο reduce είλαη ν ίδηνο κε ην ζηάδην ηεο αξρηθνπνίεζεο αιιά ν θώδηθαο ηεο ζπλάξηεζεο map δελ ππνινγίδεη μαλά ηα αξρηθά θέληξα αιιά παίξλεη ζαλ είζνδν ηα θέληξα από ηελ έμνδν ηεο πξνεγνύκελεο επαλάιεςεο. ΥΟΛΙΑ ΓΙΑ ΣΟΝ ΚΧΓΙΚΑ εκεηώλεηαη όηη ν ηειηθόο αξηζκόο ησλ clusters δελ είλαη ίδηνο κε ηνλ αξρηθό αξηζκό k πνπ θαζνξίδεηαη από ηνλ ρξήζηε θαη κπνξεί λα είλαη κεγαιύηεξνο ή κηθξόηεξνο. Ο ρξήζηεο κπνξεί λα επηιέμεη ην θαηώθιη γηα ηελ απόζηαζε ζηνηρείσλ από ην θέληξν ηνπ cluster, ηνλ αξηζκό ησλ αξρηθώλ θέληξσλ θαζώο θαη ην θξηηήξην ηεξκαηηζκνύ ηνπ αιγνξίζκνπ. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 24
ΑΠΟΣΔΛΔΜΑΣΑ ΠΔΙΡΑΜΑΣΧΝ ΠΛΑΣΦΟΡΜΔ ΔΚΣΔΛΔΗ Γηα ηελ εθηέιεζε ησλ πεηξακάησλ ρξεζηκνπνηήζεθε έλαο ππνινγηζηήο πνπ απνηειείηαη από 4 4-πύξελνπο επεμεξγαζηέο Quad-Core AMD Opteron(tm) Processor 8350 θαη 16Gb RAM. Η ρσξεηηθόηεηα ηνπ ζπζηήκαηνο HDFS είλαη 200GB. Σν ιεηηνπξγηθό ζύζηεκα είλαη SUSE Linux Enterprise Server 10 (x86_64) κε έθδνζε ππξήλα 2.6.16.21-0.8-smp. Σν Hadoop είρε ξπζκηζηεί ζε pseudo distributed mode θαη έθδνζε 0.18.3. Ο ππνινγηζηήο δηακνηξάδεηαη θαη κε άιινπο ρξήζηεο. Γηα ηελ εθηέιεζε ησλ πεηξακάησλ, κεηά από πξόρεηξεο κεηξήζεηο, ν αξηζκόο ησλ map tasks ηέζεθε ίζνο κε 16 θαη reduce tasks ηέζεθε ίζνο κε 12. ΑΠΟΣΔΛΔΜΑΣΑ ΠΔΙΡΑΜΑΣΧΝ Γηα ηα πεηξάκαηα ρξεζηκνπνηήζεθαλ ζπιινγέο αξρείσλ θεηκέλνπ (txt) από ηελ ηζηνζειίδα www.textfiles.com. ην πην θάησ πίλαθα θαίλνληαη ηα κεγέζε ησλ ζπιινγώλ θαζώο θαη νη δηαζηάζεηο ηνπ πίλαθα γεηηλίαζεο. εκεηώλεηαη όηη ν αξηζκόο ησλ ζηειώλ είλαη ν ίδηνο κε ηνλ αξηζκό ησλ εγγξάθσλ ζηελ θάζε ζπιινγή. Μέγεζνο (Megabytes) Γξακκέο ηήιεο Με κεδεληθά ζηνηρεία πιινγή 1 20.2 153078 46 262243 πιινγή 2 43.8 152213 43 468476 πιινγή 3 74.4 152213 68 839463 πιινγή 4 156.7 152213 156 1678926 Ανδρέας Παπαδόποσλος ΑΕΜ: 600 25
ΑΠΟΣΔΛΔΜΑΣΑ ΑΠΟ ΤΛΛΟΓΗ 1 350 Time - Iterations 300 250 200 150 100 50 K=50 K=100 K=150 K=200 0 1 2 3 4 5 6 7 8 9 10 11 12 Γιάγραμμα 1. Υρόνος εκηέλεζης ανά επανάληυη για Κ=50,100,150,200 Total Time (sec) Clusters 1800 1600 1400 1200 1000 K=50 K=100 K=150 60 50 40 30 53 49 49 47 K=50 K=100 800 600 400 200 K=200 Calculate D Transpose D 20 10 0 3 3 3 3 K=150 K=200 0 Row Clusters Column Clusters Γιάγραμμα 2. σνολικός Υρόνος Δκηέλεζης Γιάγραμμα 3. Αριθμός Cluster Ανδρέας Παπαδόποσλος ΑΕΜ: 600 26
ΑΠΟΣΔΛΔΜΑΣΑ ΑΠΟ ΤΛΛΟΓΗ 2 Time - Iterations 500 400 300 200 K=50 K=100 K=150 K=200 100 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Γιάγραμμα 4. Υρόνος εκηέλεζης ανά επανάληυη για Κ=50,100,150,200 Total Time (sec) Clusters 2200 100 2000 90 1800 80 1600 1400 K=50 K=100 70 60 K=50 1200 K=150 50 K=100 1000 K=200 40 K=150 800 600 Calculate D Transpose D 30 20 K=200 400 10 200 0 0 Row Clusters Column Clusters Γιάγραμμα 5. σνολικός Υρόνος Δκηέλεζης Γιάγραμμα 6. Αριθμός Cluster Ανδρέας Παπαδόποσλος ΑΕΜ: 600 27
ΑΠΟΣΔΛΔΜΑΣΑ ΑΠΟ ΤΛΛΟΓΗ 3 2500 Time - Iterations 2000 1500 1000 K=50 K=100 K=150 K=200 500 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Γιάγραμμα 7. Υρόνος εκηέλεζης ανά επανάληυη για Κ=50,100,150,200 Total Time (sec) Clusters 12000 140 130 120 130 115 10000 110 100 100 8000 6000 4000 K=50 K=100 K=150 K=200 Calculate D Transpose D 90 80 70 60 50 40 30 77 K=50 K=100 K=150 K=200 20 2000 0 275 198 10 0 Row Clusters 2 2 2 2 Column Clusters Γιάγραμμα 8. σνολικός Υρόνος Δκηέλεζης Γιάγραμμα 9. Αριθμός Cluster Ανδρέας Παπαδόποσλος ΑΕΜ: 600 28
ΑΠΟΣΔΛΔΜΑΣΑ ΑΠΟ ΤΛΛΟΓΗ 4 7000 Time - Iterations 6000 5000 4000 3000 2000 K=50 K=100 K=150 K=200 1000 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Γιάγραμμα 10. Υρόνος εκηέλεζης ανά επανάληυη για Κ=50,100,150,200 Total Time (sec) 180 173 Clusters 20000 160 140 138 15000 10000 K=50 K=100 K=150 K=200 120 100 80 70 98 K=50 K=100 K=150 Calculate D 60 K=200 5000 Transpose D 40 20 10 10 10 10 0 422 340 0 Row Clusters Column Clusters Γιάγραμμα 11. σνολικός Υρόνος Δκηέλεζης Γιάγραμμα 12. Αριθμός Cluster Ανδρέας Παπαδόποσλος ΑΕΜ: 600 29
ΤΓΚΡΙΗ ΑΠΟΣΔΛΔΜΑΣΧΝ 100% Init Time - Cluster Time 90% 80% 70% 60% 50% 1523 1633,25 10372,75 19416 Cluster Time 40% Transpose D Calculate D 30% 20% 10% 0% 65 96 196 195 198 275 340 422 Collection 1 (20.2MB) Collection 2 (38.8MB) Collection 3 (74.4MB) Collection 4 (156.7MB) Γιάγραμμα 13. Υρόνος αρτικοποίηζης φς προς ηον τρόνο ομαδοποίηζης Από ην δηάγξακκα θαίλεηαη όηη ν ρξόλνο γηα ηνλ ππνινγηζκό ηνπ πίλαθα D θαη ηνπ αληίζηξνθνπ ηνπ είλαη πνιύ κηθξόηεξνο από ηνλ ρξόλν πνπ ρξεηαδόκαζηε γηα λα νκαδνπνηήζνπκε ηελ ζπιινγή. ηηο δπν πξώηεο ζπιινγέο ην ζηάδην ηεο αξρηθνπνίεζεο ρξεηάζηεθε πεξίπνπ ην 15% ηνπ ζπλνιηθνύ ρξόλνπ ελώ ζηηο δύν ηειεπηαίεο, πνπ ήηαλ αξθεηά κεγαιύηεξεο, ρξεηάζηεθε κόιηο ην 5% ηνπ ζπλνιηθνύ ρξόλνπ. 25000 Total Time - K 20000 15000 10000 5000 0 50 100 150 200 Collection 1 (20.2MB) Collection 2 (38.8MB) Collection 3 (74.4MB) Collection 4 (156.7MB) Γιάγραμμα 14. σνολικός τρόνος φς προς Κ Ανδρέας Παπαδόποσλος ΑΕΜ: 600 30
Από ην πην πάλσ δηάγξακκα παξαηεξνύκε όηη ε επηινγή ηνπ αξρηθνύ αξηζκνύ cluster (k) κπνξεί λα επεξεάζεη αξθεηά ηνλ ρξόλν εθηέιεζεο, εηδηθά εάλ ε ζπιινγή καο είλαη ζρεηηθά κεγάιε. Row Clusters - K Column Clusters - K 200 180 160 140 120 100 80 60 40 20 0 Collection 1 (20.2MB) Collection 2 (38.8MB) Collection 3 (74.4MB) Collection 4 (156.7MB) 12 10 8 6 4 2 0 Collection 1 (20.2MB) Collection 2 (38.8MB) Collection 3 (74.4MB) Collection 4 (156.7MB) 50 100 150 200 50 100 150 200 Γιάγραμμα 15. Αριθμός cluster γραμμών φς προς Κ Γιάγραμμα 16. Αριθμός cluster ζηηλών φς προς Κ ην δηάγξακκα απηό βιέπνπκε όηη ν αξηζκόο ησλ cluster ζε θάπνηεο πεξηπηώζεηο αιιάδεη αλάινγα κε ηελ επηινγή ηνπ αξρηθνύ αξηζκνύ Κ. Γηα ηηο γξακκέο ν ηειηθόο αξηζκόο είλαη θνληά ζηνλ αξηζκό Κ αιιά γηα ηηο ζηήιεο ππάξρεη κεγάιε δηαθνξά. Απηό νθείιεηαη ζην γεγνλόο όηη ζε όιεο ηηο ζπιινγέο πνπ ρξεζηκνπνηήζεθαλ ν αξηζκόο ησλ γξακκώλ ήηαλ ηάμεο κεγαιύηεξνο από ηνλ αξηζκό ησλ ζηειώλ θαη ζε αξθεηέο πεξηπηώζεηο ν αξρηθόο αξηζκόο Κ ήηαλ κεγαιύηεξνο από ηνλ ζπλνιηθό αξηζκό ζηειώλ ζην πίλαθα D. Iterations - K Iterations - Size (Mb) 25 25 20 20 15 10 5 Collection 1 (20.2MB) Collection 2 (38.8MB) Collection 3 (74.4MB) Collection 4 (156.7MB) 15 10 5 50 100 150 200 0 50 100 150 200 0 0 20 40 60 80 100 120 140 160 Γιάγραμμα 17. Αριθμός επαναλήυεφν φς προς Κ Γιάγραμμα 18. Αριθμός επαναλήυεφν φς προς ηο μέγεθος Από ην αξηζηεξά δηάγξακκα παξαηεξνύκε όηη ν αξρηθόο αξηζκόο Κ επεξεάδεη θαη ηνλ αξηζκό επαλαιήςεσλ πνπ ζα ρξεηαζηνύλ γηα λα ζπγθιίλεη ν αιγόξηζκνο. ε αληίζεζε κε ην Κ, Ανδρέας Παπαδόποσλος ΑΕΜ: 600 31
από ην δεμηά δηάγξακκα, ην κέγεζνο ηεο ζπιινγήο δελ επεξεάδεη ηνλ αξηζκό ησλ επαλαιήςεσλ πνπ ζα ρξεηαζηνύλ. Φαίλεηαη όηη θαζώο ην κέγεζνο ηεο ζπιινγήο απμάλεη ππάξρεη κηα κηθξή κείσζε ζηνλ αξηζκό ησλ επαλαιήςεσλ πνπ ρξεηάδνληαη. ε θακία πεξίπησζε δελ ρξεηάζηεθαλ πεξηζζόηεξεο από 23 επαλαιήςεηο αλεμάξηεηα από ην κέγεζνο ηεο ζπιινγήο. Average Time (sec)/iteration - Size (Mb) 1600 1400 1200 1000 800 600 400 200 0 0 20 40 60 80 100 120 140 160 Average Time/Iteration Γιάγραμμα 19. Μέζος τρόνος ανά επανάληυη φς προς ηο μέγεθος ηης ζσλλογής Total Time (sec) - Size (Mb) 25000 20000 15000 10000 5000 50 100 150 200 0 0 20 40 60 80 100 120 140 160 Γιάγραμμα 20. σνολικός τρόνος εκηέλεζης φς προς ηο μέγεθος ηης ζσλλογής ανά Κ Από ηα δπν ηειεπηαία δηαγξάκκαηα επηβεβαηώλεηαη όηη ε επηινγή ηνπ αξρηθνύ αξηζκνύ Κ κπνξεί λα επεξεάζεη ειάρηζηα ηνλ ρξόλν εθηέιεζεο. Δπηπιένλ βιέπνπκε όηη ζηελ δεύηεξε ζπιινγή, παξόιν πνπ έρεη δηπιάζην κέγεζνο από ηελ πξώηε, ν ρξόλνο πνπ ρξεηάζηεθε είλαη κηθξόηεξνο. Απηό νθείιεηαη ζην γεγνλόο όηη ε δεύηεξε ζπιινγή πεξηείρε ιηγόηεξα αξρεία κεγαιύηεξνπ κεγέζνπο θαη πεξίπνπ 1000 ιέμεηο ιηγόηεξεο (ηα κε κεδεληθά ζηνηρεία ήηαλ πεξίπνπ δηπιάζηα ζηελ δεύηεξε ζπιινγή). Σν πην ζεκαληηθό πνπ βιέπνπκε ζε απηά ηα δηαγξάκκαηα είλαη ε γξακκηθή ζπκπεξηθνξά ηνπ πξνγξάκκαηνο. Ανδρέας Παπαδόποσλος ΑΕΜ: 600 32
ΤΜΠΔΡΑΜΑΣΑ ΚΑΙ ΜΔΛΛΟΝΣΙΚΗ ΔΡΓΑΙΑ ΤΜΠΔΡΑΜΑΣΑ Σα πην πάλσ πεηξάκαηα θξίλνληαη ηθαλνπνηεηηθά γηα λα θαηαιήμνπκε ζε θάπνηα ζπκπεξάζκαηα όζν αθνξά ηνλ ρξόλν εθηέιεζεο, ην κέγεζνο ηεο ζπιινγήο, ηνλ αξηζκό ησλ cluster θαη ηνλ αξρηθό αξηζκό θέληξσλ (Κ) πνπ επηιέγεηαη από ηνλ ρξήζηε. Όπσο αλαθέξζεθε θαη ζην πξνεγνύκελν θεθάιαην, από ηα απνηειέζκαηα ησλ πεηξακάησλ κπνξνύκε λα ζπκπεξάλνπκε ηα εμήο: - Ο αξηζκόο ησλ επαλαιήςεσλ δελ είλαη γλσζηόο εθ ησλ πξνηέξσλ θαη εμαξηάηαη από ηελ επηινγή, θαζώο θαη ηνλ αξηζκό, ησλ αξρηθώλ θέληξσλ. - Ο αξηζκόο ησλ επαλαιήςεσλ δελ είλαη κεγάινο (πεξίπνπ 15) θαη δελ επεξεάδεηαη από ην κέγεζνο ησλ δεδνκέλσλ. - Ο ηειηθόο αξηζκόο ησλ clusters εμαξηάηαη από ηελ επηινγή, θαζώο θαη ηνλ αξηζκό, ησλ αξρηθώλ θέληξσλ. - Ο ρξόλνο αξρηθνπνίεζεο (ππνινγηζκνύ ηνπ πίλαθα D θαη ηνπ αληίζηξνθνπ ηνπ) είλαη πνιύ κηθξόηεξνο από ηνλ ρξόλν πνπ ρξεηάδεηαη γηα ηελ νκαδνπνίεζε θαηαιακβάλνληαο, θαηά κέζν όξν, ην 10% ηνπ ζπλνιηθνύ ρξόλνπ. - Ο ρξόλνο εθηέιεζεο επεξεάδεηαη πνιύ από ηηο δηαζηάζεηο ηνπ πίλαθα D. Όζν πην ηεηξαγσληθόο είλαη ηόζν ιηγόηεξνο ρξόλνο ρξεηάδεηαη αλεμάξηεηα από ηνλ αξηζκό ησλ κε κεδεληθώλ ζηνηρείσλ. - Ο αιγόξηζκνο θιηκαθώλεη γξακκηθά σο πξνο ην κέγεζνο ησλ δεδνκέλσλ (ζεκεηώλεηαη όηη ην Hadoop ήηαλ ζε pseudo-distributed mode). Δπηπιένλ από ηηο εθηειέζεηο παξαηεξήζεθε όηη ν ρξόλνο πνπ ρξεηάδνληαη νη reducers είλαη αξθεηά κεγαιύηεξνο από ηνλ ρξόλν πνπ ρξεηάδνληαη νη mappers. Δληνύηνηο πεξηζζόηεξνη reducers δελ έδηδαλ κηθξόηεξν ρξόλν εθηέιεζεο θαζώο ν ζπλνιηθόο ρξόλνο ήηαλ πάληα ίζνο κε ην ρξόλν πνπ ρξεηαδόηαλ ν πην αξγόο από απηνύο. ΜΔΛΛΟΝΣΙΚΗ ΔΡΓΑΙΑ Δίλαη βέβαην όηη ε βειηηζηνπνίεζε θαη αλάπηπμε ησλ πην πάλσ δελ απνξξίπηεηαη. Παξόιν πνπ ν πην πάλσ θώδηθαο είλαη πιήξεο, θαη δίδεη ζσζηά απνηειέζκαηα, ππάξρνπλ δπλαηόηεηεο ηνπ Hadoop πνπ δελ έρνπλ ρξεζηκνπνηεζεί νύησο ώζηε λα ειέρζε εάλ κε απηέο ηηο δπλαηόηεηεο κπνξνύκε λα επηηύρνπκε αθόκα θαιύηεξνπο ρξόλνπο εθηέιεζεο. Γηα παξάδεηγκα κπνξνύκε λα θάλνπκε ρξήζε θάπνηνπ θώδηθα ζπκπίεζεο ησλ δεδνκέλσλ νύησο ώζηε λα έρνπκε ρακειόηεξε ρξήζε πόξσλ ηνπ δηθηύνπ ή λα ρξεζηκνπνηήζνπκε θάπνηεο έηνηκεο βηβιηνζήθεο Ανδρέας Παπαδόποσλος ΑΕΜ: 600 33
(π.ρ.gnu Trove), πνπ ζα έρνπλ πην απνδνηηθό θώδηθα, γηα ηελ δηαρείξηζε ησλ αξαηώλ δηαλπζκάησλ. Μηα επηπιένλ επέθηαζε ζα ήηαλ λα κπνξνύζακε λα αλαλεώζνπκε ηα απνηειέζκαηα ρσξίο λα ρξεηάδεηαη ππνινγηζκόο από ηελ αξρή όηαλ πξνζηεζεί ή αθαηξεζεί θάπνην έγγξαθν ζηελ ζπιινγή. Μπνξνύκε επίζεο λα ρξεζηκνπνηήζνπκε ηα πην πάλσ νύησο ώζηε λα βξνύκε ίδηα έγξαθα ζε ζπιινγέο ζπγθξίλνληαο κεηαμύ ηνπο ηα έγγξαθα πνπ είλαη ζηα ίδηα clusters (θαζώο δύν ίδηα αξρεία ζα βξίζθνληαη ζηελ ίδηα νκάδα). Ανδρέας Παπαδόποσλος ΑΕΜ: 600 34
ΒΙΒΛΙΟΓΡΑΦΙΑ [ 1 ] Welcome to Apache Hadoop!, http://hadoop.apache.org [ 2 ] Wikipedia, the free encyclopedia, http://en.wikipedia.org [ 3 ] Dean, Jeffrey, Sanjay Ghemawat, MapReduce: Simplified Data Processing on Large Clusters, Google Inc, 2004 [ 4 ] Spiros Papadimitriou, Jimeng Sun, DisCo: Distributed Co-clustering with Map- Reduce, ICDM 2008 [ 5 ] Inderjit S. Dhillon, Subramanyam Mallela Dharmendra S. Modha, Information- Theoretic Co-clustering, KDD, 2003 [ 6 ] Dilpesh Shrestha, Text mining with Lucene and Hadoop: Document clustering with feature extraction, Wakhok University, 2009 [ 7 ] Kenneth Heafield, Hadoop Design and k-means Clustering, Google Inc, January 2008 [ 8 ] Weizhong Zhao, Huifang Ma, Qing He, Parallel K-Means Clustering Based on MapReduce, 2009 [ 9 ] Michael Steinbach, George Karypis, Vipin Kumar, A Comparison of Document Clustering Techniques, University of Minnesota, 1999 [ 10 ] Jian Wan, Wenming Yu, Xianghua Xu, Design and Implement of Distributed Document Clustering Based on MapReduce, Grid and Services Computing Lab School of Computer Science and Technology, Hangzhou Dianzi University, December 2009 [ 11 ] Yifeng Liu, Lucio Gutierrez, Amirhossein Firouzmanesh, Xiaoyu Shi, Xiaodi Ke, Md Solimul Chowdhury, Parallel Document Clustering with Hadoop on Amazon Elastic Computing Cloud, CMPUT 681 Project, December 2009 [ 12 ] Jimmy Lin, Chris Dyer, Data-Intensive Text Processing with MapReduce, University of Maryland, 2010 [ 13 ] Jason Venner, Pro Hadoop, Apress June 2009 [ 14 ] Tom White, Hadoop: The definitive guide MapReduce for the cloud, O'Reilly Media, May 2009 Ανδρέας Παπαδόποσλος ΑΕΜ: 600 35
ΠΑΡΑΡΣΗΜΑ Α ΚΧΓΙΚΑ ΠΑΡΑΓΔΙΓΜΑΣΧΝ ΚΧΓΙΚΑ ΠΑΡΑΓΔΙΓΜΑΣΟ 1 WORD COUNT import java.io.ioexception; import java.util.*; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.*; import org.apache.hadoop.mapred.*; public class WordCount { public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(longwritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { String line = value.tostring(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasmoretokens()) { word.set(tokenizer.nexttoken()); output.collect(word, one); public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { int sum = 0; while (values.hasnext()) { sum += values.next().get(); output.collect(key, new IntWritable(sum)); public static void main(string[] args) throws Exception { JobConf conf = new JobConf(WordCount.class); conf.setjobname("wordcount"); conf.setoutputkeyclass(text.class); conf.setoutputvalueclass(intwritable.class); conf.setmapperclass(map.class); Ανδρέας Παπαδόποσλος ΑΕΜ: 600 36
conf.setcombinerclass(reduce.class); conf.setreducerclass(reduce.class); conf.setinputformat(textinputformat.class); conf.setoutputformat(textoutputformat.class); FileInputFormat.setInputPaths(conf, new Path("input")); FileOutputFormat.setOutputPath(conf, new Path("output")); try { JobClient.runJob(conf); catch (Exception e) { e.printstacktrace(); ΚΧΓΙΚΑ ΠΑΡΑΓΔΙΓΜΑΣΟ 2 INVERTED INDEX import java.io.ioexception; import java.util.iterator; import java.util.stringtokenizer; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.longwritable; import org.apache.hadoop.io.text; import org.apache.hadoop.mapred.fileinputformat; import org.apache.hadoop.mapred.fileoutputformat; import org.apache.hadoop.mapred.filesplit; import org.apache.hadoop.mapred.jobclient; import org.apache.hadoop.mapred.jobconf; import org.apache.hadoop.mapred.mapreducebase; import org.apache.hadoop.mapred.mapper; import org.apache.hadoop.mapred.outputcollector; import org.apache.hadoop.mapred.reducer; import org.apache.hadoop.mapred.reporter; public class InvertedIndex { public static class InvertedIndexMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> { private final static Text word = new Text(); private final static Text location = new Text(); public void map(longwritable key, Text val, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { FileSplit filesplit = (FileSplit)reporter.getInputSplit(); String filename = filesplit.getpath().getname(); location.set(filename); Ανδρέας Παπαδόποσλος ΑΕΜ: 600 37
String line = val.tostring(); StringTokenizer itr = new StringTokenizer(line.toLowerCase()); while (itr.hasmoretokens()) { word.set(itr.nexttoken()); output.collect(word, location); public static class InvertedIndexReducer extends MapReduceBase implements Reducer<Text, Text, Text, Text> { public void reduce(text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { boolean first = true; StringBuilder toreturn = new StringBuilder(); while (values.hasnext()){ if (!first) toreturn.append(", "); first=false; toreturn.append(values.next().tostring()); output.collect(key, new Text(toReturn.toString())); public static void main(string[] args) { JobConf conf = new JobConf(InvertedIndex.class); conf.setjobname("invertedindex"); conf.setoutputkeyclass(text.class); conf.setoutputvalueclass(text.class); FileInputFormat.addInputPath(conf, new Path("input")); FileOutputFormat.setOutputPath(conf, new Path("output")); conf.setmapperclass(invertedindexmapper.class); conf.setreducerclass(invertedindexreducer.class); try { JobClient.runJob(conf); catch (Exception e) { e.printstacktrace(); Ανδρέας Παπαδόποσλος ΑΕΜ: 600 38