Download - Designing Distributed Programs with a Raspberry Pi cluster

Transcript
Page 1: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 1

Designing distributed programs

with a Raspberry Pi Cluster

Arjan Lamers

Page 2: Designing Distributed Programs with a Raspberry Pi cluster

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….

Page 3: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 3

Introductie

• Inzichtelijk maken van gedistribueerd programmeren

• Simpel, gedistribueerd en visueel

• “Pigs in space”:– Willekeurig grote kaart– Collision detection

Page 4: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 4

Introduction

• Hazelcast – Distributed implementation of Java Collection framework

• LWJGL – Lightweight Java Game Library for drawing

Page 5: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 5

Introduction

Page 6: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 6

Agenda

• Collision detection• Partitionering• Schaalbaarheid• Beschikbaarheid• Inzichten

Page 7: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 7

Collision detection

• In alle software toepassingen zijn er meerdere oplossingen met voor- en nadelen

Page 8: Designing Distributed Programs with a Raspberry Pi cluster

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); }}

Page 9: Designing Distributed Programs with a Raspberry Pi cluster

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(); } } }}

Page 10: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 11: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 11

Collision detection: keuzes

• Grotere kaarten of meer ruimteschepen?

• Data serialisatie?

Keuze: Object based collision detection

Page 12: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 12

Agenda

• Collision detection• Partitionering• Schaalbaarheid• Beschikbaarheid• Inzichten

Page 13: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 13

Meerdere servers

Efficient gebruik maken van:

• CPU• Geheugen• Netwerk

Page 14: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 15: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 15

Hoe maak je iets gedistribueerd?

• Verdeel de data

Page 16: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 17: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 18: Designing Distributed Programs with a Raspberry Pi cluster

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");

Page 19: Designing Distributed Programs with a Raspberry Pi cluster

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); }}

Page 20: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 20

Lokale tiles per server

No detection across borders

Page 21: Designing Distributed Programs with a Raspberry Pi cluster

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);

Page 22: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 23: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 23

Agenda

• Collision detection• Partitionering• Schaalbaarheid• Beschikbaarheid• Inzichten

Page 24: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 24

Hoe schaalbaar is het?

• # Raspberry Pi’s < # Tiles– Nooit helemaal gelijk verdeeld

Page 25: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 25

Amdahl’s law (1967)

Page 26: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 26

Amdahl’s law

Page 27: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 27

Amdahl’s law

Page 28: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 28

Gustafson’s law (1988)

Page 29: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 30: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 30

Agenda

• Collision detection• Partitionering• Schaalbaarheid• Availability• Inzichten

Page 31: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 31

Availability

• Bestand tegen hardware storingen

• Kopieer data naar backup servers– Bij voorkeur in ander data centrum

Page 32: Designing Distributed Programs with a Raspberry Pi cluster

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");

Page 33: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 33

High availability in Hazelcast: blauw en paars falen

Page 34: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 35: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 35

Availability: split brain

• Meerdere data centre’s

Page 36: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 36

Availability: split brain

Groen / paars / geel aan onze kant van de split

Page 37: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 37

Availability

• Split brain oplossen:

– Kies een werkelijkheid

of

– Merge

Page 38: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 38

Agenda

• Collision detection• Partitionering• Schaalbaarheid• Beschikbaarheid• Inzichten

Page 39: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 40: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 40

Inzichten

• Ontwerpen van gedistribueerde programma’s is lastig

• Denk na over data partitionering

• Maak strategieen configureerbaar

Page 41: Designing Distributed Programs with a Raspberry Pi cluster

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

Page 42: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 42

Vragen?

Page 43: Designing Distributed Programs with a Raspberry Pi cluster

slide© Copyright 2013. First8 43

Meer weten?

• Kom langs bij de First8 stand

• Download de software op: www.first8.nl