HY555 Παράλληλα Συστήματα και Grids Χειμερινό εξάμηνο 2007 Άσκηση 3 Εξοικείωση με το EGEE GRID Environment Σκοπός της άσκησης αυτής είναι η εξοικείωση με ένα πραγματικό περιβάλλον Grids. Θα χρησιμοποιήσετε το LCG middleware για να μπορέσετε να τρέξετε δουλειές στο πανευρωπαϊκό Grid περιβάλλον του project «Enabling Grids for E-sciencE» (EGEE). Το EGEE διαθέτει ήδη εκατοντάδες επεξεργαστές, προσβάσιμους για εκτέλεση εφαρμογών αλλά για την άσκηση αυτή οι εφαρμογές σας θα τρέχουν σε ένα μικρότερο υποσύνολο του EGEE. 1. Πρώτα βήματα Η πρόσβαση στο ΕGEE μπορεί να γίνει μόνο μέσω ενός ειδικά εγκατεστημένου κόμβου που ονομάζεται User Interface (UI). Μέσα απο το UI μπορείτε να τρέξετε δουλειές, να δείτε την καταστασή τους και να πάρετε το αποτέλεσμα τους. Έχει ήδη στηθεί ένας κόμβος UI στον οποίο θα έχετε κοινή πρόσβαση, με το ίδιο δηλαδή account. Για να μην δημιουργηθεί σύγχυση δημιουργήστε ένα φάκελο με το login σας και σώστε ότι θέλετε μέσα στο φάκελο αυτό. Η διεύθυνση του UI είναι 139.91.90.229, to login είναι hy555-grid και το password είναι «HY%%%_GRID». Στο μηχάνημα αυτό μπορείτε να μπείτε μόνο μέσω ssh. Πριν αρχίσετε να τρέχετε δουλειές, πρέπει να δημιουργήσετε ενα proxy με την εντολή grid-proxy-init. Η εντολή αυτή για λόγους ασφαλείας σας ζητάει και την φράση με την οποία δημιουργήθηκε το certificate του μηχανήματος. Το password για το certificate είναι «hy555-grid». Με την εντολή αυτή σας επιτρέπετε να τρέξετε δουλειές για τις επόμενες 12 ώρες. Μετά το πέρας αυτού του χρονικού διαστήματος θα πρέπει να εκτελέσετε ξανά την εντολή grid-proxy-init. Δεν υπάρχει πρόβλημα αν γίνουν πολλαπλά ή ταυτόχρονα grid-proxy-init. 2. Βασικές εντολές Στην άσκηση αυτή θα εξοικειωθείτε με το πως λέμε στο Grid να εκτελέσει μια δουλειά, πώς βλέπουμε την κατάσταση της (αν τρέχει ή αν σταμάτησε) και πως παίρνουμε το αποτέλεσμα της εκτέλεσης πίσω στο UI. Α. Εκτέλεση μιας δουλειάς Μια δουλειά στα Grids περιγράφεται με ένα αρχείο γραμμένο σε JDL ( Job Description Language). Ένα παράδειγμα ενός JDL αρχείου το οποίο θα χρησιμοποιήσετε είναι το εξής: testjob.dl Executable = "testjob.sh"; StdOutput = "testjob.out"; StdError = "testjob.err"; InputSandbox = {"./testjob.sh"}; OutputSandbox = {"testjob.out","testjob.err"};
H γραμμή Executable λέει ποιό είναι το εκτελέσιμο που θα τρέξει, στην περίπτωση μας ένα shell script με όνομα testjob.sh. Το StdOutput περιγράφει σε ποιο αρχείο θα σωθεί το standard output της εκτέλεσης της δουλειάς ενώ το StdError περιγράφουμε σε ποιο αρχείο θα σωθεί το standard error. Οι γραμμές InputSandbox και ΟutputSandbox περιγράφουν ποιο είναι γενικά u964 το input και ποιό το output της δουλειάς. Ότι περιγράφεται στο InputSandbox αντιγράφεται από το UI στο μηχάνημα στο οποίο θα τρέξει η δουλειά ενώ ότι περιγράφεται στο OutputSandbox θα μεταφερθεί από το μηχάνημα στο οποίο έτρεξε η δουλειά στο τοπικό UI. Περισσότερες πληροφορίες για την γλώσσα JDL μπορείτε να βρείτε στο http://server11.infn.it/workload-grid/docs/datagrid- 01-TEN-0102-0_2-Document.pdf (σελίδα 8 και κάτω) Το testjob.sh είναι ένα απλό shell script το οποίο εκτυπώνει την ημερομηνία και το όνομα του μηχανήματος. testjob.sh #!/bin/bash date hostname Η εκτέλεση της δουλειάς γίνεται μέσω της εντολής edg-job-submit edg-job-submit vo see testjob.jdl Μην ξεχάσετε την παράμετρο «--vo see». Με την παράμετρο αυτή δηλώνουμε στο grid σε ποιό virtual organization ανήκουμε. Κάθε χρήστης στο grid ανήκει σε ένα virtual organization και ο χρήστης που υπάρχει στο UI ανήκει στο VO South-East Europe (SEE). Η τελευταία παράμετρος είναι το JDL αρχείο. Οι δουλειές στο grid ανατίθενται σε μηχανήματα απο έναν κεντρικό server που ονομάζεται resource broker. O resource broker είναι αυτός που αποφασίζει σε ποιό απο όλα τα μηχανήματα του grid θα τρέξει η δουλειά. Θα δούμε σε επόμενο ερώτημα πως μπορούμε να καθορίσουμε εμείς που θα τρέξει η δουλειά. Αφού τρέξετε την εντολή θα δείτε ότι το UI συνδέεται στο rb.isabella.grnet.gr, που είναι o resource broker που βρίσκεται στην Αθήνα (μπορούμε κατά την εγκατάσταση του UI να ρυθμίσουμε άλλον resource broker). Αφου συνδεθεί επιτυχώς, το UI στέλνει τη δουλειά και παίρνει πίσω έναν job identifier: ************************************************************************************** JOB SUBMIT OUTCOME The job has been successfully submitted to the Network Server. Use edg-job-status command to check job current status. Your job identifier (edg_jobid) is: - https://rb.isabella.grnet.gr:9000/ Njoj7Rbho0MzWqKYuFxkFg ************************************************************************************** Τον identifier αυτόν (https://rb.isabella.grnet.gr:9000/njoj7rbho0mzwqkyufxkfg) τον χρειάζεστε για να δείτε την κατάσταση της δουλειάς και να ανακτήσετε αργότερα τα αποτελέσματα της.
Β. Έλεγχος της κατάστασης μιας δουλειάς Αφού έχετε κάνει επιτυχώς submit την δουλειά σας μπορείτε με την εντολή edg-jobstatus να δείτε την κατάσταση της. edg-job-status <job identifier> Αφού τρέξετε ************************************************************* BOOKKEEPING INFORMATION: Status info for the Job : https://rb.isabella.grnet.gr:9000/njoj7rbho0mzwqkyufxkfg Current Status: Done (Success) Exit code: 0 Status Reason: Job terminated successfully Destination: ce42.hep.ntua.gr:2119/jobmanager-lcgpbs-see reached on: Fri Nov 18 15:54:10 2005 ************************************************************* την εντολή θα δείτε συνοπτικά την κατάσταση της : Αρχικά η κατάσταση (Current status) θα είναι submitted, μετά scheduled, κατόπιν running και όταν τελειώσει θα είναι Done. Η γραμμή destination δείχνει που έτρεξε η δουλειά (έτρεξε στον κόμβο ce42.hep.ntua.gr) και σε ποια ουρά του κόμβου μπήκε (jobmanager-lcgpbs-see). Αφού η κατάσταση γίνει done μπορείτε να ανακτήσετε τα αποτελέσματα της δουλειάς. Γ. Ανάκτηση των αποτελεσμάτων της δουλειάς Η ανάκτηση των αποτελεσμάτων γίνεται μέσω της εντολής edg-job-get-output edg-job-get-output <job identifier> Ότι είχε περιγραφεί στο OutputSandbox του JDL αρχείου με την εντολή αυτή έρχεται πίσω στο UI. JOB GET OUTPUT OUTCOME Output sandbox files for the job: - https://rb.isabella.grnet.gr:9000/njoj7rbho0mzwqkyufxkfg have been successfully retrieved and stored in the directory: /tmp/joboutput/hy555-grid_njoj7rbho0mzwqkyufxkfg Παρατηρήστε ότι τα αρχεία που μεταφέρθηκαν τοποθετήθηκαν u963 στο φάκελο /tmp/joboutput/hy555-grid_njoj7rbho0mzwqkyufxkfg. Αν πάμε στον φάκελο αυτό θα δούμε ότι υπάρχουν δυο αρχεία: το testjob.out και testjob.err. Αν δούμε τι περιέχει το testjob.out βλέπουμε ότι περιέχει το standard output της εκτέλεσης του script. #cat testjob.out Fri Nov 18 17:51:37 EET 2005 wn78.hep.ntua.gr
Αν δεν θέλετε να μπεί το Job output στο /tmp/joboutput μπορείτε να καθορίσετε το φάκελο με την παράμετρο «--dir» που παίρνει όρισμα το path που θέλετε να σώσετε το output. Προσοχή: Αφού έχετε κάνει μια φορά ένα επιτυχημένο edg-job-get-output ΔΕΝ μπορείτε να το εκτελέσετε ξανά. Θα πάρετε πίσω ένα μήνυμα λάθους που λέει ότι ήδη έχει ανακτήσει το αποτέλεσμα της δουλειάς. Γι αυτό να είστε προσεκτικοί στο σβήσιμο των φακέλων που περιέχουν τα job outputs. Δ. Ακύρωση μιας δουλειάς Με την εντολή edg-job-cancel ακυρώνεται η εκτέλεση μιας δουλειάς. Η σύνταξη της είναι: edg-job-cancel <job identifier> Θα ερωτηθείτε αν θέλετε όντως να την ακυρώσετε και κατόπιν θα δείτε μια απάντηση που έχει ως εξής: ==================== edg-job-cancel Success ===================== The cancellation request has been successfully submitted for the following job(s): - https://rb.isabella.grnet.gr:9000/jovs4vp0zi2rgtveayek3g ========================================================== E. Εκτέλεση δουλειάς χωρίς την χρήση του resource broker Στο προηγούμενο παράδειγμα το που θα τρέξει η δουλειά το επέλεγε ο resource broker. Αν θέλουμε μπορούμε να διαλέξουμε εμείς που θα τρέξει η δουλειά (συνήθως η παρακάτω διαδικασία χρησιμοποιείται για manual δοκιμή της καλής λειτουργίας ενός κόμβου). Το πρώτο πράγμα που πρέπει να κάνουμε είναι να δούμε που μπορούμε να τρέξουμε τη δουλειά. Η εντολή lcg-infosites χρησιμοποιείται σε αυτήν την περίπτωση: lcg-infosites vo see ce Κι εδώ καθορίζουμε ότι το VO είναι το SEE και ζητάμε πληροφορία για το ποια ce (computing elements) μπορούν να εξυπηρετήσουν το SEE VO. Το ce είναι αυτό που διαχειρίζεται τη δουλειά στο επιμέρους grid του κάθε συμμετέχοντος οργανισμού. [hy555-grid@zero test]$ lcg-infosites --vo see ce **************************************************************** These are the related data for see: (in terms of queues and CPUs) **************************************************************** #CPU Free Total Jobs Running Waiting ComputingElement ---------------------------------------------------------- 4 4 0 0 0 tbat01.nipne.ro:2119/jobmanager-lcgpbs-see 24 21 0 0 0 lcfgng.cs.tau.ac.il:2119/jobmanager-lcgpbs-see 8 3 0 0 0 alexander.it.uom.gr:2119/jobmanager-lcgpbs-see 26 25 0 0 0 ce101.grid.ucy.ac.cy:2119/jobmanager-lcgpbs-see 34 34 0 0 0 ce42.hep.ntua.gr:2119/jobmanager-lcgpbs-see 64 47 0 0 0 ce01.isabella.grnet.gr:2119/jobmanager-pbs-see 12 12 0 0 0 grid-ce.ii.edu.mk:2119/jobmanager-lcgpbs-see 12 2 0 0 0 node001.grid.auth.gr:2119/jobmanager-lcgpbs-see 64 47 8 8 0 ce01.isabella.grnet.gr:2119/jobmanager-pbs-long 8 5 0 0 0 testbed001.grid.ici.ro:2119/jobmanager-lcgpbs-see 64 47 0 0 0 ce01.isabella.grnet.gr:2119/jobmanager-pbs-short 4 4 0 0 0 grid001.ics.forth.gr:2119/jobmanager-lcgpbs-see 23 20 0 0 0 wipp-ce.weizmann.ac.il:2119/jobmanager-lcgpbs-see
Μας ενδιαφέρει η τελευταία στήλη, το computing element. Διαλέγουμε για παράδειγμα το grid001.ics.forth.gr και τρέχουμε την δουλειά μας ως εξής: globus-job-submit grid001.ics.forth.gr /bin/date Προσοχή: Δεν έχουμε πλέον jdl αρχεία αλλά εκτελέσιμα, όπως είναι το /bin/date. H εντολή αυτή θα επιστρέψει πάλι έναν identifier με τον οποίο μπορούμε να δούμε την κατάσταση της δουλειάς με την εντολή globus-job-status: globus-job-status <job identifier> Όταν η κατάσταση γίνει DONE μπορούμε να ανακτήσουμε το αποτέλεσμα της δουλειάς μέσω της εντολής globus-job-get-output: globus-job-get-output <job identifier> Το αποτέλεσμα της δουλειάς θα εκτυπωθεί στην οθόνη (δεν έχουμε outputsandbox πλέον). Για ακύρωση της δουλειάς μπορούμε να χρησιμοποιήσουμε την εντολή globusjobcancel που παίρνει σαν όρισμα το job identifier. Τα βήματα globus-job-submit, globus-job-status και globus-job-get-output μπορούν να τρέξουν με μία μόνο εντολή, την globus-job-run. Η globus-job-run παίρνει σαν παράμετρο το computing element και το όνομα του εκτελέσιμου, περιμένει μέχρι να τελειώσει η δουλειά και στο τέλος εμφανίζει το output της: [hy555-grid@hal9000 test]$ globus-job-run grid001.ics.forth.gr /bin/date Tue Dec 19 10:11:33 EET 2006 3. Άσκηση Α. Τρέχτε μια δουλειά η οποία θα εκτυπώνει το όνομα του μηχανήματος στο οποίο έτρεξε. Η εκτέλεση της δουλειάς θα γίνει με την χρήση JDL αρχείου και των εντολών edg-job-*. Περιγράψτε αναλυτικά τα βήματα που ακολουθήσατε καθώς και τον χρόνο που χρειάστηκε από την στιγμή που υποβάλλατε την δουλειά σας μέχρι τη στιγμή που ανακτήσατε το αποτελεσμά της. Β. Εκτελέστε την ίδια δουλειά όπως και προηγουμένως, αλλά πλέον χωρίς την χρήση JDL και resource broker. Προτιμήστε το grid001.ics.forth.gr σαν computing element και χρησιμοποιήστε τις εντολές globus-job-*. Περιγράψτε τα βήματα που ακολουθήσατε καθώς και πόσο πιο γρήγορα έτρεξε η δουλειά σας. Ποιά είναι τα πιθανά αίτια της γρηγορότερης ή αργότερης εκτέλεσης? Γ. Τρέχτε μια δουλειά η οποία θα διαβάζει ένα σύνολο αριθμών από ένα αρχείο Input.txt και θα εκτυπώνει τους περιττούς αριθμούς σε ένα αρχείο output.txt. Η εκτέλεση της δουλειάς θα γίνει με την χρήση JDL αρχείου και των εντολών edg-job-*. Περιγράψτε αναλυτικά τα βήματα που ακολουθήσατε. Τι αλλαγές κάνατε σε σχέση με τις 2 προηγούμενες διαδικασίες? Δ. Με την εντολή lcg-infosites --vo see -v 2 ce
βλέπουμε πληροφορίες για το λειτουργικό σύστημα, τη φυσική μνήμη και τον τύπο του επεξεργαστή. Φτιάξτε ένα script που βρίσκει το πιο δυνατό και το λιγότερα δυνατό από αυτά τα computing elements και κάνει submit το σειριακό εκτελέσιμο που υλοποιήσατε στην άσκηση 1 (ο πίνακας ας φτιάχνεται τυχαία μέσα από το πρόγραμμα). Φροντίστε ώστε ο χρόνος εκτέλεσης του προγράμματος να είναι αρκετός, π.χ πάνω απο 5 λεπτά. Κάντε globus-job-submit και στα δυο computing elements και μετρήστε το χρόνο που χρειάστηκε μέχρι η κατάσταση της δουλειάς να είναι DONE. Παρατηρείτε διαφορά στους χρόνους?