# Research
Jan R. Borensky, Tim Degold, 5ACHIT
## Vergleich | Spark vs Atomix
In diesem Research vergleichen wir Spark und Atomix anhand der folgenden Parameter.
### Architektur
**Atomix**
In Atomix wird jedes Node als gleichgestelltes Mitglied gesehen, Master-Slave Prinzipien kommen nicht zum Einsatz. Sie unterscheiden sich nur in ihrer Konfiguration, davon gibt es einige [17].
- Data Grid: Jedes Node enthält die selben Daten, sie replizieren sich gegenseitig. Erlaubt effektive Skallierbarkeit und ist sehr flexibel. Es kann allerdings zu Inkonsistenzen kommen
- Consistent Data Grid: Dieses Modell sorgt für Konsistenz innerhalb eines Data Grid. Dabei kommt der Raft Consensus Algorithmus [18] zum Einsatz, wobei die Nodes über die gespeicherten Werte "abstimmen".
- Raft Client-Server: Obwohl Master-Slave (Client-Server) nicht nativ implementiert ist, kann es mit der richtigen Konfiguration doch erziehlt werden. Clients können sich zu Raft-Servern verbinden und mit ihnen kommunizieren.
- Consistent Data Grid Client Server: Zusätzlich zu Raft Client-Server können Backup-Nodes angeschlossen werden, die die Daten replizieren.
- REST Client Server: Falls Clients nicht mit Java umgesetzt werden (Atomix ist in Java geschrieben), können diese über REST-Schnittstellen und über einen Agent mit den Raft-Servern kommunizieren.
**Spark** [9]
> Apache Spark is a unified analytics engine for large-scale data processing.
**Apache Spark** besteht im Grunde genommen aus den folgenden Komponenten:

**RDD** (*Resilient Distributed Datasets*) ist die Datenstruktur, die in Spark verwendet wird. Es ist ein Konzept, das dazu verwendet werden kann, Daten über mehrere Rechner zu verteilen und diese auch parallel zu verarbeiten.
Diese Dateneinheiten (RDDs) werden verteilt, in dem sie über mehrere Partitionen aufgeteilt werden:

**Spark Streaming**
Spark Streaming ist jene Komponente, die das Verarbeiten von Streaming-Daten (was?) in Echtzeit ermöglicht.
### einsetzbare Programmiersprachen
**Atomix**
`Atomix` wurde in Java geschrieben, und funktioniert mit Java-Clients. Theoretisch lassen sich aber Clients in allen Programmiersprachen schreiben, da sie über den REST Client-Server angeschlossen werden können.
**Spark**
`Spark` bietet die Möglichkeit folgende Programmiersprachen zu verwenden:
+ Python
+ Java
+ R
+ Scala
+ SQL
Über das Github-Repo [11] von Spark sind diverse Beispiele in den unterschiedlichen Programmiersprachen abrufbar. Das ermöglicht einen Einblick in die Funktionsweise und das Verwenden dieser Beispiele als Grundlage für eigenen Code.
### Datenverteilung und gemeinsamer Speicher
**Atomix**
Einzelne Nodes (Members) werden zu Clustern zusammengeschlossen. Die Kernidee der Datenübertragung basiert auf sogenannten *Distributed Primitives*. Dabei handelt es sich um Klassen, welche bestimmte Datentypen/-strukturen darstellen. Jeder Primitiv ist über einen eindeutigen Namen erkennbar, welcher als String im Konstruktur übergeben wird.
```java
Set<String> set = atomix.getSet("my-set");
set.add("foo");
```
Zu jedem Primitiv gibt es auch eine asynchrone Variante
```java
AsyncDistributedSet<String> asyncSet = atomix.getSet("my-set").async();
asyncSet.add("foo").thenRun(() -> {
...
});
```
Nimmt ein Node Änderungen an einem Primitiv vor, wird diese über das definierte Protokoll an die anderen Nodes weitergegeben. Dadurch kommt es nicht zum Datenverlusst, wenn ein einzelnes Node ausfällt. Wird ein Primitiv mit gleichem Namen mehrfach erstellt, verweisen diese auf dasselbe Objekt.[16]
**Spark**
Wie bereits angesprochen verwendet Spark RDDs um Daten zu verteilen. Nachfolgend werden wir noch näher auf dieses Prinzip eingehen.
> The key idea of spark is Resilient Distributed Datasets (RDD); it supports in-memory processing computation. This means, it stores the state of memory as an object across the jobs and the object is sharable between those jobs. Data sharing in memory is 10 to 100 times faster than network and Disk.
[8]
Die einzelnen Teile das Akronyms stehen für folgende Eigenschaften:
+ **Resilience**: Fehlertolereanz
+ **Distributed**: Die Daten sind über mehreren Nodes eines Clusters verteilt .
+ **Dataset**
Prinzipiell unterstützt RDD zwei Arten von Funktionen: [9]
+ Transformation → neue RDDs (aus alten) erzeugen
+ Action → bestehende RDDs bearbeiten
**Lazy Evaluation**
In Spark RDD wird bei Transformationen *Lazy Evaluation* angewendet. Das bedeutet, dass Transformationen an einem RDD erst dann ausgeführt werden, wenn eine andere Funktion (`Action`) aufgerufen wird.
### Performance bei Main-Focus
**Atomix**
`java.lang.NullPointerException`
**Spark**
Die `main()`-Methode des Programms wird über den `Driver` ausgeführt. Dieser erstellt, wie in folgender Abbildung zu sehen ist, auch den Spark-Context auf den der Master sowie die Slaves/Workers in weiterer Folge zugreifen. [13]

In unserer Ausarbeitung bzgl. Benchmarking konnten wir feststellen, dass duch diese Aufteilung bzw. Kommunikation bei weniger aufwendigen Tasks eine gewisse Latenzzeit festgestellt werden kann, die die Performance negativ beeinflusst.
### Notifikation von Master oder anderen Slaves
**Atomix**
Atomix stellt zwei Arten der Kommunikation zur Verfügung, Direktnachrichten [15] und Publish-Subscribe-Style Kommunikation [14].
Bei Direktnachrichten gibt es die Möglichkeit Unicasts, Multicasts und Broadcasts zu versenden.
Bei Publish-Subscribe können sich (wer hätte es gedacht) Nodes bei anderen Nodes "anmelden" und gekommen dann die Nachrichten, die das Publisher-Node verschickt.

## Quellen
[1] “Multiple Workers in a Single Node Configuration for Spark Standalone Cluster - DeltaCo.” https://albertusk95.github.io/posts/2020/01/spark-standalone-multi-workers-single-node/ (accessed Mar. 03, 2021).
[2] “Configure PySpark to connect to a Standalone Spark Cluster - Back 2 Code.” https://www.back2code.me/2018/11/configure-pyspark-to-connect-to-a-standalone-spark-cluster/ (accessed Mar. 03, 2021).
[3] “Starting the Spark | Learning Apache Spark in Java.” https://telegraphhillsoftware.com/starting-the-spark/ (accessed Mar. 03, 2021).
[4] “Your First Java RDD With Apache Spark - DZone Java.” https://dzone.com/articles/your-first-java-rdd-with-apache-spark (accessed Mar. 03, 2021).
[5] “scala - Spark - Error ‘A master URL must be set in your configuration’ when submitting an app - Stack Overflow.” https://stackoverflow.com/questions/38008330/spark-error-a-master-url-must-be-set-in-your-configuration-when-submitting-a (accessed Mar. 03, 2021).
[6] “Using Gradle to create a simple Java Spark application | by Yang Gao | Medium.” https://medium.com/@yanggao1119/using-gradle-to-create-a-simple-java-spark-application-f2a2b6460e8c (accessed Mar. 03, 2021).
[7] “What is an RDD in Spark? - Learn Spark RDD - Intellipaat.” https://intellipaat.com/blog/tutorial/spark-tutorial/programming-with-rdds/ (accessed Mar. 03, 2021).
[8] “Apache Spark - RDD - Tutorialspoint.” https://www.tutorialspoint.com/apache_spark/apache_spark_rdd.htm (accessed Mar. 03, 2021).
[9] “Apache Spark: Vorteile und Anwendungsbereiche.” https://datasolut.com/was-ist-spark/ (accessed Mar. 03, 2021).
[10] “Distributed Data Processing with Apache Spark | by Munish Goyal | DataDrivenInvestor.” https://medium.datadriveninvestor.com/distributed-data-processing-with-apache-spark-2a5e473b0cb1 (accessed Mar. 03, 2021).
[11] “apache/spark: Apache Spark - A unified analytics engine for large-scale data processing.” https://github.com/apache/spark (accessed Mar. 03, 2021).
[12] “Overview - Spark 3.1.1 Documentation.” http://spark.apache.org/docs/latest/index.html (accessed Mar. 03, 2021).
[13] “Understanding the working of Spark Driver and Executor - Knoldus Blogs.” https://blog.knoldus.com/understanding-the-working-of-spark-driver-and-executor/ (accessed Mar. 17, 2021).
[14] “Atomix - A reactive Java framework for building fault-tolerant distributed systems.” https://atomix.io/docs/latest/user-manual/cluster-communication/publish-subscribe-messaging/ (accessed Mar. 17, 2021).
[15] “Atomix - A reactive Java framework for building fault-tolerant distributed systems.” https://atomix.io/docs/latest/user-manual/cluster-communication/direct-messaging/ (accessed Mar. 17, 2021).
[16] “Atomix - A reactive Java framework for building fault-tolerant distributed systems.” https://atomix.io/docs/latest/user-manual/concepts/distributed-primitives/ (accessed Mar. 17, 2021).
[17] “Atomix - A reactive Java framework for building fault-tolerant distributed systems.” https://atomix.io/docs/latest/user-manual/introduction/architectures/ (accessed Mar. 17, 2021).
[18] “Raft Consensus Algorithm.” https://raft.github.io/ (accessed Mar. 17, 2021).
[19] “Overview - Spark 3.1.1 Documentation.” https://spark.apache.org/docs/latest/index.html (accessed Mar. 17, 2021).
[20] “Atomix - A reactive Java framework for building fault-tolerant distributed systems.” https://atomix.io/docs/latest/user-manual/introduction/what-is-atomix/ (accessed Mar. 17, 2021).