Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Project funded by the Future and Emerging Technologies arm of the IST Programme
The BISON Project and the PeerSim P2P simulator
Gian Paolo Jesi ([email protected])
Complex Adaptive Systems (CAS) Course Lecture
06/04/05 2
Summary:
BISON project introduction Acheived goals and results PeerSim simulator introduction PeerSim basic concepts PeerSim search framework tutorial Conclusions
06/04/05 3
BISON Introduction(1/4)
BISON is a three-year Project (IST-2001-38923) funded by the Information Society Technologies Programme of the European Commission.
Since January 2003 (ends in December 2005) http://www.cs.unibo.it/bison Partners:
University of Bologna Telenor Communication AS Technical University of Dresden IDSIA SFI (out!)
06/04/05 4
BISON Introduction(2/4)
BISON motivation: The modern Network Information Systems (NIS)
are too complex => traditional management techniques may fail due to: Huge system size (~millions users/devices); Complex interactions between components; Minor troubles somewhere may lead to
catastrophic, global failures;
06/04/05 5
BISON Introduction(3/4)
What do we need?
A new paradigm to build self-organizing and self-repairing systems;
Biological inspiration (e.g.: from social insects, immune networks,...);
Promote the emergence of higher level properties (self-* properties) without explicit coding;
06/04/05 6
BISON Introduction(4/4)
BISON goals:
Use of CAS techniques to build distributed systems;
Design solutions targeted to ad-hoc, P2P and grid networks;
Give guidelines to build CAS that perform the desired behaviour and properties;
06/04/05 7
BISON Progress Areas
Topology management; T-Man, SuperPeer (2 flavours)
Aggregation; Gossip scheme
Load balancing (aggregation based); Ant, Chemotaxis, diffusion
Searching; Random walk, mutation based,...
Virtual path quality monitoring and management
06/04/05 8
PeerSim Introduction (1/4)
PeerSim is an open source, Java based, P2P simulation framework aimed to develop and test any kind of P2P algorithm in a dynamic environment.
http://peersim.sf.netMain features: Scales up to 1 million peers; Highly configurable; Open architecture and component based;
06/04/05 9
PeerSim Introduction (2/4)
Documentation: JavaDoc and tutorials available online.
Support: help web based mailing list available on sourceforge.
Peersim popularity is growing day by day: 59 downloads in December 2004.
All the algorithms developed in the Bison project have been developed and tested on Peersim.
06/04/05 10
PeerSim Introduction (3/4)
Peersim supports 2 kind of simulation: Cycle based: the simulation runs in a sequential
order and in each cycle each protocol can run its behaviour.
Event based: support for concurrency; a set of events (messages) are scheduled and the node protocols are run accordingly to the message delivery.
06/04/05 11
Peersim Introduction (4/4)
Peersim limits: Ignores the details of the transport
communication protocol stack Messages are not modeled by default (we
invoke object methods instead), but the developer is free to implement them.
06/04/05 12
Components
Peersim is component based (nothing to deal with CORBA or .NET componet idea).
Components are “pluggable”.
Main Component types: Protocol Dynamics (and Initializers) Observer
06/04/05 13
Protocol Component
It is the protocol behaviour core that the designer have to write.
Means implementing the peersim.cdsim.CDProtocol or peersim.edsim.EDProtocol interface (only 1 method).
Many protcols can run on every node. Each protocol has an identifier (ID), the same ID
at each node (NOTE: this may cause troubles to newbies).
06/04/05 14
Dynamics Component
Used to add dynamism; they have global view of the system.
Means implementing the peersim.dynamics.Dynamics interface (only 1 method).
A Dynamics can be used as an Initializer (e.g.: to initialize peer views).
Examples: used to reset node status or to simulate random node crashes.
06/04/05 15
Observer Components
Used to log important informations about the system; they have global view.
Means implementing the peersim.reports.Observer interface (only 1 method).
Each observer can use the peersim internal log facility to produce consistent data log during simulations.
06/04/05 16
Basic Structures
Node: basic element of a network, is an interface defining basic operations on neighbor views. A basic node impl. is given.
Network: global array of Nodes, it represents the whole partecipants set.
Linkable: an interface to let public access to a protocol neighborhood.
Scheduler: objects that wrap any Protocol, Dynamics and Observer to supply scheduling facilities during the simulation (e.g.: Initializers are automagically scheduled at the beginning).
06/04/05 17
Configuration
A configuration file is a standard ASCII text file. Example:# random.seed 1234567890 simulation.cycles 30 simulation.shuffle overlay.size 50000 overlay.maxsize 100000
protocol.0 peersim.core.IdleProtocol protocol.0.degree 20
protocol.1 example.aggregation.AverageFunction protocol.1.linkable 0
init.0 peersim.init.WireRegularRandom init.0.protocol 0 17 init.0.degree 20
init.1 example.loadbalance.LinearDistributionInitializer init.1.protocol 1 init.1.max 100 init.1.min 1
observer.0 example.aggregation.AverageObserver observer.0.protocol 1
06/04/05 18
Configuration
Another example:simulation.cycles 30simulation.shuffleoverlay.size 50000overlay.maxsize 200000 protocol.0 example.newscast.SimpleNewscastprotocol.0.cache 20protocol.1 example.aggregation.AverageFunctionprotocol.1.linkable 0
init.0 peersim.dynamics.WireRegularRandominit.0.protocol 0init.0.degree 20init.1 example.loadbalance.LinearDistributionInitializerinit.1.protocol 1init.1.max 100init.1.min 1
observer.0 example.aggregation.AverageObserverobserver.0.protocol 1
dynamics.0 peersim.dynamics.GrowingNetworkdynamics.0.add -500dynamics.0.minsize 4000dynamics.0.from 5dynamics.0.until 10
06/04/05 19
Peersim Search Framework Tutorial
Outline:
The idea
The components we are going to code
A simple random walk protocol
06/04/05 20
The Search Framework Idea
Provide a set of general services for P2P search algorithm: Pick a neighbor, send/forward a query, common
init facilities, abstracting the query messages Each node has:
a repository (set) of documents (keys) a query distribution (may contains 1+ keys to
search for) At most 1 query can be started by any node at
every cycle.
06/04/05 21
Components to code
SearchProtocol base class; every search protocol should inherit from this one.
Initializer: to bootstrap the data set (storage & query)
Observer: to collect data (e.g.: query hits, duplicate packets,...)
SMessage class: to abstract the query mesage; it contains the query and other message parameters (ttl, sender, ts, type,...)
06/04/05 22
Data Structures Involved
MessageTable: hashtable tracking how many times a packet has been seen by the current node;
HitTable: stores the packets for which there is a hit;
IncomingQueue: inbound query messages; View: usual P2P neighborhood; KeyStorage: maps the frequency for each key; QueryDistro: holds the query to produce for
each cycle;
06/04/05 23
SearchProtocol
Active Behaviour: Injects query
according to the distro Handled by the
NextCycle()
Passive Bahaviour: Reacts to the incoming
messages (collected in a queue)
Handled by NextCycle() and by the process() abstract method
Implements: peersim.cdsim.cdprotocol & peersim.core.Linkable;
Basic services: send(), forward(), matches(), getRNDNeighbor(), ...
06/04/05 24
Search Protocol Code (1/3)
public void nextCycle(Node node, int protocolID) { int currentTime = CommonState.getCycle(); if (currentTime == 0) whoAmI = node;
Iterator iter = incomingQueue.iterator(); while (iter.hasNext()) { SMessage mes = (SMessage) iter.next(); if (mes.hops == (currentTime - mes.start + 1)) continue; Integer actual = (Integer) this.messageTable.get(mes); int index = (actual != null ? actual.intValue() + 1 : 1); this.messageTable.put(mes, new Integer(index)); this.process(mes); iter.remove(); } }
public abstract void process(SMessage mes);
06/04/05 25
Search Protocol Code (2/3)
public void send(Node n, SMessage mes) { try { SMessage copy = (SMessage) mes.clone(); copy.hops++; this.messageTable.put(mes, new Integer(1)); SearchProtocol sp = (SearchProtocol) n.getProtocol(pid); sp.incomingQueue.add(copy); } catch (CloneNotSupportedException ex) ex.printStackTrace(); }
public void forward(Node n, SMessage mes) {
if (mes.hops < ttl) { try { //clone message and update TTL: SMessage copy = (SMessage) mes.clone(); copy.hops++; SearchProtocol sp = (SearchProtocol) n.getProtocol(pid); copy.type = SMessage.FWD; sp.incomingQueue.add(copy); } catch (CloneNotSupportedException cnse) System.out.println("Troubles with message cloning...!"); } }
06/04/05 26
Search Protocol Code (3/3)
protected int[] matches(int[] keys) { int[] result = null; ArrayList temp = new ArrayList(); for (int i = 0; i < keys.length; i++) { if (this.keyStorage.containsKey(new Integer(keys[i]))) temp.add(new Integer(keys[i])); } if (temp.size() > 0) { result = new int[temp.size()]; for (int i = 0; i < temp.size(); i++) result[i] = ((Integer) temp.get(i)).intValue(); } return result; }
public void addQueryData(int cycle, int[] keys) { this.queryDistro.put(new Integer(cycle), (Object) keys); }
public void addKeyStorage(Map entry) { this.keyStorage.putAll(entry); }
06/04/05 27
Linkable Interface Implementation
public boolean addNeighbor(peersim.core.Node neighbour) { view.add(neighbour); return true; }
public boolean contains(peersim.core.Node neighbor) { return this.view.contains(neighbor); }
public int degree() { if (pid == linkID) return this.view.size(); else { Linkable l = (Linkable) whoAmI.getProtocol(linkID); return l.degree(); } }
public peersim.core.Node getNeighbor(int i) { Node result = null; if (pid == linkID) { result = (Node) this.view.get(i); } else { // uses another Linkable Linkable l = (Linkable) whoAmI.getProtocol(linkID); result = l.getNeighbor(i); } return result; }
06/04/05 28
SearchDataInitializer
Features handled by the initializer: keywords: the number of distinct keywords; query_nodes: how many nodes can emit
queries (default = network size); max_queries: the maximum number of queries
emitted by a single node (default = unlimited); query_interval: average time interval between
queries (default = 10); and_keys: if a match is in and or not;
06/04/05 29
SMessage Code:
public class SMessage implements Cloneable { public static final int QRY = 0; public static final int FWD = 1; public
static final int HIT = 2; private static int seq_generator = 0; public int hops, type, seq, start; public Node originator; // the query producer public int[] payload; // an array of keys
public SMessage(Node originator, int type, int hops, int[] payload) { this.originator = originator; this.type = type; this.hops = hops; this.payload = payload; this.seq = ++seq_generator; this.start = CommonState.getCycle(); }
public Object clone() throws CloneNotSupportedException { SMessage m = (SMessage) super.clone(); return m; }
public int hashCode() { return seq; }
public boolean equals(Object obj) { return (obj instanceof SMessage) && (((SMessage) obj).seq == this.seq); }}
06/04/05 30
The Observer
The Idea is that for each node the MessageTable is scanned and for each node seen, a special statistic object is created;
After the collectiong phase the following is printed for each query: Sequence number; Age of the query; Number of nodes having see the query; Number of hits; Number of messages sent on behalf of this
query;
06/04/05 31
Random Walk Search Protocol
Implements a basic (stupid) random walk search;
Based on top of SearchProtocol;
What to do? Implement the process() abstract method to
handle any incoming query packet; Define your own active search strategy rewriting
NextCycle(), but call the superclass NextCycle() as a first step!
06/04/05 32
RW Search Protocol Code
public class RWProtocol extends SearchProtocol { public static final String PAR_WALKERS = "walkers"; protected int walkers;
public RWProtocol(String prefix, Object obj) { super(prefix, obj); walkers = Configuration.getInt(prefix+"."+PAR_WALKERS, 1); } public void process(SMessage mes) { boolean match = this.match(mes.payload); if (match) this.notifyOriginator(mes); Node neighbor = this.getRNDNeighbor(); this.forward(neighbor, mes); } public void nextCycle(peersim.core.Node node, int protocolID) { super.nextCycle(node, protocolID); int[] data = this.pickQueryData(); // if we have to produce a query... if (data != null) { SMessage m = new SMessage(node, SMessage.QRY, 0, data); for (int i = 0; i < this.walkers && i < this.degree() ; i++) { this.send((Node) this.getNeighbor(i) , m); } } }
06/04/05 33
Isearch Configuration
random.seed 1234567890simulation.cycles 300simulation.shuffle
overlay.size 100
protocol.search isearch.RWProtocolprotocol.search.ttl 100
init.0 peersim.dynamics.WireRegularRandominit.0.protocol searchinit.0.degree 10
init.1 isearch.SearchDataInitializerinit.1.protocol searchinit.1.keywords 10000init.1.query_nodes 100init.1.query_interval 1init.1.max_queries 1init.1.and_keys 0
observer.0 isearch.SearchObserverobserver.0.protocol searchobserver.0.verbosity 1observer.0.clean_cache
06/04/05 34
Links:
Bison project publication list:http://www.cs.unibo.it/bison/pubs/list.shtml
iSearch cvs (pserver): [email protected]:/home/cvs/rep
Peersim site: http://peersim.sf.net Peersim tutorials:
http://peersim.sourceforge.net/#docs Delis project: http://delis.upb.de/