A Jini technológia alkalmazása Grid rendszerek fejlesztésében


Juhász Zoltán, Andics Árpád, Póta Szabolcs

Veszprémi Egyetem, Információs Rendszerek Tanszék

juhasz@irt.vein.hu



Absztrakt Az elmúlt évtized rendkívüli technológiai változásai révén lehetõvé vált nagyméretû, meglévõ számítási infrastruktúrára épülõ, számítási ún. Grid rendszerek létrehozása. A legismertebb ilyen környezeteket C, C++ és Fortran programok végrehajtására fejlesztették ki, ami nagy és heterogén rendszerek esetén komoly hordozhatósági problémákat vet fel. A Jáva nyelv és a Jini technológia lehetõvé teszi egy platform-független és szolgáltatás-központú grid létrehozását, mely lehetõvé teszi feladatok tetszõleges helyen történõ futtatását. Projektünk célja egy ilyen rendszer kifejlesztése. A cikk eddigi eredményeinket, a rendszer felépítését, mûködését és használatát mutatja be.


Bevezetés

Az elmúlt évtizedben rendkívüli változások zajlottak le a párhuzamos számítógépek felhasználásában. Technológiai változások és gazdasági okok nyomán az évtized elejét uraló különleges architektúrákat öt-hat év alatt felváltották a tömeggyártással elõállított alkatrészekbõl álló számítógépek. A hálózati technológia fejlõdésének köszönhetõen, általánosan elfogadottá vált az olcsó személyi számítógépekbõl létrehozott párhuzamos rendszerek (klaszter) alkalmazása számításigényes feladatokra. Mára lehetõvé vált szinte korlátlan méretû, földrajzilag elosztott számítógépekbõl álló, virtuális párhuzamos számítógépek, ún. metaszámítási (közkedvelt néven grid) rendszerek létrehozása [1]. Ezen rendszerek létrehozása, mûködtetése és programozása azonban sok megoldandó problémát rejt.

A grid rendszerek mûködése alapvetõen különbözik a hagyományos párhuzamos számítógépekétõl. A földrajzi távolságok és a számítógép hálózat jelenléte miatt bármikor elõfordulhatnak hibák – egyes processzorok meghibásodhatnak, gépeket bármikor kikapcsolhatnak, az összekötõ hálózati rendszer meghibásodhat. Továbbá, a rendszert alkotó számítógépek különbözõ típusú processzorokat és operációs rendszereket tartalmazhatnak. Emiatt, a grid infrastruktúráknak meg kell birkóznia a mûködési bizonytalansággal, a szoftver és hardver architektúra heterogén jellegével, valamint biztosítania kell a felhasználó távoli gépekhez való hozzáférésének menedzselését.

A Sun által kifejlesztett és 1999-ben bevezetett Jini technológia [2] lehetõvé teszi digitális eszközök automatikus, emberi beavatkozás nélküli, ad hoc hálózatba kapcsolódását és együttmûködését. Az így létrejött hálózat (szolgáltatás federáció) dinamikus; az eszközök akkor kapcsolódnak be, illetve távoznak, amikor akarnak. A Jáva nyelvi környezetre építve, a Jini technológia olyan biztonságos, hibatûrõ, és platform-független elosztott objektum-orientált rendszer létrehozására alkalmas, mely soha nem látott mértékben leegyszerûsíti a számítógépek, digitális eszközök hálózatba kapcsolását, hálózati mûködését és azok együttmûködését.

Futó kutatási projektünk (JM: Jini Metacomputing) célja egy Jini technológiára épülõ elosztott, nagyméretû grid számítási rendszer kifejlesztése, illetve ezzel egyidejûleg a Jini technológia ilyen célú alkalmazási lehetõségének megvizsgálása. A cikk további részében a JM rendszer jelenlegi állapotáról, felépítésérõl, programozási technikájáról és az eddigi tapasztalatokról számolunk be.


A JM rendszer architektúrája

A rendszer alapelemei szolgáltatások, valamint ezeket használó kliensek. A Jini rendszer mûködése egy speciális szolgáltatásra, a Lookup Service-re épül. Ez a szolgáltatás egy magasszintû name service, mely szolgáltatás objektumokat tárol és exportál a kliensek felé. A JM rendszer a Lookup Service mellett még két szolgáltatás típust használ: ezek a Compute Service és a Broker Service.

A Compute Service (Host) egy számításokat végzõ szolgáltatás, mely a kliens által – Jáva objektum formájában – megadott feladatot hajt végre. A kliensek és a számítási szolgáltatások egymásra találását, pontosabban a legmegfelelõbb számítási szolgáltatás kiválasztását segíti a Broker Service. A Broker alapfeladata minél több számítási szolgáltatás felfedezése és a kliens kérések alapján a feladatok szétosztása, végrehajtása.

Az 1. ábra mutatja a rendszer mûködését az egyes szolgáltatások elindítása után. Az elindított Compute és Broker Service programok regisztrálják magukat egy vagy több Lookup Service-ben. Ezzel mind a Broker, mind a Compute Service objektumok a kliensek számára elérhetõvé válnak. A kliens a Lookup Service lekérdezésével letölti a Broker Service proxy objektumot, mely lehetõvé teszi a Broker kliens oldalról történõ felhasználását. Közben a a Broker szolgáltatás egy helyi objektum cache-be helyezi a rendszerben elérhetõ Compute Service proxy objektumokat. Amint a cache nem üres, a Broker kész kliens feladatok végrehajtására.


1. ábra. A rendszer mûködése indítás során

Az objektumok regisztrálását és mozgását nyilak jelzik.


Egyszerû szekvenciális feladatvégrehajtás

A JM rendszer több feladatvégrehajtási módot kínál a felhasználónak. Szekvenciális és párhuzamos feladatok futtathatók szinkron vagy aszinkron módon, közvetlenül a Lookup Service-ben talált Host gépeken, vagy a Broker által kiválasztottakon.

Ebben a szakaszban röviden bemutatjuk egy egyszerû szekvenciális feladat Broker szolgáltatás segítségével történõ aszinkron végrehajtását. Mielõtt azonban erre rátérünk, meg kell ismernünk a végrehajtható feladatra vonatkozó elõírásokat. A JM rendszerben minden feladatnak implementálnia a kell a JMTask interfészt, mely definiál egy execute() metódust. Ezt kell minden feladatnak megvalósítania, mivel a Compute Service ezt a metódust hívja meg a végrehajtás során. A metódus paramétere egy listener és egy broker objektum referencia. A paraméterek átadásáról a rendszer gondoskodik.


public interface JMTask extends Serializable {


public Object execute(RemoteEventListener

listener, JMBroker broker) throws Exception;

}


Tételezzünk fel egy egyszerû feladatot, a p értékének kiszámítását, melyet egy a JMTask interfészt implementáló PiCompTask osztály valósít meg. A feladat a Broker execute() metódusának meghívásával hajtható végre. A PiCompTask objektumon kívül azonban továbi paraméterekre is szükség van. Ezek: az attribútumok, melyek a felhasználni kívánt Compute Service tulajdonságait adhatják meg (pl. gépcím, processzorszám, teljesítmény, stb.), egy filter objektum, mely bonyolultabb szolgáltatás keresésre ad lehetõséget, valamint a listener, mely a kliens eseménykezelõ objektuma. Ez kap majd értesítést a Broker szolgáltatástól, ha a végrehajtás sikerül, vagy hiba adódik.


try {

pi = (Double)broker.execute(new PiCompTask(myid, noIntervals, 1), attributeSet, filter, listener);

}catch (RemoteException ex) {...}


A hívás végrehajtását a 2. ábra illusztrálja. A Broker az execute() meghívásával megkapja a feladatot, az attribútumok alapján kiválasztja a legmegfelelõbb Compute szolgáltatást, meghívja annak execute() metódusát, ami a feladatot végrehajtja. A feladat végrehajtása után az eredmény elõbb a Broker, majd a kliens eseménykezelõbe érkezik.

2. ábra. Aszinkron végrehajtás szekvencia diagramja broker használat esetén


Párhuzamos feladatok végrehajtása

A JM rendszer párhuzamos feladatok végrehajtását is támogatja. Jelenleg Fork/Join és Master/Worker típusú programok futtathatók. A közeljövõben tervezzük az üzenetküldõ programok végrehajtásához szükséges változtatások implementálását.

A párhuzamos végrehajtást az elõzõ p számítási program párhuzamos változatán illusztráljuk. A számítás alapja egy integrál közelítõ értékének meghatározása téglányösszegek segítségével. A feladat paraméterei a téglányok illetve a felhasználandó proceszorok száma. Mindegyik processzor több téglányösszeget számol ki, majd a részeredmények összeadása után megkapjuk a végeredményt. A végrehajtás során több thread indítására van szükség, hogy a Host execute() hívások egyidõben hajtódjanak végre. Ha a kliens direkt módon hajtja végre a feladatot, a Brokertõl lekért Host gépeken indíthatja a részfeladatok végrehajtását. A részfeladatokat a StartThread osztály példányai valósítják meg.


try { //initialise and start up the threads

for (int i = 0; i < noProc; i++) {

compThread[i] = new StartThread(i,

noIntervals, noProc,

(JMComputeHost)services[i].service);

compThread[i].start();

}

} catch (Exception ex) {...}


A StartThread osztály run() metódusa felelõs az adott processzorra esõ részfeladat végrehajtásáért.


result = (Double)broker.execute(new

PiCompTask(myid, noIntervals, noProc), null);


A részfeladatok elindítása után a kliens program megvárja az egyes thread-ek végét, összegzi az eredményt, és befejezi a futást. A végrehajtás részletes menetét illusztrálja a 3. ábrán látható szekvencia diagram.


// now sum the partial results

double pi = 0;

try {

for (int i = 0; i < noProc; i++) {

compThread[i].join();

Double result = compThread[i].getResult();

pi += result.doubleValue();

}

} catch (Exception ex) {...}

return new Double(pi);


Amennyiben a kliens a Broker segítségével szeretné megoldani a feladatot, egy vezérlõ és egy feladat objektumot kell létrehozni (mindkettõ JMTask típusú). A vezérlõ objektumot a 3. ábrán szaggatott vonallal jelzett két osztály alkotja. A vezérlõ és feladat objektumokat ekkor a Broker szolgáltatás osztja ki a legmegfelelõbb helyre, és a vezérlõ feladat részeredmény összegzése után továbítja az eredményt a kliens programnak.



3. ábra. A p program közvetlen szinkron párhuzamos végrehajtása


Eredmények

Az elkészült rendszert több szekvenciális és párhuzamos példaprogram segítségével is teszteltük. A rendszer bizonyítja, hogy a Jini technológiára építve hatékony grid környezet alakítható ki. Teszteink során használtuk a Veszprémi Egyetem Információs Rendszerek Tanszékének gépparkját, majd késõbb sikeresen integráltunk a rendszerbe egyetemen kívüli veszprémi és budapesti (MTA-SzTAKI) számítógépeken futó Compute Service-eket is.



4. ábra. A számítási szolgáltatás aktuális állapotának grafikus megjelenítése


A számítási szolgáltatások menedzselésére és ellenõrzésére kifejlesztettünk egy egyszerû grafikus interfészt is, mely többek között megjeleníti a rendszer aktuális terheltségét (4. ábra), a futó feladatok tulajdonságait, a szolgáltatás attribútumait (5. ábra) és egyéb adminisztratív funkciókat.



5. ábra. A számítási szolgáltatás attribútumainak beállítási ablakja


Összegzés

A cikkben ismertettük a JM Jini alapú grid rendszer felépítését, mûködését, alapvetõ programozási lépéseit és felhasználási módjait. A kifejlesztett rendszer lehetõvé teszi különbözõ számítógépek egyszerû rendszerbe kapcsolását és így egy nagy közös erõforrás park létrehozását. A JM környezet installálása rendkívül egyszerû, felhasználása pedig minimális módosításokat igényel egy meglévõ Jáva programban. További folyamatban lévõ fejlesztéseink befejezése után (feladat és felhasználó menedzselés, valamint a hibatûrõ végrehajtás implementálása) után a rendszer alkalmas lehet országos méretû (többezer szolgáltatásból álló), de akár még ennél is nagyobb grid rendszerek létrehozására.


Irodalom

[1] I. Foster, C. Kesselman, “Globus: A Metacomputing Infrastructure Toolkit”, Intl J. Supercomputer Applications, 11(2):115-128, 1997.

[2] Jini Technology Core Platform Specification, http://www.sun.com/jini/specs.