-
Notifications
You must be signed in to change notification settings - Fork 1
IncQuery D Incremental Graph Search in the Cloud
######Tags: IncQuery publication
Authors: Benedek Izsó, Gábor Szárnyas, István Ráth and Dániel Varró This benchmark page was created to supplement the article: IncQuery-D: Incremental Graph Search in the Cloud. The benchmark is based on the TrainBenchmark's RouteSensor well-formedness constraint. See the metamodel and the query description.
###Benchmarking environment
####Technical details
The exact versions of the used software tools and parameters of the measurement hardware are shown in the following list. Execution times were recorded using the System.nanoTime() but in the diagrams only milliseconds are shown.
- Software:
- Ubuntu 12.10 64 bit
- Oracle JDK 1.7
- Neo4j 1.8
- Akka 2.1.2
- Hardware:
- CPU: 2 cores of an Intel® Xeon® Processor L5420 processor @ 2.5 GHz
- 16 GB RAM
###Measurement process
####Generating instance models
We used the TrainBenchmark's generator project to generate the Neo4j GraphML files in different sizes. The model generator instantiated generated the property graph models in different sizes ranging from a few thousand elements up to approx. 8×106, to scale the experiment up to large model sizes reported in the industry. The generator randomly introduced faulty element configurations into the model (with approx. hit rates of 10% for the RouteSensor requirement).
###Generating graph segments
To create different shards, we derived a unique graph ("graph segment") for each virtual machine. We generate the graph segments by appending a number in front of each "idx" (our custom surrogate-key identifier). Note that the maximum idx in the size 2048 file is 11382691, so if we append a 40000000 (20000000, ...) in front and we'll get 4000000011382691 (~2 pow 52), which fits easily in a long.
cat testBig_User_512.graphml | sed s/idx\"\>/idx\"\>10000000/g > testBig_User_512_A.graphml
Script for generating all segments:
#!/bin/bash
graphs=(A B C D)
rm -rf segments
mkdir segments
for (( i = 0; i < ${#graphs[@]}; i++ )); do
echo ${graphs[$i]}
idx=$((i+1))
for f in *.graphml; do
echo $f;
cat $f | sed "s/idx\">/idx\"\>${idx}0000000/g" > segments/${f/\.graphml/_${graphs[$i]}.graphml}
done
done;
Separate scripts for each segments (e.g. if you wish to generate the models separately on each server):
for f in *.graphml; do
echo $f;
cat $f | sed "s/idx\">/idx\"\>10000000/g" > ~/bigmde/${f/\.graphml/_A.graphml}
done
for f in *.graphml; do
echo $f;
cat $f | sed "s/idx\">/idx\"\>20000000/g" > ~/bigmde/${f/\.graphml/_B.graphml}
done
for f in *.graphml; do
echo $f;
cat $f | sed "s/idx\">/idx\"\>30000000/g" > ~/bigmde/${f/\.graphml/_C.graphml}
done
for f in *.graphml; do
echo $f;
cat $f | sed "s/idx\">/idx\"\>40000000/g" > ~/bigmde/${f/\.graphml/_D.graphml}
done
###Settings
- See Neo4j's Linux specific notes and set up your Linux servers accordingly:
- Edit the /etc/security/limits.conf as root and add these two lines:
your_username soft nofile 40000
your_username hard nofile 40000
- Edit the /etc/pam.d/su file as root. Uncomment or add the following line:
session required pam_limits.so
- Restart the machine.
Settings in the akka-2.1.2/config directory.
- common.conf
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
netty {
hostname = "10.6.21.231"
}
}
}
- project files
- src/main/resources directory:
- application.conf
- src/main/resources directory:
calculator {
include "common"
akka {
remote.netty.port = 2552
}
}
remotecreation {
include "common"
akka {
actor {
deployment {
/SwitchPosition_switchActor {
remote = "akka://ReteNet@10.6.21.231:2552"
}
/Route_switchPositionActor {
remote = "akka://ReteNet@10.6.21.233:2552"
}
/TrackElement_sensorActor {
remote = "akka://ReteNet@10.6.21.235:2552"
}
/Route_routeDefinitionActor {
remote = "akka://ReteNet@10.6.21.237:2552"
}
/JoinNode1 {
remote = "akka://ReteNet@10.6.21.233:2552"
}
/JoinNode2 {
remote = "akka://ReteNet@10.6.21.235:2552"
}
/AntiJoinNode {
remote = "akka://ReteNet@10.6.21.237:2552"
}
/ProductionNode {
remote = "akka://ReteNet@10.6.21.231:2552"
}
}
}
remote.netty.port = 2554
}
}
- common.conf: the localhost IP address (opposed to the common.conf file in the microkernel's config directory)
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
netty {
hostname = "127.0.0.1"
message-frame-size = 10000000000
}
}
}
- config.properties
GRAPHML_PREFIX = /home/szarnyasg/bigmde/testBig_User_
GRAPHML_EXTENSION = .graphml
MODELSIZE = 1
VM0 = 10.6.21.231
VM1 = 10.6.21.233
VM2 = 10.6.21.235
VM3 = 10.6.21.237
####Deploy
Script for deploying to the cloud:
#!/bin/bash
# constants
user=szarnyasg
akkaver=2.1.2
akkadir=~/akka-$akkaver
projectname=bigmde.incqueryd
projectdir=~/git/incqueryd/$projectname
machines=(vcl0 vcl1 vcl2 vcl3)
# variables
maven=true
coordinator=${machines[0]}
cd $projectdir
mvn clean install
mv target/$projectname*.jar target/$projectname.jar
# copying to coordinator
echo $coordinator
scp target/$projectname.jar $user@$coordinator:$akkadir/deploy/
for ((i = 1; i < ${#machines[@]}; ++i))
do
machine=${machines[i]}
echo $machine
ssh $user@$coordinator "scp $akkadir/deploy/$projectname.jar $user@$machine:$akkadir/deploy"
done
cd
echo Done.
####Memory settings
- Akka: in the distributed-rete/akka-conf/bin/akka file:
[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xms3500M -Xmx3500M -Xss1M -XX:MaxPermSize=256M -XX:+UseParallelGC"
- Neo4j: in the distributed-rete/neo4j-conf/neo4j-wrapper.conf file:
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=3500
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=3500
###Measurement results