ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΖΩΓΡΑΦΟΥ 157 73, ΑΘΗΝΑ ΕΒΓ - ΙΠΛ-2003-1 20 Ιανουαρίου 2003 Σύγκριση Αλγορίθµων για Λειτουργίες Επαυξητικής Εξαγωγής εδοµένων από RDBMS και Υλοποίηση Αλγορίθµων Μετασχηµατισµών εδοµένων Ζήσιµος Αντώνης ΕΠΙΒΛΕΠΩΝ ΚΑΘΗΓΗΤΗΣ: Τίµος Σελλής ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΕΡΓΑΣΤΗΡΙΟ ΣΥΣΤΗΜΑΤΩΝ ΒΑΣΕΩΝ ΓΝΩΣΕΩΝ ΚΑΙ Ε ΟΜΕΝΩΝ
2
Περίληψη ιπλωµατικής Εργασίας Η παρούσα διπλωµατική εργασία εντάσσεται στο γενικότερο γνωστικό αντικείµενο των αποθηκών δεδοµένων. Η ολοένα και µεγαλύτερη αυτοµατοποίηση των υπηρεσιών των µεγάλων οργανισµών, έχει φέρει τα συστήµατα διαχείρισης δοσοληψιών ολοένα και πιο κοντά σε κάθε πτυχή της καθηµερινής ζωής των ανθρώπων στις αναπτυγµένες χώρες. Συνέπεια του φαινοµένου είναι η διατήρηση ενός τεράστιου όγκου δεδοµένων, από τον οποίο µπορεί κανείς να αντλήσει πολύτιµες πληροφορίες κάνοντας την ανάλογη επεξεργασία. Η επεξεργασία αυτού του όγκου αποτελεί και τον σκοπό των αποθηκών δεδοµένων. Βασικός όµως κανόνας, ώστε να έχουµε αξιόπιστα και σωστά συµπεράσµατα, είναι να έχουµε και ενηµερωµένα και ορθά στοιχεία στην αποθήκη µας. Η ενηµέρωση των δεδοµένων στην αποθήκη ονοµάζεται γενικά ETL. Το αγγλικό ακρωνύµιο ETL, που έχει επικρατήσει, αναλύεται στις λέξεις εξαγωγή, µετασχηµατισµός και ενηµέρωση, τις πράξεις δηλαδή που πρέπει να υποστούν τα δεδοµένα, ώστε να έχουµε ποιοτικά και σωστά στοιχεία σε µια αποθήκη δεδοµένων. Στο σηµείο αυτό εντοπίζεται και το αντικείµενο της διπλωµατικής αυτής. Μετά την απαραίτητη έρευνα και σύµφωνα µε τα στοιχεία που υπάρχουν στην διεθνή βιβλιογραφία, παρουσιάζει αναλυτικά τους πιθανούς ETL αλγορίθµους. ηλαδή, τις µεθόδους εξαγωγής των κατάλληλων στοιχείων από ετερογενείς πηγές πληροφοριών, τους µετασχηµατισµούς που πρέπει να υποστούν τα δεδοµένα, ώστε να ταιριάξουν µε το διαφορετικό µοντέλο δεδοµένων της αποθήκης και να καθαριστούν, ώστε να έχουµε πιο αξιόπιστα αποτελέσµατα, αλλά και κάποιες βασικές αρχές, ώστε να γίνει µια µαζική και γρήγορη µεταφορά των επεξεργασµένων δεδοµένων στην αποθήκη. Η εξαγωγή των δεδοµένων θα πρέπει να είναι επαυξητική, ώστε να µην µετακινείται κάθε φορά ολόκληρος ο όγκος της πηγής πληροφοριών στην αποθήκη δεδοµένων. Οι επικρατέστερες τεχνικές είναι τρεις. Οι δύο πρώτες µπορούν να χρησιµοποιηθούν µόνο όταν οι πηγές είναι σύγχρονα συστήµατα διαχείρισης δοσοληψιών (OLTP), οπότε και παρέχουν µηχανισµούς ηµερολογίου (logging) και triggers. Το ηµερολόγιο κρατείται για λόγους ανάνηψης από λάθη υλικού και σε αυτό καταγράφονται όλες οι δοσοληψίες, οπότε και µπορούµε να αποσπάµε από αυτό και τα δεδοµένα που µεταβλήθηκαν στην βάση µετά από κάποια ηµεροµηνία. Οι triggers είναι συναρτήσεις στην βάση, που εκτελούνται πριν ή µετά την εκτέλεση µιας πράξης (INSERT/UPDATE/DELETE). Με τη βοήθειά τους µπορούµε να κρατάµε επιπλέον πίνακες, στους οποίους θα αποθηκεύονται µόνο οι αλλαγές κατά την διάρκεια ενός χρονικού διαστήµατος. Έτσι στο τέλος, εξάγοντας µόνο αυτούς του πίνακες θα έχουµε τις αλλαγές. Τέλος, υπάρχει και η, ανεξάρτητη από συστήµατα διαχείρισης δοσοληψιών, τεχνική των στιγµιότυπων. Παίρνουµε ένα στιγµιότυπο της βάσης στην αρχή και ένα στο τέλος του χρονικού διαστήµατος που επιθυµούµε, κάνουµε την σύγκριση και 3
βρίσκουµε τις αλλαγές. Η τελευταία προτιµήθηκε λόγω της ανεξαρτησίας της από συστήµατα διαχείρισης δοσοληψιών. Ακόµα και η πιο πρωτόγονη πηγή πληροφοριών θα έχει την δυνατότητα παραγωγής ενός αρχείου, στο οποίο θα περιέχεται όλη η πληροφορία που διαθέτει την δεδοµένη χρονική στιγµή. Για την τεχνική του στιγµιότυπου έχουν αναπτυχθεί δύο κύριες κατηγορίες, η τεχνική της συµπίεσης και η τεχνική του παραθύρου. Ο αλγόριθµος µε την τεχνική της συµπίεσης στηρίζεται στην ταξινόµηση των εγγραφών και στην σύγκριση τους µε βάση το πρωτεύον κλειδί και τα δεδοµένα τους. Στην αρχή έχουµε δύο στιγµιότυπα της βάσης µας. Ουσιαστικά πρόκειται για αρχεία που περιέχουν τους πίνακες της βάσης και τις εγγραφές τους. Για κάθε πίνακα που υπάρχει στα αρχεία αυτά πραγµατοποιούµε µια ταξινόµηση µε βάση το πρωτεύον του κλειδί. Έπειτα πηγαίνουµε και συγκρίνουµε εγγραφή προς εγγραφή. Λόγω της ταξινόµησης θα µπορούµε εύκολα να βρούµε τις αλλαγές στους πίνακες. Εάν βρούµε ένα κλειδί στον νεώτερο χρονικά πίνακα που δεν υπάρχει στον παλαιό σηµαίνει πως έγινε κάποια εισαγωγή εγγραφής, ενώ στην αντίθετη περίπτωση που το κλειδί υπάρχει µόνο στον παλαιό πίνακα, θα έγινε κάποια διαγραφή. Στην περίπτωση που βρίσκουµε δύο ίσα κλειδιά, τότε θα πρέπει να ελέγξουµε και τα υπόλοιπα δεδοµένα, ώστε να βρούµε εάν υπάρχει κάποια ανανέωση στα υπόλοιπα πεδία της εγγραφής. Ο αλγόριθµος αυτός είναι απλός και µπορεί να βελτιωθεί αρκετά. Μια πρώτη βελτίωση µπορεί να γίνει στην αρχική ταξινόµηση των εγγραφών, µε την εφαρµογή µιας γρήγορης µεθόδου µε ικανότητες ταξινόµησης εκτός µνήµης (external sorting), ώστε να µπορεί να αντεπεξέλθει και σε καταστάσεις όπου η φυσική µνήµη δεν είναι αρκετή. Μια δεύτερη βελτίωση που θα βοηθούσε είναι η µείωση του µεγέθους της επεξεργαζόµενης πληροφορίας, µε την χρησιµοποίηση κάποιας κωδικοποίησης. Στο στάδιο της σύγκρισης των εγγραφών δεν χρειαζόµαστε κάθε φορά όλα τα στοιχεία, αλλά µόνο τα πρωτεύων κλειδιά. Με µια προσεκτικότερη µατιά στον αλγόριθµο βλέπουµε πως κάθε στιγµή πρέπει να ξέρουµε και να συγκρίνουµε τα κλειδιά των εγγραφών και σε περίπτωση που είναι ίσα, να συγκρίνουµε και τα δεδοµένα τους. Εάν κωδικοποιήσουµε τα υπόλοιπα πεδία εκτός των κλειδιών σε µια συµπιεσµένη µορφή, µπορούµε να µειώσουµε το µέγεθος της φυσικής µνήµης που απαιτείται για την σύγκριση. Υπάρχουν δύο προσεγγίσεις. Στην πρώτη διατηρούµε το παλιό στιγµιότυπο σε συµπιεσµένη µορφή και το καινούργιο σε ασυµπίεστη. Κάνουµε την ταξινόµηση και συγκρίνουµε τα κλειδιά των εγγραφών, όπως εξηγήσαµε. Σε κάθε περίπτωση (INSERT/UPDATE/DELETE), δεν µας χρειάζονται τα δεδοµένα των υπόλοιπων πεδίων του παλιού στιγµιότυπου. Στην δεύτερη προσέγγιση, συµπιέζουµε και τα δύο στιγµιότυπα από την αρχή. Η αναζήτηση των δεδοµένων στα υπόλοιπα πεδία θα χρειαστεί µόνο στην περίπτωση που θα έχουµε κάποιο INSERT/UPDATE, αφού στο DELETE χρειαζόµαστε να αναφέρουµε µόνο το κλειδί. Με τον τρόπο αυτό κερδίζουµε σε χώρο στην φυσική µνήµη, µειώνοντας τον όγκο του νέου στιγµιότυπου που ταξινοµούµε, αλλά αυξάνουµε τις προσπελάσεις στον σκληρό δίσκο, που είναι ως επί το πλείστον πολύ πιο αργές σε σχέση µε 4
αυτές της φυσικής µνήµης. Λαµβάνοντας υπόψη ότι συνήθως οι αλλαγές είναι ένα µικρό ποσοστό του συνόλου των εγγραφών, τότε έχουµε πραγµατοποιήσει µια αρκετά καλή βελτιστοποίηση του αλγορίθµου. Η µέθοδος µε τον αλγόριθµο του παραθύρου βασίζεται στην βελτίωση από την άποψη των µειωµένων προσπελάσεων στον δίσκο, οι οποίες είναι και ιδιαίτερα χρονοβόρες. Οι διάφοροι αλγόριθµοι σύγκρισης στιγµιότυπων, εάν δεν εντοπίσουν όλες τις αλλαγές, εµφανίζουν useless DELETE-INSERT και INSERT-DELETE ζευγάρια. Τα πρώτα αποτελούν περίπτωση ίδιων πλειάδων και στα δύο στιγµιότυπα για τα οποία ο αλγόριθµος έβγαλε πρώτα ένα delete και µετά ένα INSERT και τα δεύτερα είναι ζευγάρια για τα οποία προκύπτουν INSERT ακολουθούµενα από DELETE. Και τα δύο εισάγουν περιττή πληροφορία στα δεδοµένα που θα εξάγουµε, αλλά ιδίως τα δεύτερα θα δηµιουργήσουν προβλήµατα ασφαλείας, καθώς ένα INSERT για κάτι που ήδη υπάρχει θα αγνοηθεί, ενώ το DELETE θα το διαγράψει. Για να γλιτώσουµε από τέτοιες καταστάσεις στέλνουµε πρώτα τα DELETE και µετά τα INSERT στην αποθήκη µας. Ο αλγόριθµος αυτός θεωρεί ότι δύο ίδιες πλειάδες στα δύο στιγµιότυπα θα βρίσκονται αν όχι στην ίδια ακριβώς θέση, τουλάχιστον σε κάποια θέση κοντά. Η µετατόπιση µπορεί να συµβεί από το σύστηµα διαχείρισης για καλύτερη ίσως εκµετάλλευση του αποθηκευτικού χώρου. Εποµένως, δεν είναι αναγκαίο για κάθε πλειάδα να ελέγξουµε ολόκληρο το άλλο στιγµιότυπο, αρκεί να κοιτάξουµε σε µια συγκεκριµένη περιοχή του, δηλαδή σε κάποιο παράθυρο. Οπότε, διαβάζουµε ένα κοµµάτι (input buffer) από κάθε στιγµιότυπο, τα συγκρίνουµε και διαγράφουµε τις όµοιες εγγραφές. Τις υπόλοιπες τις κρατάµε σε δύο ειδικές δοµές στην µνήµη (aging buffer), µια για κάθε αρχείο. Στην επόµενη σύγκριση θα συµπεριληφθούν και αυτές. Η διαδικασία αυτή συνεχίζεται µέχρι να επεξεργαστούµε όλες τις εγγραφές και των δύο στιγµιότυπων. Κατά την διαδικασία αυτή βρίσκουµε όλα τα UPDATE που ίσως υπάρχουν. Στο τέλος, όσες εγγραφές έχουν µείνει στις ειδικές δοµές της µνήµης θα είναι ή INSERT ή DELETE ανάλογα µε το στιγµιότυπο προέλευσης τους. Στην ουσία εκµεταλλευόµαστε την ιδιότητα του συστήµατος να µην µετακινεί δεδοµένα κατά τις ανακατατάξεις πολύ µακριά από την αρχική θέση τους και συγκεκριµένα εκτός διαφορετικής φυσικής υποµονάδας (block). Στην συνέχεια η διπλωµατική, µετά την θεωρητική περιγραφή διαδικασιών ETL, προσπαθεί να παρουσιάσει ένα σύνολο συναρτήσεων, ενοποιηµένο σε µια βιβλιοθήκη, που θα µπορεί να χρησιµοποιηθεί σαν ένας πυρήνας αλγορίθµων ETL. Σαν αποτέλεσµα, λοιπόν, έχουµε µια υλοποίηση της βιβλιοθήκης σε γλώσσα προγραµµατισµού C, χρησιµοποιώντας την πρότυπη βιβλιοθήκη της C (Standard C Library), οπότε και είναι συµβατή µε κάθε λειτουργικό σύστηµα που έχει τους ανάλογους µεταγλωττιστές και βιβλιοθήκες. Στην βιβλιοθήκη περιλαµβάνονται µέθοδοι επαυξητικής εξαγωγής δεδοµένων από συστήµατα διαχείρισης δοσοληψιών και µέθοδοι µετασχηµατισµού των δεδοµένων, οι οποίοι είναι απαραίτητοι, εάν θέλουµε να έχουµε ποιοτικά και σωστά δεδοµένα στην αποθήκη µας. Η συγκεκριµένη 5
υλοποίηση µας δίνει την ευκαιρία να διεξάγουµε µια σειρά πειραµάτων και µετρήσεων, ώστε να αποφανθούµε για την απόδοση των διαφορετικών αλγόριθµων επαυξητικής εξαγωγής που υλοποιήσαµε. Πιο συγκεκριµένα διαφοροποιήσαµε τις µετρήσεις σε 3 µέρη. Στο πρώτο µέρος µετρήσεων συγκρίναµε τα 4 είδη αλγορίθµων µε συµπίεση που υλοποιήσαµε. Στο δεύτερο µέρος συγκρίναµε τον αλγόριθµο µε παράθυρο για διάφορες τιµές των input και aging buffer του. Στο τρίτο µέρος πήραµε τους δύο καλύτερους από τα δύο προηγούµενα µέρη και κάναµε αναλυτικές µετρήσεις συγκρίνοντας τους τελικούς χρόνους και το ποσοστό επιτυχίας. Τα συµπεράσµατα που προέκυψαν είναι αρκετά ενδιαφέροντα. Στην περίπτωση που διαθέτουµε ισχυρό σύστηµα µε αφθονία φυσικής µνήµης σε σχέση µε τα δεδοµένα που έχουµε να επεξεργαστούµε, συστήνεται η χρησιµοποίηση αλγόριθµου µε συµπίεση. Οι δύο πιο γρήγοροι αλγόριθµοι δεν παρουσιάζουν µεγάλες διαφορές στην συµπεριφορά τους. ιαφοροποιούνται µόνο όταν φτάνει το σύστηµα στα όριά του, δηλαδή µε στιγµιότυπα που προσεγγίζουν την φυσική µνήµη σε µέγεθος. Στην περίπτωση που δεν διαθέτουµε αφθονία µνήµης σε σχέση µε τα στιγµιότυπα έχουµε να διαλέξουµε ανάµεσα σε δύο αλγορίθµους παραθύρου. Η τελική επιλογή θα προκύψει µετά από ανάλυση των στοιχείων µας και την εύρεση της µέγιστης µετατόπισης των εγγραφών από το ένα στιγµιότυπο στο άλλο. Έχουµε την επιλογή να διαλέξουµε µεταξύ ενός γρήγορου αλγόριθµου που βγάζει και λανθασµένα αποτελέσµατα, οπότε χρειάζεται και ένα επιπλέον καθαρισµό και ενός αργού αλγόριθµου που παράγει µόνο σωστά αποτελέσµατα. 6