slide© Copyright 2013. First8 1
Designing distributed programs
with a Raspberry Pi Cluster
Arjan Lamers
slide© Copyright 2013. First8 2
Introductie
• Raspberry PI cluster
– Snel genoeg voor Java (JDK 7u40)– Makkelijk draagbaar– Kleine experimenten– Testen van echte hardware problemen– Langzaaaam….
slide© Copyright 2013. First8 3
Introductie
• Inzichtelijk maken van gedistribueerd programmeren
• Simpel, gedistribueerd en visueel
• “Pigs in space”:– Willekeurig grote kaart– Collision detection
slide© Copyright 2013. First8 4
Introduction
• Hazelcast – Distributed implementation of Java Collection framework
• LWJGL – Lightweight Java Game Library for drawing
slide© Copyright 2013. First8 5
Introduction
slide© Copyright 2013. First8 6
Agenda
• Collision detection• Partitionering• Schaalbaarheid• Beschikbaarheid• Inzichten
slide© Copyright 2013. First8 7
Collision detection
• In alle software toepassingen zijn er meerdere oplossingen met voor- en nadelen
slide© Copyright 2013. First8 8
Collision detection: map based
boolean[][] map = new boolean[MAP_WIDTH][MAP_HEIGHT];
public void detectCollisions(List<Ship> ships) { for (Ship s : ships) { if (s.collidesWith(map)) { s.bounce(); } s.updateMap(map); }}
slide© Copyright 2013. First8 9
Collision detection: object based
public void detectCollisions(List<Ship> ships) { for (int i=0; i<ships.size(); i++) { for (int j=i+1; j<ships.size(); j++) { Ship a = ships.get(i); Ship b = ships.get(j); if (a.collidesWith(b)) { a.bounce(); b.bounce(); } } }}
slide© Copyright 2013. First8 10
Collision detection
Tijd complexiteit
Geheugen complexiteit
Map based T = O (ships) M = O(map^2 + ships)
Object based T = O (ships^2) M = O(ships)
Tijd
Data
slide© Copyright 2013. First8 11
Collision detection: keuzes
• Grotere kaarten of meer ruimteschepen?
• Data serialisatie?
Keuze: Object based collision detection
slide© Copyright 2013. First8 12
Agenda
• Collision detection• Partitionering• Schaalbaarheid• Beschikbaarheid• Inzichten
slide© Copyright 2013. First8 13
Meerdere servers
Efficient gebruik maken van:
• CPU• Geheugen• Netwerk
slide© Copyright 2013. First8 14
Hoe maak je iets gedistribueerd?
• Kopieer alles naar alle machines
– Meer machines betekent alleen meer CPU
– Kaart & ruimteschepen gelimiteerd tot 1 raspberry pi
– Veel netwerk verkeer
slide© Copyright 2013. First8 15
Hoe maak je iets gedistribueerd?
• Verdeel de data
slide© Copyright 2013. First8 16
Data verdelen
• Verdeel schepen over servers– Simpel– Dichtbijzijnde schepen kunnen op andere server staan
• Verdeel stukken kaart (tiles) over servers– Voelt natuurlijker– Lokale collision detection is triviaal
slide© Copyright 2013. First8 17
Data verdelen
Tiles verdeeld over servers
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
slide© Copyright 2013. First8 18
Hazelcast distributed maps
• Distributed Maps verdelen op basis van de key
• Onze tiles hebben een Integer als key
class Tile { int tileId; Collection<Ship> ships;}
HazelcastInstance instance = Hazelcast.newHazelcastInstance();Map<Integer,Tile> tiles = instance.getMap("tiles");
slide© Copyright 2013. First8 19
Lokale tiles
• Elke server heeft een eigen set lokale tiles
HazelcastInstance instance = Hazelcast.newHazelcastInstance();IMap<Integer,Tile> tiles = instance.getMap("tiles");
for(;;) { Set<Integer> localKeySet = tiles.localKeySet(); for (int tileId : localKeySet) { handleTile(tileId); }}
slide© Copyright 2013. First8 20
Lokale tiles per server
No detection across borders
slide© Copyright 2013. First8 21
Randgevallen
• Collision detection op de randen van tiles– Lokale kopie van externe tile:
– Of aan de andere server overlaten:
Map<Integer, Tile> tiles = hzInstance.getMap(“tiles”); Tile tile = tiles.get(externalTileId);
FutureTask task = new DistributedTask (new CollisionDetect(ships, externalTileId), externalTileId);
ExecutorService executorService = hzInstance.getExecutorService();executorService.execute(task);
slide© Copyright 2013. First8 22
BASE: Basically Available, Soft state, Eventual consistency• CAP theorie:
– Consistency– Availability– Partition tolerance
• Overgang tussen tiles– Dubbel renderen– Verdwijnende schepen
slide© Copyright 2013. First8 23
Agenda
• Collision detection• Partitionering• Schaalbaarheid• Beschikbaarheid• Inzichten
slide© Copyright 2013. First8 24
Hoe schaalbaar is het?
• # Raspberry Pi’s < # Tiles– Nooit helemaal gelijk verdeeld
slide© Copyright 2013. First8 25
Amdahl’s law (1967)
slide© Copyright 2013. First8 26
Amdahl’s law
slide© Copyright 2013. First8 27
Amdahl’s law
slide© Copyright 2013. First8 28
Gustafson’s law (1988)
slide© Copyright 2013. First8 29
Hoe schaalbaar is het?
• Moeilijke vraag.
• Meer data -> efficienter gebruik – Of andersom: meer pi’s alleen zinnig als er genoeg data is
• In plaats van complexiteit: (iso) efficiency
• Wijzigen verhoudingen -> andere bottlenecks
slide© Copyright 2013. First8 30
Agenda
• Collision detection• Partitionering• Schaalbaarheid• Availability• Inzichten
slide© Copyright 2013. First8 31
Availability
• Bestand tegen hardware storingen
• Kopieer data naar backup servers– Bij voorkeur in ander data centrum
slide© Copyright 2013. First8 32
High availability in Hazelcast
Config config = new Config();
MapConfig tilesMapConfig = config.getMapConfig("tiles");tilesMapConfig.setAsyncBackupCount(1);tilesMapConfig.setBackupCount(0);
HazelcastInstance i= Hazelcast.newHazelcastInstance(config);
Map<Integer,Tile> tiles = i.getMap("tiles");
slide© Copyright 2013. First8 33
High availability in Hazelcast: blauw en paars falen
slide© Copyright 2013. First8 34
Availability
• Test scenario’s zo dicht mogelijk bij de waarheid
– Een server die connecties weigert != Een server die niet antwoord
• Echte hardware werkt het beste
slide© Copyright 2013. First8 35
Availability: split brain
• Meerdere data centre’s
slide© Copyright 2013. First8 36
Availability: split brain
Groen / paars / geel aan onze kant van de split
slide© Copyright 2013. First8 37
Availability
• Split brain oplossen:
– Kies een werkelijkheid
of
– Merge
slide© Copyright 2013. First8 38
Agenda
• Collision detection• Partitionering• Schaalbaarheid• Beschikbaarheid• Inzichten
slide© Copyright 2013. First8 39
Inzichten
• Profile!
• Te veel variabelen:
– Grotere tiles• Minder ruimteschepen / pixel
– Minder botsingen• Minder tile verhuizingen
– Kaart verdelen in meer tiles• Gelijkmatigere verdeling• Minder CPU per tile beschikbaar
slide© Copyright 2013. First8 40
Inzichten
• Ontwerpen van gedistribueerde programma’s is lastig
• Denk na over data partitionering
• Maak strategieen configureerbaar
slide© Copyright 2013. First8 41
Inzichten
• Pi’s zijn prima om kleine tests mee uit te voeren
• Pi’s zijn bij uitstek geschikt voor testen van verstoringen
slide© Copyright 2013. First8 42
Vragen?
slide© Copyright 2013. First8 43
Meer weten?
• Kom langs bij de First8 stand
• Download de software op: www.first8.nl
Top Related