Einsatz eines Open Source Clickstream-Collectors

Begriffe wie Customer Experience, Omnichannel Management, Customer Journey, Customer Analytics, Personalisierung und kontextbasierte Kundeninteraktionen stehen bei vielen Unternehmen ganz oben auf der Agenda. Für das Ausspielen von personalisiertem Content in Echtzeit über digitale Kanäle (z.B. zur Steigerung der Conversion-Rate) werden aktuelle Daten über den Interessenten bzw. Kunden benötigt. Dazu gehören z.B. demographische Daten, die bisherige Kontakthistorie wie z.B. gekaufte Produkte, Zahlungsverhalten, historisches Surfverhalten, etc.

Häufig verfügt das Unternehmen noch nicht über eine derartige Datenbasis oder die Daten sind über verschiedene Systeme verteilt. Deshalb ist für viele Unternehmen der ideale Einstieg in ein Omnichannel-Management, die Weblogs, die auf den Webseiten, Kunden- und Service-Portalen sowie Apps. erzeugt werden, zeitnah zu sammeln, zu verarbeiten und zu analysieren. Oft haben Unternehmen Web-Analytics mit Produkten wie Google-Analytics oder Adobe-Analytics bereits implementiert. Allerdings stehen diese Clickstream-Daten erst mit einem Zeitverzug von 24 bis 48 Stunden zur Verfügung und die Kosten sind nicht unerheblich.

sanfranciscoWenn das Unternehmen dennoch die Clickstream-Daten in Echtzeit benötigt, kann es z.B. neben Adobe Analytics die weiteren kostenpflichtigen Produkte der Adobe Marketing Cloud nutzen oder proprietäre Clickstream-Collectoren einsetzen oder vollständig auf Opensource-Produkte setzen. Wir möchten Ihnen aus einem Projekt berichten, bei dem wir den Opensource Clickstream Collector Divolte eingesetzt haben.

Divolte war nicht der erste Collector, der bei dem Kunden implementiert wurde. Er hatte bereits mehrere Clickstream-Collectoren von verschiedenen Anbietern eingesetzt. Aber aufgrund der positiven Erfahrung mit Divolte entschied der Kunde, dieses Produkt zukünftig als alleinige Lösung zu nutzen und die übrigen Produkte sukzessive zu ersetzen. Der große Vorteil von Divolte liegt in seiner Offenheit und Anpassbarkeit, so lassen sich Aktivitäten individuell und exakt taggen. Damit grenzt sich Divolte von vergleichbaren Produkten ab. So lassen sich nicht nur Page Views identifizieren, sondern auch andere Aktivitäten auf digitalen Kanälen tracken wie: Download eines Files; Laden von Ajax, JavaScript oder Flash Content; Auslesen von Formulareinträgen; Laden von Videos auf einer Website; Drücken des Start-, Pause- und Stopp-Buttons bei Videos; Laden einer dynamischen Webseite; Interaktion mit einem Gadget; Click auf ein Bild oder einen externen Link; Log-ins; Teilen oder Drucken eines Blog Post, Artikels, Video oder Bild; Click eines Buttons oder eine Mouse-Bewegung. Letztendlich lassen sich so Mouse-, Tastatur, Frame und Form-Events tracken.

Show-Case für Customer Journey Analytics und Echtzeit-Personalisierung

Mit dem Show-Case soll das folgende Szenario umgesetzt werden: Das Surfverhalten auf einer Website wird über den Divolte Clickstream Collector in Echtzeit per Kafka in die AWS-Cloud. In Spark Streaming werden die Daten aus Kafka analysiert und danach in HBase gespeichert. Auf diese Weise lassen sich dann in Echtzeit z.B. Notifications an die Webseite versenden oder dynamische Webseiten mit personalisiertem Content erzeugen.

Im folgenden Schaubild wird die Architektur der Komponenten Divolte Collector und Kafka Cluster veranschaulicht. Wenn der Nutzer auf der Website surft, werden in Echtzeit Daten vom Divolte Collector gesammelt und weiter an das Kafka Cluster gesendet. Von dort aus können diese von einer Streaming-Engine weiterverarbeitet und persistiert werden. Mehr dazu im zweiten Teil dieser Blog-Serie.

Abbildung 1: Schaubild der Architektur

Beschreibung der System-Komponenten:

Im Folgenden werden die für unseren Show Case verwendeten Systemkomponenten (AWS-Cloud) beschrieben.

1. Installation von Divolte

Divolte wurde als Source Code von der Projektseite auf Github geladen. https://github.com/divolte/divolte-collector und anschließend per Gradle kompiliert bzw. einen Build erstellt.

$ wget https://github.com/divolte/divolte-collector/archive/divolte-collector-0.6.0.zip
$ unzip divolte-*.zip
$ cd divolte-collector-divolte-collector-0.6.0
$ vi build.gradle
$ ./gradlew

Danach sind im Ordner „dist” verschiedene Packages des fertig kompilierten Tools enthalten.

Für das Testen von Divolte kann eine leere Konfiguration im Ordner „conf“ angelegt werden.

$ touch conf/divolte-collector.conf

Wenn danach der Server gestartet wird, werden die Dateien nicht in das HDFS sondern in den /tmp Ordner auf dem lokalen Filesystem geschrieben. Dies ist die Default-Einstellung bei leerer Konfiguration.
Nun kann der Divolte-Collector für einen ersten Test gestartet werden.

$ ./bin/divolte-collector

Dadurch wird ein einfacher Webserver gestartet, der eine Test Website enthält mit der Click Events simuliert werden können. Diese ist unter http://<divolte-server-adresse>:8290 im Webbrowser erreichbar. Nachdem man dort ein paar Mal geklickt hat, kann man seine Testdateien als .avro Dateien im Ordner /tmp finden.

Beim Kompilieren von Divolte werden automatisch auch die Avro Tools mit kompiliert. Diese sind ein kleines Java Projekt, das viele nützliche Funktionalitäten im Umgang mit Avro Dateien liefert.
Die Avro Dateien, die in /tmp abgelegt wurden, können nun mit den avro-tools inspiziert werden.

$ ./bin/avro-tools tojson /tmp/*.avro --pretty

2. Kafka

Zur Verarbeitung der Daten wurde ein Kafka-Cluster aufgesetzt, das aus 3 Knoten besteht. Mit der Leistung dieses Clusters könnten mehrere Tausend Events pro Sekunde verarbeitet werden. In diesem Setup sollte Kafka allerdings nicht nur zur Verarbeitung der Clickstreams, sondern auch für weitere Realtime Prozesse eingesetzt werden.

stadion-mbalifeUm Kafka separat von Hadoop aufzusetzen, werden auf allen Knoten Zookeeper und Kafka benötigt. Falls bereits ein Zookeeper Quorum vorhanden ist, kann auch dieses genutzt werden. Da bereits eine bestehende Installation der HDP (Hortonworks Data Platform) bestand, wurde die Installation in diesem Fall über Ambari durchgeführt. Über Ambari konnte das Kafka-Cluster danach konfiguriert werden. Wichtig ist für Divolte eine Kafka-Version > 0.10.0. In diesem Beispiel wurde Kafka 0.10.2 verwendet.

Zusätzlich musste Divolte konfiguriert werden um die Clickdaten als Messages an Kafka zu schicken. Eine minimale Konfiguration kann folgendermaßen in der Datei conf/divolte-collector.conf angelegt werden:

divolte {
global {
kafka {
// Enable Kafka
enabled = true
threads = 2
producer = {
bootstrap.servers = ["kafka-broker-1:9092","kafka-broker-2:9092","kafka-broker-3:9092"]
}
}
}
sinks {
kafka {
type = kafka
topic = clickstream-data
}
}
}

Diese Konfiguration sorgt dafür, dass Divolte das Kafka Plugin aktiviert, dass für das Schreiben in Kafka zwei Threads verwendet werden und dass die Kafka-Server bekannt sind.
Zusätzlich wird der Name der Topic festgelegt, in die geschrieben wird. Diese Topic sollte vorher bereits in Kafka mit der richtigen Konfiguration für die Anzahl an Partitionen und Replikationen angelegt werden. In diesem Fall wurden dafür die Kafka Scripts genutzt, die nach der Installation von Kafka im …/kafka/bin/ Verzeichnis vorliegen:

$ ./kafka-topics.sh --create \
--topic clickstream-data \
--zookeeper zookeeper-host:2181 \
--partitions 3 \
--replication-factor 3

Im nächsten Teil des Blogs wird u.a. der Einsatz von HBase mit Apache Phoenix und Spark Streaming beschrieben, um die in Echtzeit generierten Daten zu verarbeiten und hinterher personalisierte Ereignisse auslösen zu können.