Benchmarking von Graphdatenbanken

Werbung
Fakultät Informatik Institut für Systemarchitektur
Benchmarking von Graphdatenbanken
Matthias Jordan
Matrikelnummer: 3664069
Großer Beleg
Betreuer
Benjamin Schiller
Hannes Voigt
Selbstständigkeitserklärung
Ich erkläre hiermit, dass ich die vorliegende Arbeit selbstständig und ohne Benutzung anderer
als der angegebenen Hilfsmittel angefertigt habe. Die aus fremden Quellen wörtlich oder sinngemäß übernommenen Gedanken sind als solche kenntlich gemacht. Ich erkläre ferner, dass
ich die vorliegende Arbeit an keiner anderen Stelle als Prüfungsarbeit eingereicht habe oder
einreichen werde.
Ort, Datum
Matthias Jordan
Zusammenfassung
Facebook, Instagram, Twitter und YouTube sind prominente Beispiele für Plattformen, welche
Menschen miteinander vernetzen und deren Anzahl an Benutzern stetig wächst. Daraus ergibt
sich die Notwendigkeit in Verbindung stehende Daten effizient speichern und verarbeiten zu
können.
Für das Abbilden und Speichern von Netzwerken in einem Computersystem eigenen sich
Graphdatenbanken (GDBs). Die Verknüpfung der Informationen entspricht dabei dem Property-Graph-Modell, wobei Graphen in ihrem Aufbau den Netzwerken gleichkommen und aus
Kanten und Knoten bestehen. Im Vergleich dazu gibt es relationale Datenbanken, die in der
Praxis weitverbreitet sind und ebenfalls auf mehrstelligen Relationen beruhen. Das Abbilden
von Netzwerken ist grundsätzlich in relationalen Datenbanken möglich, jedoch stoßen diese
Datenbanken bei der Traversierung von Netzwerken an die Grenzen des Datenmodells. Aus
diesem Grund ist es erforderlich sich mit GDBs weiter auseinanderzusetzen. Um verschiedene Datenbanken bezüglich ihrer Leistung voneinander abgrenzen zu können, bedarf es der
Definition von Benchmarks.
Dynamic Network Analyzer (DNA) ist ein Framework zur Analyse von statischen und dynamischen Systemen. Im Mittelpunkt der Arbeit steht die Integration von GDBs in DNA. In
der ersten Ausbaustufe finden Datenbanken Berücksichtigung, die das Tinkerpop Blueprints
Interface implementieren. Dadurch können gleiche Zugriffszeiten aus DNA heraus auf die verschiedenen Datenbanken und somit die Vergleichbarkeit von Messergebnissen gewährleistet
werden. Die Messwerterfassung erfolgt für die GDBs Bitsy, Neo4J, OrientDB und TinkerGraph. Mit dieser wird die Durchführbarkeit eines Benchmarks unter Nutzung der vorliegenden Implementierung aufgezeigt. Ein möglicher Benchmark mit Tiefensuche, Breitensuche,
lokalem Clustering-Koeffizienten, Knoten- und Kanteniteration wird vorgestellt und die erfassten Messwerte für verschiedene Graphtopologien werden bezüglich ihrer Laufzeit verglichen.
Mit der Arbeit wurde die Grundlage geschaffen GDBs mithilfe des DNA Frameworks bezüglich ihrer Leistung zu vergleichen. Dafür kann auf die vorhandenen Graphgeneratoren zugegriffen werden, die die GDBs befüllen, auf denen anschließend selbst definierte Benchmarks
ausgeführt werden können. Für Benchmarks, unter Berücksichtigung des eigenen Datenbestandes, bedarf es jedoch der Erweiterung des bestehenden Quellcodes.
Inhaltsverzeichnis
Zusammenfassung
Abkürzungsverzeichnis
III
1 Einleitung
1
2 Benchmarking von Graphdatenbanken
3
2.1 Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.2 Graphdatenbank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.3 Benchmarks und deren Relevanz . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.4 Existierende Benchmarks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
3 Implementierung
9
3.1 Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
3.1.1 DNA - Dynamic Network Analyzer . . . . . . . . . . . . . . . . . . . . . . .
9
3.1.2 Tinkerpop Blueprints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2 Verwendete Graphdatenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 Graphdatenbanken in DNA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4 Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4 Messwerterfassung
14
4.1 Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.2 Ergebnisse und Auswertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2.1 Graphgenerierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2.2 BFS und DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.3 Knoteniteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.4 Kanteniteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.5 Lokaler Clustering-Koeffizient . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2.6 Resultate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5 Ausblick
22
Anhangsverzeichnis
23
Anhang
24
Abbildungsverzeichnis
29
I
Tabellenverzeichnis
30
Quellenverzeichnis
31
II
Abkürzungsverzeichnis
BFS Breadth-First-Search\Breitensuche
CPU Central Processing Unit\Zentrale Prozessoreinheit
DFS Depth-First-Search\Tiefensuche
DNA Dynamic Network Analyzer
GDB Graphdatenbank
HPC High-Performance-Computing\Hochleistungsrechnen
LDBC Linked Data Benchmark Council
MVCC Multiversion Concurrency Control
RDB Relationale Datenbank
SNB Social Network Benchmark
SPB Semantic Publishing Benchmark
SQL Structured Query Language
SSD Solid State Disk\Solid State Drive
TPC Transaction Processing Performance Council
VM Virtuelle Maschine
III
1 Einleitung
Es gibt mehr als 100 verschiedene Soziale Netzwerke auf der Welt, zu den bekanntesten zählen
sicherlich Facebook, Instagram, Twitter oder YouTube. Knapp ein Siebtel der Weltbevölkerung nutzte im August 2015 Facebook [vgl. 10, 18], damit zählt die Plattform zu einem der
meist genutzten Sozialen Netzwerke weltweit. Mit der steigenden Anzahl an Benutzern wächst
die Notwendigkeit, die produzierten Daten effizient speichern und verarbeiten zu können.
Für das Abbilden und Speichern von Nutzerbeziehungen in einem Computersystem eignen
sich Graphdatenbanken (GDBs), diese vernetzen Informationen über Knoten und Kanten.
Dabei können die Nutzer als Knoten und ihre Beziehungen untereinander als Kanten modelliert werden, wie in der Abbildung 1.1 vereinfacht dargestellt.
Abbildung 1.1: Vernetzung der Facebook-Nutzer weltweit
Quelle: www.facebook.com [11]
Nicht alle GDBs eignen sich für den eigenen Anwendungsfall. Sie können sich beispielsweise
hinsichtlich der Performanz beim Hinzufügen von Knoten und Kanten oder der Traversierung
durch den Graphen unterscheiden. Benchmarks dienen als Grundlage für den Vergleich von
ähnlichen Systemen. Mit Hilfe der in einem Benchmark erfassten Messwerte kann man für
eine Problemstellung die bestmögliche GDB finden.
Im Speziellen befasst sich die Arbeit mit der Integration von GDBs in das bestehende
Framework Dynamic Network Analyzer (DNA), welches zur Untersuchung von dynamischen
Systemen eingesetzt wird. Das Ziel ist es dabei eine Möglichkeit zu schaffen, die verschiedenen Implementierungen von Datenbanken hinsichtlich deren Speicherverbrauch, Zugriffs- und
1
Laufzeiten von Metriken miteinander zu vergleichen.
Die Arbeit gliedert sich im Folgenden in vier Kapitel. Die theoretischen Grundlagen werden in Kapitel 2 erläutert. Sie beinhalten Definitionen, die im Zusammenhang mit GDBs
stehen und heben darüber hinaus die Relevanz von Benchmarks für GDBs hervor. Im daran
anschließenden Kapitel 3 werden die Implementierungsdetails, um GDBs in DNA nutzen zu
können, besprochen. Mit Kapitel 4 werden im Anschluss die erfassten Messwerte präsentiert
und ausgewertet. Die Ergebnisse des durchgeführten Benchmarks werden dabei grafisch dargestellt und näher beleuchtet. Im abschließenden Kapitel 5 wird ein Ausblick auf mögliche
Erweiterungen zur derzeitigen Implementierung gegeben und ein Fazit gezogen.
2
2 Benchmarking von Graphdatenbanken
Relationale Datenbanken (RDBs) zählen in der Praxis wohl zu den am weitverbreitetsten
und bekanntesten Systemen. Seit 2000 wird in der Firma NeoTechnology die Entwicklung von
GDBs vorangetrieben (Abbildung 2.1), da die RDBs bei der Traversierung von Graphen an
die Grenzen des Datenmodells stoßen.
Abbildung 2.1: Entwicklung von Neo4J bei NeoTechnology
Quelle: www.neo4j.com [14]
Das folgende Kapitel befasst sich mit den Grundlagen: GDBs und Benchmark. Das Kapitel
2.1 widmet sich dem Begriff des Graphen und dessen mathematischer Definition. Dieser bildet
die Basis für GDBs. In Kapitel 2.2 werden GDBs den RDBs gegenübergestellt und gegeneinander abgegrenzt. Die Entwicklung von GDBs schreitet zunehmend voran, um diese bezüglich
ihrer Leistung voneinander abzugrenzen werden Benchmarks definiert. In Kapitel 2.3 wird auf
die Relevanz von Benchmarks in der Praxis eingegangen und im daran anschließenden Kapitel
2.4 werden bereits existierende Benchmarks für GDBs vorgestellt.
2.1 Graph
Es seien V eine Menge an Knoten und E eine Menge von Kanten. Ein geordnetes Paar (V, E),
bezeichnet man dann als Graphen G. Die Knoten sind dabei immer paarweise über eine
Kante miteinander verbunden. Die Kanten eines Graphen können gerichtet oder ungerichtet
sein. Man spricht von einem gerichteten Graphen, wenn die Kanten des Graphen geordnete
Paare der Form (v, w) ∈ E wobei v, w ∈ V sind. Eine grafische Darstellung eines gerichteten
Graphen zeigt die Abbildung 2.2. Die Kanten eines ungerichteten Graphen sind hingegen
ungeordnete Paare der Form {v, w} ∈ E wobei v, w ∈ V .
3
Abbildung 2.2: Beispiel für einen einfachen gerichteten Graphen
2.2 Graphdatenbank
Bei Mehrstelligen Relationen handelt es sich um eine Menge von Tupeln mit gleicher Länge,
wobei die Länge n ≥ 2 ist. Sie bilden die Grundlage für das relationale Modell und die Abfragesprache SQL [vgl. 8]. RDBs speichern Informationen in Tabellen und realisieren Beziehungen
zwischen diesen über Schlüsselpaare, in Abbildung 2.3 wird dies vereinfacht dargestellt.
Abbildung 2.3: Beispiel einer Relation
GDBs beruhen ebenfalls auf mehrstelligen Relationen, speichern aber im Gegensatz zu den
RDBs die Beziehungen explizit. Die meisten nutzen dabei das Property-Graph-Modell. Im
Vergleich zu einem einfachen Graphen, wie in Abbildung 2.2 dargestellt, können Knoten und
Kanten im Property-Graphen Eigenschaften besitzen. Eine mögliche Erweiterung des Graphen
in Abbildung 2.2 besteht zum Beispiel im Speichern von personenbezogenen Daten, wie dem
Geburtstag im Knoten und dem Eintrittstermin in die Firma für die Kante.
GDBs bieten eine Alternative zur Speicherung und Verarbeitung von in Beziehung stehenden Informationen und damit auch zu den gebräuchlichen RDBs. Aufgrund dieses ähnlichen
Ansatzes ist eine Überführung der Daten zwischen den Systemen möglich.
2.3 Benchmarks und deren Relevanz
Der Duden definiert den Begriff Benchmark als „Maßstab für den Vergleich von Leistungen“
[7]. Anwendung finden Benchmarks zum Beispiel beim Vergleich von Unternehmen, Produkten
4
oder Computersystemen. Es können gesamte Systeme oder nur bestimmte Details untersucht
und verglichen werden. Die Leistung wird dabei über definierte Indikatoren gemessen. Für
GDBs können dies der Speicherverbrauch, die Laufzeit für die Berechnung einer Metrik oder
auch die Dauer für das Hinzufügen von Kanten sein. Nachdem man mehrere Systeme unter
dem gleichen Maßstab getestet hat, erfolgt eine Evaluation. Daraus ergeben sich Schlussfolgerungen für die Optimierung von Prozessen oder für die Wahl einer effizienten Datenbank,
entsprechend dem eigenen Anwendungsfall.
Für das Projekt SocialSensor1 wurde ein Vergleichsmaßstab benötigt, um auf dessen Grundlage sich für eine passende GDB zu entscheiden. Der zentrale Anwendungsfall war dabei die
performante Entdeckung von Communities in sozialen Netzwerken. Die Verantwortlichen entwickelten daraufhin ihren eigenen Benchmark, da sie auf keinen bestehenden zurückgreifen
konnten. Für den Benchmark, der drei zu vergleichenden GDBs Neo4J, OrientDB und Titan,
wurden 4 Workloads verwendet:
• Clustering [vgl. 2, Kapitel 3.1]:
nutzt die Louvain-Methode [vgl. 3] zur Entdeckung von Communities
• Massive Insertion [vgl. 2, Kapitel 3.2]:
GDB neuerstellen, Bulk Load konfigurieren, Datensatz laden, Zeit messen bis kompletter
Graph erzeugt wurde
• Single Insertion [vgl. 2, Kapitel 3.2]:
GDB neuerstellen und Datensatz laden, Commit nach jeder Einfügeoperation, Zeit pro
Block messen, Block besteht aus 1000 Kanten und aus Knoten die beim Einfügen mit
betrachteten wurden
• Query [vgl. 2, Kapitel 3.2]:
Abfrage über die Nachbarn aller Knoten oder über adjazente Knoten für alle Kanten, Suche
nach dem kürzesten Pfad zwischen dem ersten Knoten und 100 zufälligen Knoten
Als Ergebnis weist die Publikation von Beis, Papadopoulos und Kompatsiaris [vgl. 2] Neo4J
als beste GDB für „das Speichern und Abfragen von Graphdaten“ [2, Kapitel 6, S. 11]2 großer
Datensätze aus. Laut der Untersuchung eignet sich OrientDB eher für viele aufeinanderfolgende lokale Abfragen und die dritte getestete GDB, Titan, für einzelne Einfügeoperationen.
In einem Webinar3 des CEO von Neo Technology, Emil Eifrem, wird die Performanz von
GDBs den RDBs gegenübergestellt. Grundlage des ersten Tests war ein Datensatz mit 1000
Personen, die durchschnittlich 50 Freunde haben. Die Aufgabe der Datenbanken bestand darin
einen Pfad zwischen zwei Personen A und B innerhalb von vier Schritten zu finden. Im Ergebnis benötigte die RDB, welche nur als bekannte Open-Source-Datenbank spezifiziert wurde,
2000 ms und Neo4J 2 ms. Im zweiten Test, bei gleicher Aufgabenstellung, wurde ein Datensatz
mit 1 Million Personen und durchschnittlich 50 Freunden herangezogen. Neo4J benötigte für
diese Abfrage 2 ms, wobei die Abfrage für die RDB nach mehreren Tagen abgebrochen werden
musste. Das Beispiel demonstriert die Notwendigkeit von GDBs in der modernen Datenverarbeitung und -haltung, da bei diesen Anforderungen die RDBs an ihre Grenzen stoßen. Für ein
gutes Marketing ist es jedoch sehr viel interessanter Neo4J mit anderen GDBs zu vergleichen.
1
http://www.socialsensor.eu/
"Neo4J appears to be the most efficient solution for storing and querying graph data."[2, Kapitel 6, S. 11]
3
https://www.youtube.com/watch?v=UodTzseLh04&t=54m
2
5
Für gesicherte Messwerte ist deshalb ein unabhängiger Benchmark notwendig und sehr viel
aussagekräftiger.
2.4 Existierende Benchmarks
Für RDBs gibt es standardisierte und etablierte Benchmarks, wie die vom Transaction Processing Performance Council (TPC)4 bereitgestellten. Entwicklungen in diese Richtung gibt
es auch für GDBs. Das Kapitel gibt einen Einblick über bestehende GDB-Benchmarks.
Eine der Organisationen, die sich mit der Definition von Benchmarks befasst, ist das Linked
Data Benchmark Council (LDBC)5 . Ähnlich wie das TPC entwickeln die Mitglieder des
LDBC, zu denen unter anderem Firmen aber auch wissenschaftliche Einrichtungen zählen,
Benchmarks beziehungsweise Workloads, die sich an realen Anwendungsfällen orientieren. Im
Dezember 2015 stellte das LDBC zwei verschiedene Benchmarks zur Verfügung:
• Semantic Publishing Benchmark (SPB) - für RDF Systeme6
• Social Network Benchmark (SNB)7
– Interactive Workload:
„nur lesende Abfragen mit gleichzeitigen Einfügeoperationen“ [9, Kapitel 1, SNB-Interactive]8
– Business Intelligence Workload:
„Abfragen, die auf einen großen Anteil aller Einträge zugreifen“ [9, Kapitel 1, SNB-BI]9
– Graph Analytics Workload:
PageRank, Community Detection, Clustering, Breitensuche (BFS) [vgl. 9, Kapitel 1,
SNB-Algorithms]
Die Spezifikation des Interactive Workloads wurde in der vorläufigen Version 0.2.2 am 20.
April 2015 auf Github veröffentlicht10 . Im Vergleich dazu befinden sich die anderen beiden
Workloads für SNB noch in der Entwicklung. Zu den bereits veröffentlichten Komponenten
des SNB zählt unter anderem der Graphgenerator „datagen“, der realistische und skalierbare
Graphen verschiedener Größe erzeugen kann.
Das Projekt Graphalytics11 , der Technischen Universität Delft, „konzentriert sich auf das
Verständnis, wie die Leistung der Graph-Analytik-Plattformen von dem Eingabedatensatz,
dem Analyse-Algorithmus und der bereitgestellten Infrastruktur abhängt“ [13, Kapitel 1,
S. 2]12 . Anwendung findet der GDB-Benchmark für verteilte Systeme (Giraph, GraphX, Hadoop), aber auch für traditionelle GDBs (Neo4J) [vgl. 4, Kapitel 1, S. 1; Kapitel 3.2, S. 4].
Graphalytics kooperiert unter anderem mit dem LDBC und verwendet dessen Graphgenerator in einer modifizierten Variante zur Unterstützung verschiedener Charakteristiken von
4
http://www.tpc.org/
http://ldbcouncil.org/
6
http://ldbcouncil.org/benchmarks/spb
7
http://ldbcouncil.org/benchmarks/snb
8
„[c]oncurrent with these read-only queries is an insert workload“ [9, Kapitel 1, SNBInteractive]
9
„queries that access a large percentage of all entities in the dataset “ [9, Kapitel 1, SNB-BI]
10
https://github.com/ldbc/ldbc_snb_docs/blob/master/LDBC_SNB_v0.2.2.pdf
11
http://graphalytics.ewi.tudelft.nl/
12
„focuses on understanding how the performance of graph analytics platforms depends on the input dataset,
on the analytics algorithm, and on the provisioned infrastructure“ [13, Kapitel 1, S. 2 ]
5
6
Graphen [vgl. 4, Kapitel 2.2, S. 3].
Graph50013 definiert Benchmarks für die Verarbeitung von Graphen, die im Bereich Hochleistungsrechnen (HPC) Anwendung finden. Für das Benchmarking stellt Graph500 derzeit
eine Spezifikation [vgl. 12] und verschiedene Referenzimplementierungen14 zur Verfügung.
Grundlage für den Benchmark 1 „Search“ ist die Erzeugung einer Kantenliste, deren Größe
sich zwischen circa 17 GB (toy) und 1.1 PB (huge) bewegen kann. Anschließend wird daraus
ein gewichteter, ungerichteter Graph erzeugt und eine BFS ausgeführt [vgl. 12, Kapitel 1]. Die
Zeiterfassung erfolgt für die Generierung des Graphen und für die Ausführung der BFS. Diese
erhobenen Werte, einschließlich der maximal gelösten Problemgröße, werden unter anderem
für die Evaluation und für den Vergleich mit anderen Systemen herangezogen. Der erste
Entwurf für diesen Benchmark erfolgte im Juli 2010, am 1. Oktober desselben Jahres erschien
dann die Version 1.0 (aktuelle Version 2.1.4, Stand Dez. 2015). Die erste Veröffentlichung der
Graph500-Liste, die verschiedene Systeme miteinander vergleicht, erfolgte im November 2010.
Neue Listen werden etwa alle sechs Monate veröffentlicht.
XGDBench ist ein Benchmark für GDBs im Cloud-Computing-Bereich. Das Framework
ist in X10 geschrieben, einer von IBM Research entwickelten Programmiersprache, die vor
allem für verteilte System im Bereich des HPC gedacht ist15 . Es werden sieben verschiedene
Workloads in dem Benchmark durchgeführt:
• A: Update heavy: 50% Lesend/ 50% Update
– Abfrage eines Knoten und lesen aller Attribute
– Update-Operationen ändern die Zeit des letzten Logins
• B: Read mostly: 95% Lesend/ 5% Update
– Ähnlich zu A
• C: Read only:
– Nur lesende Operationen
• D: Read latest:
– Einfügen neuer Knoten, sodass Power-Law-Verteilung erhalten bleibt
• E: Short range scan:
– Alle Nachbarn eines Knoten abfragen und deren Attribute lesen
• F: Traverse heavy: 45% Traversierung/ 55% Lesend
• G: Traverse only:
– Nur Traversierungsoperationen [vgl. 6, Kapitel 6, Tabelle 2]
In der Publikation von Dayarathna und Suzumura [vgl. 6] werden die GDBs AllegroGraph,
Fuseki, Neo4J, OrientDB und Titan miteinander verglichen. OrientDB schnitt hinsichtlich der
Performanz beim Laden der Daten und bei den Workloads am besten ab.
GraphBench16 ist eine Graph-Benchmark-Suite, welche verschiedene „Graph Kernels“ [5]
und Datensätze enthält. Entwickelt wird das Projekt durch die Github-Gemeinschaft in Zu13
http://www.graph500.org
http://www.graph500.org/referencecode
15
http://x10-lang.org/articles/79.html
16
https://github.com/uwsampa/graphbench
14
7
sammenarbeit mit Oracle und der University of Washington. Bereitgestellt wird ein Skript
zum Download von realen Datensätzen von Sozialen Netzwerken. Diese umfassen kleine Graphen mit rund 4000 Knoten und 88.000 Kanten (Facebook) bis hinzu Datensätzen mit einer
Größe von 65 Millionen Knoten und 1,8 Milliarden Kanten (Friendster) [vgl. 5, Datasets and
Synthetic data generators]. Darüber hinaus bietet das Projekt einen Generator, der auf dem
Graph500-Generator basiert.
8
3 Implementierung
DNA stellt im Allgemeinen ein Framework zur Analyse von Graphen dar. In Kapitel 3.1.1
wird auf dieses näher eingegangen. Für die Untersuchung von GDBs bedarf es der Erweiterung
des DNA Frameworks. Damit mehrere GDBs in der Arbeit Unterstützung finden, wird das
Framework Tinkerpop Blueprints (Kapitel 3.1.2) verwendet. Es wird von den in Kapitel 3.2
vorgestellten Datenbanken implementiert. Die konkreten Anpassungen des DNA Framworks
werden in Kapitel 3.3 erläutert. Das abschließende Kapitel 3.4 beschreibt den Aufruf der neuen
Funktionen in Java.
3.1 Frameworks
3.1.1 DNA - Dynamic Network Analyzer
Dynamic Network Analyzer (DNA)1 ist ein in Java verfasstes Framework zur Untersuchung
von statischen und dynamischen Systemen. Das Hauptaugenmerk liegt jedoch auf der Analyse
von Netzwerken, die sich über die Zeit verändern. Soziale Netzwerke und Transportnetze sind,
entsprechend der Publikation von Schiller und Strufe [vgl. 17, S.1], diesen zu zuordnen. Der
DNA enthält verschiedene Bausteine, die im Rahmen der Arbeit Anwendung finden:
• Die Komponente des „Graphgenerators“ kann zufällige Graphen, Barabsi-Albert-Graphen
oder auch Ringe generieren, sowie solche aus Dateien auslesen. Die zur Speicherung des
Graphen verwendeten Datenstrukturen können je nach den Bedürfnissen des Anwenders
verändert oder getauscht werden, um den Einfluss der Datenstrukturen auf Speicher und
Laufzeit zu testen. Dafür stehen neben Arrays und Hashmaps viele weitere Datenstrukturen
zur Verfügung.
• Die Metrikkomponente stellt häufig genutzte Metriken der Graphentheorie, wie zum Beispiel Clustering-Koeffizient oder ShortestPath, zur Verfügung. Ferner unterstützt diese den
Vergleich von verschiedenen Implementierungen der gleichen Metrik hinsichtlich Korrektheit und den erfassten Messwerten.
• Es gibt drei Komponenten für die Visualisierung der Resultate:
– Visualization - live Visualisierung, vor allem für dynamische Systeme
– Plot - Darstellung mittels GnuPlot2
– LaTeX - Ausgabe aller Eingabeparameter und Resultate als LaTeX-Dokument.
Das Framework wurde als Open Source unter der GNU General Public License veröffentlicht.
Der Quellcode ist auf GitHub3 gehostet.
1
http://www.dynamic-networks.org/dna
http://www.gnuplot.info/
3
https://github.com/BenjaminSchiller/DNA
2
9
3.1.2 Tinkerpop Blueprints
Für die Integration von GDBs in DNA fiel die Entscheidung auf Tinkerpop Blueprints4 , da
bereits ein Vielzahl an kommerziellen und freien Datenbanken dieses Framework unterstützen.
Blueprints umfasst Interfaces, Implementierungen, Testsuiten und arbeitet dabei mit dem
Property-Graph-Modell. Durch die Verwendung von Blueprints bietet sich die Möglichkeit
in Zukunft weitere GDBs für die Nutzung mit DNA ohne großen Anpassungsaufwand des
Quelltextes hinzuzufügen. Bei der Implementierung kam Blueprints in der Version 2.6.0 zum
Einsatz.
3.2 Verwendete Graphdatenbanken
Im Folgenden werden die GDBs Bitsy5 , Neo4J6 , OrientDB7 und TinkerGraph8 vorgestellt,
welche in DNA integriert wurden. Alle verwendeten Datenbanken haben gemein, dass sie
die Interfaces von Tinkerpop Blueprints implementieren. Die GDBs Bitsy, OrientDB und
TinkerGraph werden in der In-Memory-Variante genutzt. Das heißt alle Daten werden lediglich
im Speicher gehalten und nicht persistiert. Bitsy wird neben Neo4J zusätzlich auch für die
persistente Speicherung des Graphen genutzt.
Bitsy
Bitsy ist eine „kleine, schnelle, integrierbare, persistente In-Memory-Graphdatenbank“ [19],
die unter der GNU Affero General Public License Version 3 als freie Software veröffentlicht
wurde. Bitsy unterstützt die ACID-Eigenschaft (Atomarität, Konsistenz, Isolation und Dauerhaftigkeit) für Transaktionen und nutzt, um Konsistenz zu gewährleisten, optimistisches
Locking. In der Arbeit findet die Version 1.5.1 Anwendung.
Neo4J
Neo4J wurde im Jahr 2007 von NeoTechnology veröffentlicht und zählt heute, nach Aussage
des Konzerns, zu den führenden GDBs auf dem Markt [vgl. 14]. Eine Vielzahl namhafter
Firmen, darunter das Internetauktionshaus Ebay oder die Fluggesellschaft Lufthansa [vgl.
15], zählen zu den Nutzern. Neo4J unterstützt die ACID-Eigenschaft für Transaktionen und
nutzt pessimistisches Locking. Es gibt die Datenbank in einer Community und einer Enterprise
Edition, wobei Ersteres in der vorliegenden Implementierung in der Version 2.0.1 zum Einsatz
kommt.
OrientDB
OrientDB ist eine Multi-Model-Datenbank, das heißt sie „unterstützt das Graphen-, Dokumenten-, Key/Value- und das Object-Modell“ [16, Multimodel, NoSQL Models]. OrientDB
4
https://github.com/tinkerpop/blueprints/wiki
https://bitbucket.org/lambdazen/bitsy
6
http://neo4j.com
7
http://orientdb.com
8
https://github.com/tinkerpop/blueprints/wiki/TinkerGraph
5
10
unterstützt die ACID-Eigenschaft für Transaktionen. Für die Gewährleistung der Konsistenz
nutzt die Datenbank Multiversion Concurrency Control (MVCC). Ähnlich wie Neo4J gibt es
auch OrientDB als Community und Enterprise Edition. Anwendung findet die CommunityEdition in der Version 2.0.12.
TinkerGraph
TinkerGraph ist die Referenzimplementierung für das Property-Graph-Modell von Tinkerpop
Blueprints und wird in der Version 2.6.0 verwendet.
3.3 Graphdatenbanken in DNA
Bisher gab es drei grundlegende Klassen zu Speicherung von Graphen in DNA: Node, Edge,
Graph. In der Klasse Graph werden Knoten und Kanten in einer frei wählbaren Datenstruktur
gespeichert. Die Klassen Node und Edge stellen Basisklassen dar, von denen für gerichtete und
ungerichtete Graphen entsprechende Klassen abgeleitet sind. In den Knoten werden jeweils
eine Liste für ein- und ausgehende Kanten und für den gerichteten Fall auch benachbarte
Knoten gespeichert.
Mit der Integration von GDB in DNA wird zunächst ein neues Interface, IGraph (Anhang
A.1), eingeführt. Klassen für die Graphrepräsentation in DNA müssen dieses implementieren,
davon betroffen sind Graph und die neu eingeführte BlueprintsGraph. Die Verwendung des
Interfaces IGraph ermöglicht es die Anpassungen des bestehenden Quelltextes so gering wie
möglich zu halten. Darüber hinaus erlaubt das Interface zukünftig weitere GDBs oder andere
Speichermöglichkeiten einzuführen, die nicht Blueprints implementieren und nicht über die
vorhandenen Datenstrukturen abgedeckt werden können. Die vorgenommenen Änderungen
an der ursprünglichen Architektur von DNA, veröffentlicht durch Schiller und Strufe [vgl. 17,
Kapitel 4, Abbildung 2], sind farblich in der Abbildung 3.1 hinterlegt.
Abbildung 3.1: Architektur von DNA
Die aktuelle Implementierung unterstützt drei In-Memory-Varianten (Bitsy, OrientDB und
11
TinkerGraph) und zwei persistente Datenbank-Varianten (Bitsy und Neo4J). Alle in DNA
nutzbaren Graphen können über die neue Klasse DNAGraphFactory erzeugt werden. In der
Tabelle 3.1 werden die unterstützten DNA-Graphtypen aufgelistet.
GF_GraphType
persistent In-Memory
DNA
X
BITSY_DURABLE
X
BITSY_NON_DURABLE
X
CONFIG
(X)9
NEO4J2
X
(X)9
ORIENTDBNOTX
X
TINKERGRAPH
X
Tabelle 3.1: Alle unterstützten DNA-Graphtypen
Der Graphtyp CONFIG liest aus einer Konfigurationsdatei, welche im Anhang A.2 beispielhaft dargestellt ist, die notwendigen Werte zur Erstellung eines DNA-Graphen. Es wird eine
Instanz der Klasse Graph erzeugt, wenn der Parameter GF_GraphType den Wert DNA hat.
Alle anderen in Tabelle 3.1 angegebenen Werte erzeugen jeweils eine neue Instanz der Klasse
BlueprintsGraph. Diese stellt intern eine Verbindung zu der entsprechenden Datenbank her,
beziehungsweise initialisiert die eingebettete GDB.
Für die Ausführung von Operationen auf Knoten und Kanten der Blueprints-GDBs wurden ebenfalls neue Klassen in DNA integriert. Diese erben von den bisherigen Knoten- bzw.
Kanten-Klassen und erweitern sie. Die neuen Klassen enthalten einen Verweis auf die zugehörige Instanz der Klasse BlueprintsGraph. Dies ermöglicht, dass Knoten und Kanten Operationen
auf dem Graphen ausführen, ohne das jede Klasse eine eigene Verbindung zur Datenbank aufbaut. Für gewichtete Knoten und Kanten werden die Gewichte als Properties in der GDB
gespeichert.
Einige GDBs ermöglichen das Speichern von Referenzen auf DNA-Elemente in den Properties, für die anderen GDBs ist es nötig sich die Knoten- und Kanten-Paare in einer separaten Liste zu speichern. Dafür werden die Knoten- beziehungsweise Kantenindizes aus
der Datenbank mit dem DNA-Knoten oder der -Kante in einer Hashmap gespeichert. Um
die Vergleichbarkeit der erfassten Ergebnisse zu gewährleisten, kann durch den Parameter
GF_GDB_STORE_DNA_ELEMENTS_IN_GDB angegeben werden, dass alle Datenbanken gleichermaßen die Liste der DNA-Elemente speichern.
Der Quellcode zu dieser Erweiterung wurde auf GitHub10 veröffentlicht. Ein UML-Klassendiagramm der neu implementierten Klassen ist im Anhang A.3 dargestellt.
9
10
hängt vom Parameter GF_GraphType ab
https://github.com/matjoe/DNA
12
3.4 Anwendung
Zur Nutzung von GDBs in DNA gibt es generell zwei Möglichkeiten. Die Erste besteht darin,
über die neue Klasse GraphFactory sich eine Instanz von Graph oder BlueprintsGraph zu
erzeugen:
1
2
3
IGraph graph = GraphFactory . newInstance ( GraphType . BITSY_NON_DURABLE , name , timestamp ) ;
graph . addNode (...) ;
graph . addEdge (...) ;
4
5
6
// den Graph wieder freigeben / Verbindung zur Datenbank schlie ß en
graph . close () ;
Abbildung 3.2: Anwendungsbeispiel 1
Die zweite Möglichkeit sieht die Änderung der Werte für die Einstellungsparameter entweder
im Quelltext oder in der Konfigurationsdatei selbst vor. Der folgende Code-Ausschnitt zeigt,
wie mit Hilfe eines Graphgenerators und der festgelegten Konfiguration ein Graph in einer
Datenbank erstellt werden kann:
1
2
3
Config . overwrite ( " GF_GRAPHTYPE " , GraphType . TINKERGRAPH ) ;
Config . overwrite ( " G F _ GD B _ W O R K S P A C E " , IOUtils . getPathForOS ( workspace + " GDB / " ) ) ;
Config . overwrite ( " G F _ G D B _ S T O R E _ D N A _ E L E M E N T S _ I N _ G D B " , storeInGDB . toString () ) ;
4
5
Graph Generato r rg = new RandomGraph ( GDS . directedGDB () , nodes , edges ) ;
6
7
8
9
// entweder
Series s = new Series ( rg , ... ) ;
s . generate () ;
10
11
12
13
14
// oder
IGraph graph = rg . generate () ;
graph . addNode (...) ;
graph . addEdge (...) ;
15
16
17
// den Graph wieder freigeben / Verbindung zur Datenbank schlie ß en
graph . close () ;
Abbildung 3.3: Anwendungsbeispiel 2
13
4 Messwerterfassung
Mit der Implementierung folgt im nächsten Schritt die Erfassung von Messwerten, um die
Durchführbarkeit eines Benchmarks aufzuzeigen. In Kapitel 4.1 wird das zugrundeliegende
Setup zur Erhebung der Messwerte vorgestellt. Daran anschließend werden in Kapitel 4.2
die Messergebnisse grafisch präsentiert und ausgewertet. Im Fokus der Auswertung für die
durchgeführten Operationen steht dabei das Kriterium der Laufzeit. Speicher wird zunehmend
günstiger, daher ist der Speicherverbrauch in der heutigen Zeit nicht der wichtigste Faktor
bei der Analyse von GDBs. Zeit hingegen spielt ein wichtige Rolle, da kein Nutzer lang auf
ein Resultat warten möchte. Schnelle Antwortzeiten eines Softwareproduktes steigern dessen
Attraktivität für den Endverbraucher.
4.1 Setup
Die Messungen wurden auf einem System mit 64 CPUs und 512 GB Arbeitsspeicher durchgeführt, wobei jeder Java VM genau ein logischer Prozessor zugewiesen wurde. An den Einstellungen der GDBs wurden keine Optimierung vorgenommen. Die beiden Datenbanken Neo4J
und Bitsy wurden persistent auf eine Solid State Disk (SSD) geschrieben. Des Weiteren wurden alle verwendeten GDBs als eingebettete Datenbank verwendet, das heißt es wurde für
jede Java-Instanz eine eigene Datenbankinstanz erzeugt. Damit liefen sowohl Datenbank, als
auch der dazugehörige Java-Prozess auf demselben Prozessor.
Die Messwerterfassung erfolgte für jeden Schritt des in Abbildung 4.1 dargestellten Ablaufdiagramms. Der ursprüngliche Zustand der Graphen wurde dabei zu Beginn eines jeden
Prozesses variiert. Im Voraus wurde für jede Graphkonfiguration eine Datei erstellt, die für
die Generierung ausgelesen wurde, damit alle GDBs denselben Ausgangszustand haben:
• gerichteter zufälliger Graph
• ungerichteter zufälliger Graph
• gerichteter Barabasi-Albert-Graph
• ungerichteter Barabasi-Albert-Graph
14
Abbildung 4.1: Ablauf der Messung
Für die gerichteten Graphen wurden jeweils 13 und für die ungerichteten Graphen je 12
verschiedene Größen gemessen. Die genaue Auflistung der Parameter für die Generierung der
Graphen ist im Anhang B.1 aufgeführt.
Der Barabasi-Albert-Graph beruht auf dem gleichnamigen Modell von Réka Albert und
Albert-László Barabási [vgl. 1] und stellt einen Graph dar, dessen Anzahl von Kanten pro
Knoten nach einem Potenzgesetz verteilt sind. Diese Graphen ähneln realen Netzwerken, wie
dem Internet, Stromnetzen oder den Verlinkungen zwischen verschiedenen Webseiten [vgl. 1,
Kapitel 2]. Im Gegensatz dazu wurden zufällige Graphen generiert, die keiner bestimmten
Verteilung folgen. Ziel dabei war es festzustellen, ob sich die GDBs für diese Graphen anders
verhalten oder gleiche Tendenzen zu erkennen sind. Für den Vergleich wurden neben den
erwähnten GDBs auch drei DNA-Datenstrukturen gemessen, es handelt sich dabei um:
• Array: Alle Listen werden in Arrays gespeichert.
• HashMultimap: Die globale Kantenliste wird in einer HashMultimap gespeichert, alle anderen Listen werden in Arrays abgelegt.
• Empty: Die globale Kantenliste wird nicht gespeichert, alle anderen Listen werden in Arrays
abgelegt.
Untersucht wurden im Speziellen fünf verschiedene Workloads. Wie in Abbildung 4.1 ersichtlich, wurden jeweils fünf Messungen pro Graph und Workload durchgeführt. Im Folgenden
wird kurz erläutert, was die einzelnen Workloads beinhalten und was ein möglicher Anwendungsfall sein kann:
• Breitensuche (BFS)
– Suche für 20 zufällige Knoten mit 10 Wiederholungen
– Einsatz: Distanzen zwischen zwei Knoten → Beziehungen zwischen zwei Personen
• Tiefensuche (DFS)
– Suche für 20 zufällige Knoten mit 10 Wiederholungen
– Einsatz: Suche nach starken Zusammenhangskomponenten → Suche in sozialen Netzwerken nach Gruppen gleicher Eigenschaft
• Knoteniteration
– einmalige Iteration über die Menge V aller Knoten des Graphen
• Kanteniteration
– einmalige Iteration über die Menge E aller Kanten der Graphen
15
• Lokaler Clustering-Koeffizient
– Berechnung über 20 festgelegte Knoten
4.2 Ergebnisse und Auswertung
4.2.1 Graphgenerierung
Mit zunehmender Kantenanzahl steigt für alle GDBs die Laufzeit bei der Generierung des Graphen auf der Datenbank, dabei benötigten ungerichtete Graphen für alle Datenbanken mehr
Zeit als Digraphen. Dies gilt auch für Barabasi-Albert-Graphen, die eine höhere Laufzeit aufweisen als zufällige Graphen. Besonders langsam bei der Generierung von gerichteten Graphen
ist OrientDB. Zeigt Neo4J für gerichtete Graphen noch eine Laufzeit, die der von DNA Array
ähnelt, schneidet sie für ungerichtete Graphen deutlich schlechter ab. Eine mögliche Ursache kann dabei der größere Funktionsumfang der GDBs sein, was zur längeren Startzeit der
internen Datenbank führen kann. Eine weitere Ursache für die höheren Zeiten beim Schreiben der Graphen kann die Indexerstellung sein, wie sie OrientDB für jeden neuen Knoten
und jede Kante durchführt. Die Indexerstellung stellt gegenüber den DNA-Datenstrukturen
einen Mehraufwand dar und nimmt somit mehr Zeit in Anspruch. Die schnellste Datenbank
im Test war TinkerGraph, diese bietet jedoch nicht die typischen Datenbank-Eigenschaften
(keine Transaktionen, kein ACID). Betrachtet man die Produktivsysteme, so ist Bitsy die
schnellste Datenbank. Die Unterschiede zwischen der persistenten und In-Memory Variante
sind marginal.
Abbildung 4.2: Graphgeneratoren für 1k Knoten und 100k Kanten
Der Speicherverbrauch variiert stark zwischen den verschiedenen Größen der Graphen bei
gleicher Datenbank. Auffällig ist, dass der Speicherverbrauch bei 10k Kanten geringer ist als
bei 5k Kanten. Grund dafür könnte der Aufruf des Garbage Collectors sein und damit die Freigabe des Speichers. Eine hohe Varianz im Speicherverbrauch, zwischen den unterschiedlichen
Durchläufen, liegt bei der Datenbank OrientDB vor.
16
4.2.2 BFS und DFS
Betrachtet werden im Folgenden die Messergebnisse für gerichtete Graphen beider getesteter
Graphtopologien, da diese das Resultat von BFS und DFS kaum beeinflussen. Die Performanz
von Bitsy (persistent, In-Memory) verschlechtert sich mit steigender Kantenanzahl der Graphen. Für kleine Graphen, der Größenordnung 1k Knoten und 1k bis 5k Kanten, ist Bitsy, im
Vergleich zu den anderen getesteten Datenbanken, die Schnellste. Die längste Laufzeit für den
kleinsten getesteten Graphen hat Neo4J. Mit steigender Kantenanzahl ist der Anstieg der benötigten Zeit jedoch deutlich geringer als für die anderen GDBs und Neo4J erweist sich als die
schnellste. Am schlechtesten schneidet OrientDB bei der Durchführung des BFS beziehungsweise DFS ab. Bei einem Graphen mit 1k Knoten und 500k Kanten ist die Laufzeit bereits
21 mal länger, als bei der Referenzimplementierung TinkerGraph. Die DNA-Datenstrukturen,
die in diesem Zusammenhang ebenfalls getestet wurden, weisen mit steigender Kantenanzahl
eine deutlich bessere Performanz als die GDBs auf. Für kleine Graphen (1k Knoten, 1k Kanten) ist das Niveau jedoch auf dem von Bitsy. Abgesehen von kleinen Graphen ergibt sich
folgende Rangordnung der Datenstrukturen bezüglich der Laufzeit: DNA-Datenstrukturen,
Neo4J, TinkerGraph, Bitsy (persistent), Bitsy (In-Memory) und OrientDB.
Abbildung 4.3: BFS für gerichtete zufällige Graphen mit 1k Knoten bei steigender Kantenanzahl
Bei ungerichteten Graphen, unabhängig von der Graphtopologie, ergibt sich eine etwas andere Reihenfolge der GDBs. Die beste Performanz weisen auch hier die DNA-Datenstrukturen,
gefolgt von TinkerGraph, auf. Die persistente Variante von Bitsy ist für ungerichtete Graphen
die Schnellste im Test. Daran anschließend folgen die In-Memory Variante von Bitsy, Neo4J
und OrientDB.
17
Abbildung 4.4: BFS für ungerichtete zufällige Graphen bei 1k Knoten mit steigender Kantenanzahl
4.2.3 Knoteniteration
Die Laufzeitanalyse bei der Knoteniteration für gerichtete Graphen ergibt, dass Neo4J und
OrientDB zu den GDBs gehören, die am schnellsten die Aufgabe lösen konnten. Im Vergleich
dazu sind die DNA-Datenstrukturen, vor allem HashMultimap und Empty, circa vier- bis
sechsmal langsamer. Auffällig ist, dass die Varianzen der Messungen für die DNA-Datenstrukturen sehr hoch sind. Die Gesamtlaufzeit liegt für GDBs als auch DNA-Datenstrukturen
im Millisekundenbereich, die durchschnittlichen Werte bewegen sich im Bereich von 400 µs
bis 13 ms. Ähnliche Ergebnisse erhält man bei der Betrachtung der Messungen für ungerichtete Graphen. Die Laufzeiten sind sehr gering, sie liegen im selben Wertebereich wie für die
gerichteten Graphen. In diesem Test sticht keine GDB eindeutig hervor.
4.2.4 Kanteniteration
Obwohl OrientDB sich für BFS und DFS als langsamste GDB herausstellte, zeigt sich, dass sie
für die Kanteniteration über gerichtete zufällige Graphen, neben Neo4J, eine der schnellsten
Datenbanken ist. Zurückzuführen ist dies vermutlich auf eine globale Kantenliste. Für BFS
und DFS ist diese nicht von Vorteil, da über Kanten in Beziehung stehende Knoten erst
gefiltert werden müssen. Des Weiteren zeigt sich, dass beim Iterieren über die Kanten die DNADatenstruktur, die eine HashMultimap als globale Kantenliste verwendet, eine schlechtere
Performanz als die GDBs aufweist.
18
Abbildung 4.5: Kanteniteration für gerichtete zufällige Graphen mit 1k Knoten
Für gerichtete Barabasi-Albert-Graphen ist nach TinkerGraph, OrientDB ebenfalls die
schnellste Datenbank bei der Kanteniteration. Am schlechtesten schneidet ebenfalls wieder
die DNA-Struktur HashMultimap ab. Für kleine Graphen weisen die DNA-Datenstrukturen
Array und Empty ebenfalls eine schlechtere Performanz, als die getesteten GDBs, auf.
Abbildung 4.6: Kanteniteration für gerichtete Barabasi-Albert-Graphen mit 1k Knoten
Bei ungerichteten Graphen sind ähnliche Ergebnisse zu verzeichnen, wie für gerichtete Graphen. Abweichungen gibt es für kleine Graphen (1k Knoten, bis zu 5k Knoten). Hier ist Neo4J
teilweise besser als OrientDB. Die etwas bessere Performanz der GDBs bei kleinen Graphen
kann vermutlich auf eine bessere Speicherverwaltung oder auch auf das Caching zurückgeführt
werden. Neo4J bietet zum Beispiel einen eigenen Cache, über den auf die Dateien zugegriffen
wird.
19
4.2.5 Lokaler Clustering-Koeffizient
Für die Berechnung des lokalen Clustering-Koeffizienten ist TinkerGraph die schnellste Graphdatenbank. Betrachtet man die Produktivsysteme sind für kleine Graphen (1k Knoten) die
beiden Varianten von Bitsy am schnellsten. Für die größeren getesteten Graphen eignet sich
hingegen eher die GDB Neo4J. Die schlechteste Performanz bei der Berechnung des lokalen
Clustering-Koeffizienten weist dabei OrientDB auf, die 30- bis 50-mal so viel Zeit benötigt
wie TinkerGraph.
Abbildung 4.7: Lokaler Clustering-Koeffizient für gerichtete Barabasi-Albert-Graphen mit 1k
Knoten
4.2.6 Resultate
Im Folgenden sei die Rangordnung der DNA-Datenstrukturen und GDBs bezüglich der Laufzeitmessungen für die durchgeführten Workloads in der Tabelle 4.1 dargestellt. Ausgenommen
davon sind die Operationen Knoten- und Kanteniteration, da die Messergebnisse der verschiedenen GDBs dicht beieinander liegen.
Rangfolge
Graph
1k
Knoten,
gerichtet
10k
Knoten,
gerichtet
Workload
1.
2.
3.
BFS oder
DNA
DNA
DNA
DFS
HM
A
E
BFS oder
DNA
DNA
DNA
DFS
A
E
HM
20
4.
5.
6.
7.
8.
N
TG
BD
BND
ODB
N
TG
BD
BND
ODB
Rangfolge
Graph
Workload
1.
2.
3.
Knoten,
BFS oder
DNA
DNA
DNA
ungerich-
DFS
E
A
HM
Knoten,
BFS oder
DNA
DNA
DNA
ungerich-
DFS
E
A
HM
DNA
DNA
DNA
A
HM
E
DNA
DNA
DNA
A
HM
E
4.
5.
6.
7.
8.
TG
BD
BND
N
ODB
TG
BD
BND
N
ODB
TG
BD
BND
N
ODB
TG
N
BND
BD
ODB
1k
tet
10k
tet
1k
Lokaler
Knoten,
Clustering-
gerichtet
Koeffizient
10k
Lokaler
Knoten,
Clustering-
gerichtet
Koeffizient
Tabelle 4.1: Ergebnisübersicht
(DNA A - DNA Array, DNA E - DNA Empty, DNA HM - DNA HashMultimap, BD - Bitsy
(persistent), BND - Bitsy (In-Memory), N - Neo4J, ODB - OrientDB, TG - TinkerGraph)
21
5 Ausblick
Die mit dieser Arbeit vorgelegte Implementierung, beziehungsweise Erweiterung von DNA,
kann als Benchmark für GDBs genutzt werden. Grundlage für die Gewährleistung der Vergleichbarkeit von Messergebnissen ist eine gemeinsame Schnittstelle für alle Datenbanken.
Mit der Verwendung der Blueprints Interfaces können gleiche Zugriffszeiten aus DNA heraus auf die verschiedenen Datenbanken gewährleistet werden. Die aktuelle Implementierung
umfasst bisher nur einige wenige GDBs. Durch die Erweiterung der Klassen BlueprintsGraph
und DNAGraphFactory können Datenbanken, die die Interfaces von Tinkerpop Blueprints
implementieren, hinzugefügt werden. Aufbauend auf dieser Arbeit können weitere GDBs in
DNA berücksichtigt werden. Dafür bedarf es mindestens der Implementierung des Interfaces
IGraph, sowie der Erweiterung der Klasse DNAGraphFactory um den neuen Graphtypen. Zu
beachten ist dabei, dass die Zugriffszeiten aus DNA heraus auf die Datenbanken, die die Blueprints Interfaces nicht implementieren, sich aber für die Messungen gegenüber den Zeiten mit
der Klasse BlueprintsGraph unterscheiden können.
Die derzeitige Erweiterung für DNA berücksichtigt das Neuerstellen eines Graphen auf einer
gewünschten GDB. Damit die Anwender in Zukunft das Benchmarking unter Berücksichtigung
ihrer eigenen Daten durchführen können, bedarf es der Erweiterung der Klasse BlueprintsGraph um ein „Import-Funktion“. Diese Anpassung bietet die Möglichkeit eigene Graphen
zu analysieren und sie auf anderen Datenbanken zu testen. Somit kann der Anwender für
seine Daten und seinen Workload die bestmögliche Datenbank finden. Neben der Analyse von
statischen Systemen, die in dieser Arbeit im Vordergrund standen, berücksichtigt DNA auch
dynamisches Verhalten - das Anwachsen des Graphen über die Zeit. Für das Erstellen von
Prognosen bei größer werdenden Graphen bietet DNA weitere Operationen wie z.B. Kanten
und Knoten hinzufügen. Damit kann das Verhalten der Datenbank mit steigender Anzahl von
Kanten und Knoten untersucht und verglichen werden.
22
Anhangsverzeichnis
A Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
A.1 Das Interface IGraph
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
A.2 Beispiel einer Konfigurationsdatei . . . . . . . . . . . . . . . . . . . . . . . . 25
A.3 UML-Klassendiagramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
B Graphgenerierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
B.1 Alle Parameter für die Generierung der Graphen . . . . . . . . . . . . . . . . 27
23
Anhang
A. Implementierung
A.1. Das Interface IGraph
24
A.2. Beispiel einer Konfigurationsdatei
1
2
3
# #####################################################################
# # SETTINGS FOR THE GRAPHFACTORY
# #####################################################################
4
5
6
7
8
9
10
11
12
13
# # GF_GRAPHTYPE # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Possible Values :
# * BITSY_DURABLE
# * BITSY_NON_DURABLE
# * DNA
# * NEO4J2
# * ORIENTDBNOTX
# * TINKERGRAPH
GF_GRAPHTYPE = TINKERGRAPH
14
15
16
17
18
19
20
## GF_GDB_CLEAR_WORKSPACE_ON_CLOSE ###################################
# Applies only for :
# * BITSY_DURABLE
# * NEO4J2
G F _ G D B _ C L E A R _ W O R K S P A C E _ O N _ C L O S E = true
GF_GDB_WORKSPACE = data / GDB /
21
22
23
24
25
26
27
28
29
# # G F _ G D B _ O P E R A T I O N S _ P E R _ C O M M I T [0 - INTEGER . MAX_VALUE ]###############
# Defines after how many operations a commit will be executed .
# Default : 0
# <0 : NO_COMMIT
# =0 : COMMIT_ON_CLOSE
# Example :
# OPER ATIO NS_P ER_CO MMIT =1000 -> commit after 1000 operations
G F _ G D B _ O P E R A T I O N S _ P E R _ C O M M I T =0
30
31
32
33
34
## GF_GDB_STORE_DNA_ELEMENTS_IN_GDB ##################################
# If this option is true DNA tries to store the DNA elements ( nodes ,
# edges ) in the graph database if possible
G F _ G D B _ S T O R E _ D N A _ E L E M E N T S _ I N _ G D B = false
25
A.3. UML-Klassendiagramm
26
B. Graphgenerierung
B.1. Alle Parameter für die Generierung der Graphen
Parameter für die Generierung des Graphen
Ungerichteter zufälliger Graph
Gerichteter zufälliger Graph
Typ
#Knoten
#Kanten
#Startkno-
#Startkan-
ten
ten
1k
1k
1k
1k
1k
5k
1k
5k
1k
10k
1k
10k
1k
50k
1k
50k
1k
100k
1k
100k
1k
500k
1k
500k
10k
1k
10k
1k
10k
5k
10k
5k
10k
10k
10k
10k
10k
50k
10k
50k
10k
100k
10k
100k
10k
500k
10k
500k
10k
1M
10k
1M
1k
1k
1k
1k
1k
5k
1k
5k
1k
10k
1k
10k
1k
50k
1k
50k
1k
100k
1k
100k
10k
1k
10k
1k
10k
5k
10k
1k
10k
10k
10k
10k
10k
50k
10k
50k
10k
100k
10k
100k
10k
500k
10k
500k
10k
1M
10k
1M
27
#Hinzuzufügende
Knoten
#Kanten
pro Knoten
Parameter für die Generierung des Graphen
Ungerichteter Barabasi-Albert-Graph
Gerichteter Barabasi-Albert-Graph
Typ
#Knoten
#Kanten
#Startkno-
#Startkan-
ten
ten
#Hinzuzufügende
Knoten
#Kanten
pro Knoten
1k
1k
10
10
990
1
1k
5k
10
50
990
5
1k
10k
50
500
950
10
1k
50k
52
2600
948
50
1k
100k
150
15 K
850
100
1k
500k
800
400 K
200
500
10k
1k
9001
1
999
1
10k
5k
9001
5
999
5
10k
10k
10
10
9990
1
10k
50k
50
250
9950
5
10k
100k
50
500
9950
10
10k
500k
102
5100
9898
50
10k
1M
204
20400
9796
100
1k
1k
10
10
990
1
1k
5k
20
100
980
5
1k
10k
50
500
950
10
1k
50k
102
5100
898
50
1k
100k
204
20400
796
100
10k
1k
9001
1
999
1
10k
5k
9001
5
999
5
10k
10k
10
10
9990
1
10k
50k
50
250
9950
5
10k
100k
50
500
9950
10
10k
500k
102
5100
9898
50
10k
1M
204
20400
9796
100
28
Abbildungsverzeichnis
1.1 Vernetzung der Facebook-Nutzer weltweit . . . . . . . . . . . . . . . . . . . . . .
1
2.1 Entwicklung von Neo4J bei NeoTechnology . . . . . . . . . . . . . . . . . . . . .
3
2.2 Beispiel für einen einfachen gerichteten Graphen . . . . . . . . . . . . . . . . . .
4
2.3 Beispiel einer Relation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
3.1 Architektur von DNA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Anwendungsbeispiel 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3 Anwendungsbeispiel 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.1 Ablauf der Messung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Graphgeneratoren für 1k Knoten und 100k Kanten . . . . . . . . . . . . . . . . . 16
4.3 BFS für gerichtete zufällige Graphen mit 1k Knoten bei steigender Kantenanzahl 17
4.4 BFS für ungerichtete zufällige Graphen mit 1k Knoten bei steigender Kantenanzahl 18
4.5 Kanteniteration für gerichtete zufällige Graphen mit 1k Knoten
. . . . . . . . . 19
4.6 Kanteniteration für gerichtete Barabasi-Albert-Graphen mit 1k Knoten . . . . . 19
4.7 Lokaler Clustering-Koeffizient für gerichtete Barabasi-Albert-Graphen mit 1k
Knoten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
29
Tabellenverzeichnis
3.1 Alle unterstützten DNA-Graphtypen . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.1 Ergebnisübersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
30
Quellenverzeichnis
[1]
Réka Albert und Albert-László Barabási. „Statistical mechanics of complex networks“.
In: Reviews of Modern Physics 74 (Januar 2002), S. 47–97. doi: 10.1103/RevModPhys.
74.47. eprint: cond-mat/0106096. (Besucht am 28. Februar 2016).
[2]
Sotirios Beis, Symeon Papadopoulos und Yiannis Kompatsiaris. „New Trends in Database and Information Systems II“. In: Springer, 2014. Kap. Benchmarking Graph
Databases on the Problem of Community Detection, S. 3 –14. doi: 10.1007/978-3319-10518-5_1. (Besucht am 28. Februar 2016).
[3]
Vincent D Blondel, Jean-Loup Guillaume, Renaud Lambiotte und Etienne Lefebvre.
„Fast unfolding of communities in large networks“. In: Journal of Statistical Mechanics:
Theory and Experiment 2008.10 (2008), P10008. url: http://stacks.iop.org/17425468/2008/i=10/a=P10008 (besucht am 28. Februar 2016).
[4]
Mihai Capotă, Tim Hegeman, Alexandru Iosup, Arnau Prat-Pérez, Orri Erling und
Peter Boncz. „Graphalytics: A Big Data Benchmark for Graph-Processing Platforms“.
In: Proceedings of the GRADES’15. GRADES’15. Melbourne, VIC, Australia: ACM,
2015, 7:1–7:6. isbn: 978-1-4503-3611-6. doi: 10.1145/2764947.2764954. url: http:
//doi.acm.org/10.1145/2764947.2764954 (besucht am 28. Februar 2016).
[5]
Hassan Chafi, Tim Harris, Cindy Xin Yi, Jake Sanders, Jacob Nelson, Brandon Holt,
Brandon Myers, Luis Ceze, Mark Oskin und Simon Kahan. GraphBench Wiki. 2015.
url: https : / / github . com / uwsampa / graphbench / wiki (besucht am 28. Februar
2016).
[6]
Miyuru Dayarathna und Toyotaro Suzumura. „Graph database benchmarking on cloud
environments with XGDBench“. English. In: Automated Software Engineering 21.4 (2014),
S. 509–533. issn: 0928-8910. doi: 10.1007/s10515- 013- 0138- 7. url: http://dx.
doi.org/10.1007/s10515-013-0138-7 (besucht am 28. Februar 2016).
[7]
Duden. Benchmark. Dezember 2015. url: http : / / www . duden . de / node / 774596 /
revisions/1162309/view (besucht am 28. Februar 2016).
[8]
H. Ehrig, B. Mahr, F. Cornelius, M. Große-Rhode und P. Zeitz. Mathematisch-strukturelle
Grundlagen der Informatik. Springer-Lehrbuch. Springer Berlin Heidelberg, 2013. isbn:
9783642567926. url: https://books.google.de/books?id=aEkjBgAAQBAJ (besucht
am 28. Februar 2016).
[9]
Orri Erling, Alex Averbuch, Josep Larriba-Pey, Hassan Chafi, Andrey Gubichev, Arnau
Prat, Minh-Duc Pham und Peter Boncz. „The LDBC Social Network Benchmark: Interactive Workload“. In: Proceedings of the 2015 ACM SIGMOD International Conference
on Management of Data. SIGMOD ’15. Melbourne, Victoria, Australia: ACM, 2015,
31
S. 619–630. isbn: 978-1-4503-2758-9. doi: 10 . 1145 / 2723372 . 2742786. url: http :
//doi.acm.org/10.1145/2723372.2742786 (besucht am 28. Februar 2016).
[10]
Facebook Inc. 1,000,000,000 People, Together. August 2015. url: https : / / www .
facebook . com / 20531316728 / posts / 10154009990506729 (besucht am 28. Februar
2016).
[11]
Facebook Inc. friendships formed on Facebook. Dezember 2013. url: https://scontent.
xx.fbcdn.net/hphotos-frc3/t31.0-8/1275272_10101026493146301_791186452_o.
jpg (besucht am 28. Februar 2016).
[12]
Graph 500 Steering Committee. Graph 500 Benchmark 1 (ßearch"). url: http://www.
graph500.org/specifications (besucht am 28. Februar 2016).
[13]
Alexandru Iosup, Mihai Capotă, Tim Hegeman, Guo Yong, Wing Lung Ngai, Ana Lucia
Varbanescu und Merijn Verstraaten. „Towards Benchmarking IaaS and PaaS Clouds
for Graph Analytics“. In: 2014. url: http : / / www . pds . ewi . tudelft . nl / ~iosup /
Benchmarking - IaaSPaaS - Graph - Analytics14WBDB . pdf (besucht am 28. Februar
2016).
[14]
Neo Technology. Neo4J Fact Sheet. url: http://info.neo4j.com/rs/neotechnology/
images/neo4j-factsheet.pdf (besucht am 28. Februar 2016).
[15]
Neo Technology. Neo4j Customer Success Stories and Case Studies. url: http : / /
neo4j.com/customers/ (besucht am 28. Februar 2016).
[16]
OrientDB Ltd. OrientDB Manual-version 2.0. url: http : / / orientdb . com / docs /
last/OrientDB-Manual.pdf (besucht am 28. Februar 2016).
[17]
Benjamin Schiller und Thorsten Strufe. „Dynamic Network Analyzer Building a Framework for the Graph-theoretic Analysis of Dynamic Networks“. In: Proceedings of the
2013 Summer Computer Simulation Conference. SCSC ’13. Toronto, Ontario, Canada:
Society for Modeling & Simulation International, 2013, 49:1–49:6. isbn: 978-1-62748276-9. url: http://dl.acm.org/citation.cfm?id=2557696.2557750 (besucht am
28. Februar 2016).
[18]
United Nations, Population Devision, Department of Economic and Social Affairs UN.
Total Population - both sexes. 2015. url: http://esa.un.org/unpd/wpp/DVD/Files/
1_Indicators%20(Standard)/EXCEL_FILES/1_Population/WPP2015_POP_F01_1_
TOTAL_POPULATION_BOTH_SEXES.XLS (besucht am 28. Februar 2016).
[19]
lambdazen. Bitsy Wiki. url: https://bitbucket.org/lambdazen/bitsy/wiki/Home
(besucht am 28. Februar 2016).
32
Herunterladen