JDCE
Java Distribuited Computing Enviroment
Antonio Poggiali
per l’esame di Reti di Calcolatori LS
presentazione di
Java Distribuited Computing Enviroment
2
Introduzione ai DCE
Un ambiente di calcolo distribuito (DCE) consiste in un sistema in
grado di prendere delle applicazioni di calcolo e di distribuirne il carico
computazionale su un insieme di calcolatori connessi alla rete. In un
ambiente “collaborativo” questi calcolatori non sono noti a priori ma
vengono concessi a tempo indeterminato dagli utenti e possono venire
revocati in qualsiasi momento.
In particolare un DCE deve:


Fornire ai programmatori un sistema per scrivere il codice delle loro
applicazioni di calcolo e mandarle in esecuzione (deployment
nell’ambiente)
Permettere di mettere a disposizione i calcolatori in modo semplice (già che ci
fanno il favore, perché complicargli la vita?)


Gestire la potenza di calcolo disponibile fra le varie elaborazioni che ne
fanno richiesta
Gestire la distribuzione delle elaborazioni in maniera trasparente per il
programmatore
Java Distribuited Computing Enviroment
3
JDCE - Main features





JDCE è un ambiente per lo sviluppo e l’esecuzione di applicazioni
di calcolo distribuito di tipo cooperativo
In JDCE le macchine che partecipano al calcolo offrendo le proprie
risorse non sono note a priori ma vengono liberamente messe a
disposizione (e liberamente tolte) dagli utenti delle macchine
stesse lanciando una applicazione
JDCE gestisce autonomamente la distribuzione della potenza di
calcolo disponibile fra i vari richiedenti e gestisce le problematiche
che nascono dall’ambiente distribuito
JDCE offre al programmatore un sistema semplice, basato su
interfacce ed ereditarietà, per strutturare e sviluppare le proprie
applicazioni di calcolo e per mandarle in esecuzione
JDCE è sviluppato in Java ed utilizza RMI come middleware di
comunicazione fra i vari componenti
Java Distribuited Computing Enviroment
4
JDCE - Computazioni
In JDCE un’applicazione di calcolo
R1 R2 R3 R4 R5 … … RN
viene chiamata computazione.
1 2 3 4 5 … … N
Una computazione consiste in una
serie di pacchetti di dati numerati
in senso crescente a cui viene
pacchetti
applicata, pacchetto per pacchetto, pacchetti
di dati
1
R1
una operazione che restituisce un di risultati
nuovo pacchetto contenente il
JDCE
risultato.
JDCE distribuisce il calcolo
1
affidando i pacchetti a calcolatori
R1
diversi e raccogliendo i risultati
prodotti.
Il deployment su JDCE avviene
affidando la computazione ad un
opportuno agente.
operazione
Java Distribuited Computing Enviroment
5
JDCE - Struttura e componenti
customer
A
B
iscrizione
pippo
topo, pluto
JD
CE
A
B
B
pippo
pluto
topo
manager
Gli attori del sistema JDCE sono tre;
ogni attore consiste in una
applicazione che svolge determinate
operazioni.
I client sono gli attori che mettono a
disposizione la loro capacità di
elaborazione.
I customer (committenti) sono gli
attori che richiedono capacità di
calcolo per eseguire una
computazione.
Il manager è l’attore che si occupa di
gestire la capacità di calcolo
disponibile fra le varie computazioni
pervenute. Ogni ambiente JDCE in
funzione prevede un solo manager
(eventualmente replicato).
richiesta
iscrizione
di lavoro
client
Java Distribuited Computing Enviroment
6
Implementare computazioni
Le computazioni sono fisicamente articolate su una terna di elementi
distinti che il programmatore deve sviluppare: la sorgente dei dati
(data pool), l’operazione da eseguire (operation) ed il collettore dei
risultati (result collector).
interfacce
DataPool
ResultCollector
classe astratta
Operation
Il Customer di JDCE lavora
con questi tre componenti
1
2
3
4
5
… … … …
N
JDCE
R1 R2 R3 R4 R5 … … … … RN
Java Distribuited Computing Enviroment
DataPool
1
2
3
4
5
… … … …
7
N
public interface DataPool {
public Packet getNextPacket() throws noMorePacketException;
public Packet getPacket(int number) throws
InexistingPacketException;
public boolean hasPacket();
…
}
La sorgente di dati è vista come un flusso sequenziale di pacchetti
numerati in ordine crescente recuperabili con getNextPacket(). Il
metodo hasPacket() indica ci sono ancora pacchetti in sequenza. La
sorgente deve permettere anche l’accesso random con il metodo
getPacket(int number).
noMorePacketException > non ci sono più pacchetti
InexistingPacketException > il pacchetto richiesto non esiste
Java Distribuited Computing Enviroment
8
Operation
public abstract class Operation implements Serializable{
public abstract Serializable compute(Packet data);
}
La classi figlie di Operation vengono recuperate dai client per poter
eleborare i dati. Il metodo compute() restituisce il risultato
dell’elaborazione sul pacchetto passato come parametro. La
costruzione del pacchetto dei risultati è affidato al costruttore di
ResultPacket che richiede una Operation da utilizzare. Questo
meccanismo svincolare il programmatore dalla gestione esplicita dei
numeri di pacchetto.
public class ResultPacket extends Packet{
public ResultPacket(Operation operation, Packet data){
super(data.getPacketNo(),operation.compute(data));
}
}
Java Distribuited Computing Enviroment
ResultCollector
9
R1 R2 R3 R4 R5 … … RN
public interface ResultCollector {
public void commit(ResultPacket result);
public boolean hasFinished();
public void signalError(int packetIndex) throws
AbortComputationException;
}
Il metodo commit(ResultPacket result) consegna un pacchetto di
risultati. Il metodo signalError(int packetIndex) indica che
l’elaborazione del pacchetto con il numero packetIndex ha
causato un errore sul cliente. Il metodo hasFinished() indica quando
tutti i pacchetti sono stati consegnati (o hanno restituito errore).
Il customer di JDCE consegna i risultati o notifica gli errori
rigorosamente in ordine e senza duplicati.
AbortComputationException > a seguito di un errore si richiede di
abortire la computazione
Java Distribuited Computing Enviroment
10
Comunicazione fra le componenti
Le tre componenti comunicano
utilizzando RMI, ciascun
A
componente espone una interfaccia
per ciascuna delle altre parti che
devono comunicare con lui.
customer.IClient
customer.IManager
I riferimento agli oggetti remoti
devono essere reperiti da un
registro RMI; in JDCE viene fatta
manager.ICustomer
JD
l’ipotesi che il registro non fallisce,
CE
non ci sono politiche di recovery su
manager.IClient
registri secondari.
L’iscrizione e cancellazione dal
registro vengono gestite dai singoli
pippo
componenti. Il nome a cui ci si
client.IManager
iscrive viene reperito in modo “unico”
dal manager(vedi dopo).
Java Distribuited Computing Enviroment
11
Identificazione e recupero delle entità
Per identificare le entità le operazioni
richiedono l’identità del richiedente
come parametro.
Il manager permette di reperire nomi
unici attraverso il metodo
getValidName(), definito nelle sue
interfacce estendendo
NameResolver, che restituisce un
token.
I Token sono oggetti serializzabili da
cui è possibile estrarre un nome con
il metodo getName().
Le entità si iscrivono al registro
utilizzando il nome contenuto nel
token e utilizzano il token per fornire
la propria identità.
manager.ICustomer extends NameResolver
public Token getValidName(…)
Token
JD
CE
manager.IClient extends NameResolver
public Token getValidName(…)
Java Distribuited Computing Enviroment
12
Controllo dei permessi
Qualsiasi operazione richiede
che venga fornito un token che
contiene l’identità del
chiamante. Se il chiamante non è
autorizzato ad eseguire quella
operazione verrà sollevata
un’eccezione
InvalidPermissionException.
Ad esempio, se un client chiede
Token
un pacchetto di dati ad un
customer occorre che il manager
abbia concesso il permesso al
customer, se il customer non ha il
permesso solleverà una
InvalidPermissionException al
client.
A
JD
CE
IPE
pippo
Java Distribuited Computing Enviroment
13
Client
L’applicazione client di JDCE si
iscrive al manager e chiede di essere
legato ad un customer. Una volta
legato il client richiede al customer il
codice dell’operazione, ed una volta
ottenuto chiede un pacchetto di dati
su cui eseguirlo.
Ogni volta che un pacchetto viene
elaborato il client comunica al
customer il risultato (o lo informa di
un errore di calcolo) e gli chiede un
altro pacchetto. Quando il customer
ha concluso la propria elaborazione
ne informa il client che ricomincia da
capo.
Quando l’applicazione client termina
si cancella dal manager.
A
customer.IClient
… getComputation(…)
… getPacket(…)
… setComputationResult(…)
… notifyComputationError(…)
JD
CE
pippo
…
…
…
…
client.IManager
subscribeClient(…)
unscribeClient(…)
bindClient(…)
getValidName(…)
Java Distribuited Computing Enviroment
14
Customer
L’applicazione customer di JDCE
richiede che le venga fornita una
computazione da portare a termine.
Il customer fa da ponte tra i client e la
terna di componenti della
computazione.
Per prima cosa si iscrive al manager,
questi, quando ne ha disponibili, gli
assegna uno o più client con cui
poter lavorare. Le assegnazioni
possono essere revocate in qualsiasi
momento. Il customer serve solo le
richieste che gli arrivano dai client
che il manager gli ha assegnato.
Quando la computazione è terminata
il customer si cancella.
A
customer.IManager
… grantBind(…)
… revokeBind(…)
manager.ICustomer
… subscribeCustomer(…)
… unscribeCustomer(…)
JD
CE
Java Distribuited Computing Enviroment
15
Manager
L’applicazione manager tiene traccia
dei customer e dei client che si
iscrivono, risponde alle richieste di
legarsi dei client fornendogli un
customer, comunica ai customer
l’assegnazione di client, risponde
alle richieste di cancellazione dei
client, revocandoli al customer a cui
sono assegnati e risponde alle
richieste di cancellazione dei
customer.
Il ruolo del manager fondamentale:
funge da broker fra i client ed i
customer, decide come distribuire
la potenza di calcolo e, nel caso di
fallimenti di client o customer, si fa
carico della gestione degli errori che
ne risultano.
A
customer.IManager
… grantBind(…)
… revokeBind(…)
… alive()
JD
CE
pippo
client.IManager
… alive()
Java Distribuited Computing Enviroment
16
Caduta dei nodi
La caduta del manager impedirà a
nuovi attori di entrare nel sistema; i
customer potranno continuare a
lavorare con i loro client. Per
migliolare l’affidabilità del sistema è
possibile replicare il manager su più
nodi.
La caduta di un customer porta alla
perdita della computazione; la loro
replicazione è stata scartata perché
Funziona
troppo onerosa.
lo stesso
Ad esempio: un customer sta
gestendo una compressione video,
occorre replicare sia il video non
compresso (sorgente) sia il video
pippo
compresso (risultato, man mano che
viene calcolato) su tutti i nodi che
replicano il customer.
A
JD
CE
Java Distribuited Computing Enviroment
17
Replicazione del Manager
Il manager può essere replicato da
copie passive dinamicamente
aggiunte/rimosse durante
l’esecuzione.
Una copia è il master e viene
mantenuto aggiornato: se cade il
master il manager ne elegge un’altro
trasmettendogli stato, se il manager
cade il master diventa il nuovo
manager (elegge un nuovo master).
Manager e copie espongono una
interfaccia Replicator comune che
permette di entrare/uscire dal
gruppo, chiedere al manager se è
vivo, aggiornare il master e far
diventare master una copia.
Alcune azioni sono ovviamente
prerogativa del manager, altre della
copie ed altre del master.
master
M
… alive()
… joinGroup(…)
… leaveGroup(…)
manager
… alive()
… makeDataCheckpoint(…)
… makeSystemCheckpoint(…)
JD
CE
… becomeMaster()
… joinGroup(…)
… leaveGroup(…)
C
copia
Java Distribuited Computing Enviroment
18
Caduta del Manager
Ogni operazione sul manager prima di restituire i risultati sincronizza il
master trasmettendo le modifiche avvenute nelle sue strutture dati.
Al fallimento del manager (RemoteException) i componenti attendono
un certo tempo poi interrogano il registro per un nuovo riferimento e
ripetono la richiesta fallita.
Durante il tempo di attesa il master accede al registro RMI e si
registra a nome del vecchio manager (rebind).
Questo protocollo è efficiente grazie all’unica copia sincronizzata ed
alla semplicità di gestione del gruppo ma fallisce se manager e
master cadono contemporaneamente; possibilità comunque remota.
Java Distribuited Computing Enviroment
Caduta del Manager
Zzz
Remote
Exception
A
RMIRegistry
19
rebind
al nome del
Remote
master Exception
manager
M
… alive()
JD
CE
Remote
Exception
C
Zzz
pippo
copia
Java Distribuited Computing Enviroment
Caduta del Manager
20
lancio del manager
e rispristino stato
Zzz
RMIRegistry
A
JD
CE
?
?
Zzz
M
C
… becomeMaster()
pippo
copia
master
Java Distribuited Computing Enviroment
21
Caduta del Manager
A
RMIRegistry
JD
CE
lookup del manager
nel registro
M
pippo
master
Java Distribuited Computing Enviroment
22
Caduta del Manager
A
JD
CE
M
pippo
master
Java Distribuited Computing Enviroment
23
Locale vs. Distribuito
Quando JDCE può essere utilizzato per avere uno speed-up? Nel
modello locale “pipelined” un processo legge i pacchetti di dati, un
processo li elabora ed un processo finalizza.
Le computazioni I/O bound non sono efficienti: la distribuzione
dell’elaborazione non elimina i tempi di lettura e finalizzazione
(introduce l’overhead di trasmissione).
Le computazioni CPU bound nel modello locale “pipelined” con N
pacchetti e tempo de elaborazione (costante) Te richiedono un tempo
complessivo Tpipeline=N*Te.
In Jdce consideriamo Tsend e Treceive tempi di trasmissione e
ricezione di un pacchetto. Senza ritrasmissioni la sorgente deve
trasferire e ricever N pacchetti con un tempo complessivo di
Tjdce=N*Tsend+N*Treceive+(N*Te)/client, tempo che i client
impiegano ad elaborare i pacchetti.
Nelll’ipotesi che il numero di client sia costante ed elevato ponendo
Tjdce<Tpipeline otteniamo Te<Tsend+Treceive condizione minima
perché Jdce sia conveniente; condizione non sufficiente perchè
calcolata senza considerare gli overhead che JDCE introduce.