4-Node Raspberry Apache Cassandra Cluster

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Benutzeravatar
ColonelHoagen
User
Beiträge: 3
Registriert: Dienstag 18. August 2015, 08:24
Wohnort: Äbbelwoi Hauptstadt

Hallo zusammen,

habe ein 4-Node Raspberry Pi (B+) Netzwerk, mit einer Apache Cassandra NoSQL-Datenbank am laufen.

Mir gelang es erfolgreich, mich mittels Python2 mit der Cassandra-Datenbank zu verbinden und ich entwickelte ein kleines primitives "Benchmark"-Tool (wenn man sowas überhaupt so nennen darf :wink: )

Hier mein Benchmark.py:


Code: Alles auswählen

# Important imports - File-Header
from datetime import datetime
import time

# Verbindung zum Cluster aufnehmen
print("Baue Verbindung zum Cluster auf")
from cassandra.cluster import Cluster
cluster = Cluster(['192.168.178.51'])
session = cluster.connect()

# Zeitmessung beginnen
print("Starte Zeitmessung")
ZeitAnfang = datetime.now()

# Keyspace erstellen
print("Erstelle Keyspace")
session.execute("CREATE KEYSPACE demo WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1 };")

# Benutzer DEMO benutzen
print("Benutze DEMO keyspace")
session.execute("USE demo;");

# Tabellen erstellen ... DEMO.USER 0 bis 5
print("Erstelle Tabellen DEMO.USER0-5")
session.execute("CREATE TABLE demo.user0 (  vorname text PRIMARY KEY , name text , age int ) ;");
#session.execute("CREATE TABLE demo.user1 (  vorname text PRIMARY KEY , name text , age int ) ;");
#session.execute("CREATE TABLE demo.user2 (  vorname text PRIMARY KEY , name text , age int ) ;");
#session.execute("CREATE TABLE demo.user3 (  vorname text PRIMARY KEY , name text , age int ) ;");
#session.execute("CREATE TABLE demo.user4 (  vorname text PRIMARY KEY , name text , age int ) ;");
#session.execute("CREATE TABLE demo.user5 (  vorname text PRIMARY KEY , name text , age int ) ;");

# Tabellen mit Inhalt fuellen
print("Fuege Inhalt in Tabellen ein")
session.execute("INSERT INTO demo.user0 (vorname, name, age) VALUES ('DEMO_vorname0', 'DEMO_name0', 20)");
#session.execute("INSERT INTO demo.user1 (vorname, name, age) VALUES ('DEMO_vorname1', 'DEMO_name1', 21)");
#session.execute("INSERT INTO demo.user2 (vorname, name, age) VALUES ('DEMO_vorname2', 'DEMO_name2', 22)");
#session.execute("INSERT INTO demo.user3 (vorname, name, age) VALUES ('DEMO_vorname3', 'DEMO_name3', 23)");
#session.execute("INSERT INTO demo.user4 (vorname, name, age) VALUES ('DEMO_vorname4', 'DEMO_name4', 24)");

# Zeitmessung stoppen
print("Stoppe Zeitmessung")
ZeitEnde = datetime.now()
ZeitGesamt = ZeitEnde - ZeitAnfang
print(ZeitGesamt.seconds + ZeitGesamt.microseconds / 1E6, " Sekungen, Millisekunden")

# 5 Sekungen Pause
time.sleep(5)

# Keyspace loeschen
print("Loesche Keyspace DEMO")
session.execute("DROP KEYSPACE demo;");

# Wenn keine Fehler entstanden sind, dann:
print("Benchmark vollstaendig!")
print("(c) Marc G. 2015")

Wie gesagt, das Script ist an sich primitiv und nicht wirklich dynamisch. Aber für meine Zwecke ist es i.O..

Mein Problem an der Sache ist nun, dass ich immer folgenden Output-Fehler bekomme, mit welchen ich nichts anfangen kann als Python-Neuling:

Code: Alles auswählen

Baue Verbindung zum Cluster auf
Starte Zeitmessung
Erstelle Keyspace
Benutze DEMO keyspace
Erstelle Tabellen DEMO.USER0-5
Fuege Inhalt in Tabellen ein
Stoppe Zeitmessung
(8.820948, ' Sekungen, Millisekunden')
Loesche Keyspace DEMO
Traceback (most recent call last):
  File "benchmark_marc_final.py", line 51, in <module>
    session.execute("DROP KEYSPACE demo;");
  File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 1615, in execute
    result = future.result(timeout)
  File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 3156, in result
    raise OperationTimedOut(errors=self._errors, last_host=self._current_host)
cassandra.OperationTimedOut: errors={}, last_host=192.168.178.51

Ich hoffe und poche auf Eure Erfahrenheit und bedanke mich im Voraus.

LG,
ColonelHoagen
BlackJack

@ColonelHoagen: So viel mehr als da im Traceback steht wird man wohl auch nicht sagen können wenn man Python schon länger programmiert. Die Anweisung ``session.execute("DROP KEYSPACE demo;");`` löst eine Zeitüberschreitung aus. Das dauert da irgendeiner Komponente zu lange. Liegt vielleicht an den Raspis bzw. das die Lese- und vor allem Schreibraten auf SD-Karten nicht das ist was eine Datenbank normalerweise erwartet‽
Benutzeravatar
ColonelHoagen
User
Beiträge: 3
Registriert: Dienstag 18. August 2015, 08:24
Wohnort: Äbbelwoi Hauptstadt

BlackJack hat geschrieben:@ColonelHoagen: So viel mehr als da im Traceback steht wird man wohl auch nicht sagen können wenn man Python schon länger programmiert. Die Anweisung ``session.execute("DROP KEYSPACE demo;");`` löst eine Zeitüberschreitung aus. Das dauert da irgendeiner Komponente zu lange. Liegt vielleicht an den Raspis bzw. das die Lese- und vor allem Schreibraten auf SD-Karten nicht das ist was eine Datenbank normalerweise erwartet‽
Okay, damit kann ich jedoch etwas anfangen. Das es eine Zeitüberschreitung gibt hatte ich auch verstanden, dachte es könnte aber einen tieferen Fehler enthalten.

Ist doch wunderbar, meine Aufgabe ist es ja auch, die Raspberry's an die Leistungsgrenze zu führen. Von daher bin ich zufrieden.

Habe bis jetzt immer nur 1 Raspberry laufen lassen (also Cassandra) ... versuche es jetzt mit 2,3 und 4 Nodes als Cluster.

Liebste Grüße,

ColonelHoagen
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Du solltest viel mehr Daten in die DB schieben in dem unteren Millisekunden Bereich ist ein Benchmark nicht aussagekräftig.
Benutzeravatar
ColonelHoagen
User
Beiträge: 3
Registriert: Dienstag 18. August 2015, 08:24
Wohnort: Äbbelwoi Hauptstadt

Sr4l hat geschrieben:Du solltest viel mehr Daten in die DB schieben in dem unteren Millisekunden Bereich ist ein Benchmark nicht aussagekräftig.
Das Problem an der Sache, welches ich noch nicht durchschaut habe ist, dass sobald ich mehr als 10 Tabellen erstellen lasse und mit Inhalt befülle, die Verbindung abreißt.

Sprich: 1xSSH Verbindung um Cassandra zu starten (kein Deamon).
1xSSH um mein BenchmarkTool starten und anzeigen zu lassen
1xSSH um ./nodetool anzuzeigen, damit ich weiss falls einer der 4 Jaspis abschmiert (was ab und an der Fall ist :K )

Mir bricht ständig die Verbindung weg.

Kann man eventuell auch anstatt 5-10 hintereinander folgende Befehle, einfach einen großen "Sack" an Befehlen nehmen und den in die Queue schieben?

LG,
Col. Hoagen
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Mir bricht ständig die Verbindung weg.
Das kann ja mehrere Gründen haben...

Grundsätzlich sehe ich aber auch in der Verwendung der Raspi ein Problem - weil Cassandra ist "für großes" gemacht, und das setzt leistungsfähige(re) Hardware als den Raspi. Hast du das ganze schon mal auf besserer Hardware, z.B. 4x i5 oder i7 Rechnern mit schnellere HD getestet?

Gruß, noisefloor
Antworten