Ich habe jetzt zwei Wochen mit Spark und Python gespielt (oder eine Woche, es gab noch so was wie Feiertage und so was wie Arbeit) und verstehe jetzt wesentlich mehr.
Ich hatte schon geschrieben, dass das Datacamp Tutorial ein wesentliches Detail übersehen hat. Ich muss gestehen, dass ich das Tutorial nicht mehr viel benutzt habe.
In einer ersten Runde habe ich ausgehende vom Datacamp Tutorial unter Verwendung von derer Pyspark Cheatsheet und dem District Data Lab Tutorial einfach mal gespielt. Ich finde das ganze Konzept der ‚resilient distributed datasets‘ (RDD) interessant. In Prinzip baust Du einen ‚pipeline‘, wo Du durch Umwandlung und Filter zu Ergebnissen kommst.
Nachdem ich das etwas durchgekaut habe, habe ich angefangen, eine Anwendung zu schreiben, die meine Vergangenheit untersucht, oder eher die Rohdaten der Besucherstatistiken meiner Webseite auswertet. Das war so was wie eine Test von vielem, was ich in den letzten Monaten gemacht habe.
Ich war inspiriert durch einen Link im District Data Lab Tutorial auf eine Spark Reference Application. Die Referenzanwendung war dann nicht in Python, somit habe ich selber weitergesponnen.
Das erste Problem, dass ich hatte, war das gemischte Format meiner Logdateien. Mein Server hat etwas größere Logdateien ge-gzipped. Ich habe dann einen Generator geschrieben, die beide lesen kann. Für mich neu waren die zwei yield-Ausgänge, das hatte ich noch nie gemacht und ich wusste nicht, ob das geht, aber es geht. Die Funktion sieht so aus:
import gzip
from glob import glob
def yield_lines_from_directory(dir):
files = glob('{}/*'.format(dir))
for file in files:
if file.endswith('.gz'):
with gzip.open(file, mode='rt') as f:
for line in f.readlines():
yield line
else:
with open(file, 'r') as f:
for line in f.readlines():
yield line
Ich habe dann entdeckt, dass die Logdateien ein Standardformat haben, dass hier beschrieben ist: https://httpd.apache.org/docs/1.3/logs.html. Mit diesen Informationen konnte ich die gelesene Zeilen interpretieren und in eine verwendbare Struktur verwandeln. Dabei sind 620967 – 620965 (=2) POST Requests auf der Strecke geblieben.
Jetzt bin ich so weit, dass ich einen Networkx Graph per Besucher male. Ich habe zwar über die Agent-Beschreibung Spiders und Bots ausgeschlossen, aber Yahoo oder Ask definieren sich anders. Das sieht dann nicht so übersichtlich aus.
Das folgende Bild zeigt einen Besucher, der ein Mal auf der Webseite war, einmal über den Einstieg einer Suche und einmal über meine damals noch existente Wikispaces Seite.
Nicht immer ist so klar, was passiert ist. Beim nächsten Bild wäre zu überprüfen, was passiert ist. Ich weiß nicht, ob es hier drei komplett getrennte Besuche (0, 1, 2) gab oder ob es irgendwo anders holpert. Besuch 0 ist klar. Besuch 1, direkt auf meine famose error404.html Seite, was ist das? Und auch beim Besuch 2 gibt es so eine einsame error404. Dafür ist bei Besuch 2 klar zu verfolgen, welche Seiten nacheinander besucht wurden.
Ich will am Ende die Besuche auf eine Zeitachse abzubilden, aber das ist nicht so einfach, wenn es mehrere Besuche gibt. Es kann gut sein, dass Besuch 0 und Besuch 2 eine ganze Strecke auseinander liegen und dann nutzt eine lückenlose zeitliche Reihenfolge gar nichts.
.