Inleiding
Ik werk in een bedrijf waar we lopen veel batch jobs verwerking miljoenen records van de gegevens elke dag en ik heb onlangs na te denken over alle machines die zitten elke dag niets te doen voor enkele uren. Zou het niet goed zijn als we zouden kunnen gebruiken om systemen die machines versterking van de rekenkracht van onze? In deze reeks van artikelen die ik ben gaan kijken naar de potentiële voordelen van het gebruik van een kantoor raster met behulp van gevirtualiseerde omgevingen.
In deel 1 heb ik een overzicht van het systeem en technologieën die ik zal gebruiken besproken, evenals enkele van de mogelijke redenen waarom u zou willen grid creëren van een kantoor.
Job Control
Als je gaat draaien banen dan moet je gaan om enkele manier om ze te beheren nodig. Uw job control systeem (op uw werk-server) moet echt goed doordacht voordat zelfs een poging om een kantoor grid lopen. Dus de eerste plaats, wat zijn de taken voor een job controle systeem:
- Uitdelen banen op verzoek van werknemers
- Vertel de werknemers wat voor soort banen te lopen
- Track jobs
- Ervoor te zorgen dat de banen slechts eenmaal uit te voeren
- Bieden job data voor de werknemers, of op zijn minst vertellen waar het te krijgen
Het systeem moet ook uitbreidbaar, een oplossing die werkt voor nu in een enkel geval kan worden uitgebreid tot verschillende soorten banen lopen als het bedrijfsleven ziet de waarde in een raster oplossing. Bijvoorbeeld, banen kunnen krijgen prioriteiten, kan meer dan een soort taak bestaat (dwz meerdere code basen), uiteindelijk kun je zelfs lopen verschillende werknemer machines die zijn geoptimaliseerd voor elk type van werk (hoewel dat niet af te stappen van de 'generieke werknemer 'idee). Always try to think about the future when developing systems, a short term vision can lead to longer term frustration and increased development time.
Job Server
We're going to need somewhere to control our jobs from, this should be the only system in your grid that has a fixed resource locator, be that an IP address, host name, URL (using internal DNS), etc. This is because the workers need to know where to look for jobs, workers need to find the job control system (not the job control system find the workers).
The job server itself doesn't really have a complicated task (in a basic system anyhow), it needs to store a list of jobs, hand out jobs, receive results, and subsequently store them for later retrieval. How these parts (such as 'hand out jobs') are defined can be very basic. Later on we can extend the system to include an administration interface to add, edit, delete, suspend jobs but this is beyond this exercise.
There is no reason whatsoever then that your job server could not be a virtual machine running within your main processing server provided it doesn't drain too many resources from it. The job server however does need high availability, if it goes down on a Friday evening you're going to lose a whole weekend of processing, potentially costing you a couple of weeks worth of processing time (when compared to your main processing server alone). You may want to consider putting your job server on a load balanced environment for high availability.
Basisinstellingen
The basic setup for our job server will consist of what I'm calling one of my LiMP servers (that is Li nux, m ySql, P HP). The code running on the workers will actually work out what jobs it can run by interacting with with job control system databases. Later on we could create a web service and actually hand out jobs rather than having the workers do the hard work themselves, but for now we'll continue using the KISS principle (Keep it Simple, Stupid!).
So, lets create three mySQL tables to deal with jobs. These will be `jobs`, `jobRecords`, and `jobResults`.
Here I'm using SQL Buddy a great little alternative to phpMyAdmin just because its easier to install on centOS (for others see: 10 Great alternatives to phpMyAdmin )
This table consists of 5 simple fields,
- id: Uniquely identify the job
- name: Could be a client reference, or any number of other identifiers
- Status: You need to know where the job is at, eg
- 0: Not started
- 1: Picked up
- 2: Completed
- started_by: Who's started doing the job? This isn't entirely required but is a nice to have. I'd suggest tracking workers by their IP address on your network
- started_at: When did the worker start the job? By tracking jobs that have not completed within X amount of time we know we need to pick up the job once again and start processing by another worker. Workers could stop processing/go offline for any number of reasons, power failure, crash, network loss, etc.
It is easy how this table could be extended with a few additional fields to allow for statistics tracking, a finish time column to see how long the job took, a counter to see how many workers picked up the job (obviously this needs to tend to 1), job priority, the list can go on and on. In more complex job scenarios it would be possible to specify how much memory the worker would need access to (and therefore only use suitable workers), or even what type of worker would be required.
Lets add a few example jobs:
The next table again is quite simple to understand, these are our job records. They are linked to the main jobs table by a column `jobs_id`. The make up of this table very much depends on the data that you need to supply to your workers, lets make a very simple example where we have four columns:
- id: ID of the record
- name: Person's name
- address: Person's address
- jobs_id: The job ID that this record is linked to
The third and final table consists of a results table, it has much the same make up as our records table, and with the addition of some columns could be part of the records table:
- job_record_id: Link the result to the job table
- result: The result data
…and that's all you need for job control! (albeit at a very basic level) In my case I'm pointed to another table where my data to process was located, but this could just as easily been a file, parameters to run simulation code, you name it.
Selecting a job
Zoals eerder vermeld, de werknemers zullen onze taakbeheer te doen voor ons nu, dus alles wat we nodig om echt te doen is het vinden van een baan, dat de verwerking van de behoeften en ontvang de informatie. Hoe zouden we dit doen? Nou halen onze taak selectiecriteria en kijk voor banen, in SQL heb ik het volgende:
- Neem geen vacatures die niet zijn gemarkeerd als compleet, maar van onze werknemers en reset ze (vervangende __ME__ met een identifier, makkelijkst zou IP-adres):
UPDATE `vacatures` SET `status` = 0 WHERE `status` = 1 EN `started_by` = __ME__;
- Met behulp van onze job selectiecriteria, selecteert u een baan en vertel het controlesysteem dat deze werknemer zich bezighoudt met het:
UPDATE `vacatures` SET `status` = 1, "started_by` = __ME__, `started_at` = NOW () WHERE `status` = 0 of
(`Status` = 1 EN `started_at`> DATE_SUB (NU (), INTERVAL x uur)) ORDER BY `id` ASC;
Door grijpen banen die niet zijn teruggekeerd resultaten in X hoeveelheid tijd die we ervoor zorgen dat alle opdrachten worden uitgevoerd in het geval van een werknemer botsen of AWOL.
- Volgende grijp de banen details gevolgd door de documenten zelf:
SELECT * FROM `banen` waar `started_by` = __ME__ LIMIT 1;
SELECT * FROM `job_records` WHERE `id` = __JOBID__;
Na voltooiing van het werk dat wij voegen ons resultaat records en markeer de taak als voltooid. Herinneren als banen kan suspend / resume te allen tijde mogelijk voor sommige robuustheid in je script. Het kan zijn dat de taak halverwege opschort door het bijwerken van de job control systeem, dus het controleren van het aantal records in een baan en het aantal resultaten opgeslagen in de job control systeem zou een verstandige zet te zijn.
Bovendien, terwijl dit laat zien hoe banen kunnen worden geselecteerd en beheerd vanuit een SQL-query frame moet je echt abstraheren je baan controle, zodat als u besluit om over te schakelen naar het gebruik van een web service, een bestand gebaseerd systeem, XML , of enige andere aantal systemen zal niet van invloed op de code erboven.
Job Configuratie
Het volgende aspect te onderzoeken, is grootte van een opdracht en configuratie. Door te spelen met job configuratie kunnen we vinden een uitstekende balans tussen snelheid, proces-replicatie, en betrouwbaarheid. Neem een paar OFA scenario's:
- Jobs Neem 1 dag per te lopen: Dit betekent dat uw werknemers moeten 15 dagen tot taak te verwerken elke (denk 10% van de stroom voor 2/3rds van de tijd). Dit is niet duidelijk een wijs configuratie, je baan grootte is veel te groot! Het zou ten minste het dubbele van de tijd om een baan verwerkt, moeten de eerste werknemer gaan AWOL krijgen (tijd op te halen dat zij niet beschikt over een plus opwerking tijd terug). In een ideale zou je ten minste een volledige baan eenvoudig geklaard door het einde van elke lange periode van inactiviteit, op die manier houdt u de banen tikken over en om het ergste geval een baan zou dagen duren twee tot proces moet de eerste gaan ontbreekt.
- Taken 1 minuut lopen: Dit betekent dat uw werknemers duurt ongeveer 15 minuten tot taak uit te voeren per stuk. Hoewel dit kan in eerste instantie lijkt ideaal, krijg je extra werk verwerking tijdens de lunch, koffiepauzes, vergaderingen, enz. dit scenario met druk op andere gebieden van uw systeem en introduceert haar eigen problemen. Bijvoorbeeld, wordt eerst je setup / verwerkingstijd ratio gaat recht naar beneden gaan, dus verliezen rendement van het systeem. Uw netwerk zal worden voortdurend streaming job informatie aan de verschillende werknemers frustrerend medewerkers die dong hun dagelijkse werk. Je bent ook gaan om meer spanning op je werk verwerking server omdat het om schotel uit heel veel kleine stukjes van het werk op een regelmatige basis. Ten slotte, in deze situatie als je baan server uitvalt je gaat een enorme achterstand van de onvoltooide werk te creëren terwijl grotere banen kunnen de permanente verwerking onwetend dat de klus server moeilijkheden ondervindt.
In werkelijkheid zal er niet een ideale configuratie voor uw grid opstelling worden, hangt veel af van de beschikbare middelen, de soorten van werk, beroep doorlooptijd eisen, netwerkmogelijkheden, enzovoort. Echter enkele richtlijnen zou zijn:
- Afdruktaken, zodat iedere werknemer kan krijgen door middel van ten minste 3-4 banen in een periode van 15 uur (de langste waarschijnlijk lang het duurt)
- Spelen met de grootte van een opdracht, zodat setup-tijd wordt vrij onbeduidend in vergelijking met de verwerking tijd (rekening houdend met het bovenstaande punt).
- Als een opdracht niet volledig in het dubbele van de hoeveelheid tijd (misschien minder) je verwacht dat het volledige er vanuit gaan dat haar verdwenen AWOL en verwerking met een andere werknemer te starten. Dit betekent dat u hoeft te wachten tot drie keer de normale lengte van een baan voor het in te vullen (eventueel langer indien de latere taak niet). Wilt u misschien de tijd te beperken, maar wees voorzichtig niet te verminderen te veel als je kan beginnen dupliceren verwerking van taken op een regelmatige basis.
- Banen moeten onafhankelijk zijn van buiten de eisen worden zoveel mogelijk. De job-server, bijvoorbeeld, mag alleen worden gecontacteerd bij het begin en het einde van elke opdracht.
- Niet verzadigen uw netwerk, zal dit zijn twee negatieve effecten, zal je overdag personeel te vinden met behulp van het netwerk frustrerend en problemen kunnen worden ervaren met aansluitingen timing een probleem dat alleen maar erger wordt als je je grid schaal.
- Zorgen voor banen kan worden uitgevoerd op uw werknemers. Als taken worden te geheugen-intensieve of schijfruimte intensieve banen zal beginnen afbreken en het enige wat je zal opvallen is een daling in het aantal banen verwerkt met geen echte reden waarom.
Overleggen van de resultaten van een Job
Bij de indiening van de resultaten van een baan is het belangrijk om te controleren dat geen resultaten zijn ingediend door een andere werknemer, zeker als de huidige werknemer is slapende voor bepaalde tijd.
Wanneer de resultaten worden voorgelegd ervoor te zorgen dat het aantal resultaten van het aantal records wedstrijden binnen de baan.
Zoals eerder vermeld, en kan niet genoeg worden benadrukt, bouwen fouttolerantie in beroep ophalen en de resultaten indienen. De werknemers kunnen (en waarschijnlijk zal) gaan in de modus te schorten op de meest ongelegen tijden en dit moet worden gehouden. Ook weer weg te abstraheren uw resultaten inzending zal helpen voor toekomstige wijzigingen in uw job control systeem veel eenvoudiger om te gaan met catering.
Samenvatting
In dit section hebben we gekeken naar wat een baan control server moet doen en hoe je een zeer fundamentele opgezet te krijgen. We besproken hoe je een baan van de besturing te halen en de beste manier om banen te configureren om de meeste van onze van uw kantoor grid systeem. Om te eindigen, een paragraaf of twee op de indiening van de resultaten terug naar de job control-server werd gepresenteerd.
- Een job control-server beheert banen en zorgt ervoor dat alle werkzaamheden zijn afgerond eenheden
- Door te abstraheren van uw taak te selecteren / resultaten indiening kunnen we de technologie van de controle-server te wijzigen zonder veel problemen
- Configureren uw opdrachten om ervoor te zorgen dat ze snel en efficiënt werken zonder te veel druk op uw netwerk infrastructuur, en zonder doublures verwerking van taken op een regelmatige basis.
- Zorg ervoor dat u fouttolerantie en fout checking te bouwen in uw routines, kunnen de werknemers op te schorten en te hervatten en de meest ongelegen tijden. Vergeet niet te controleren of de resultaten zijn reeds ingediend door een andere werknemer.
Volgende keer
In deel 3 We maken onze virtuele machine en het opzetten van onze Windows-machines te worden idle-time werknemers.