Wir richten in diesem Beispiel einen Thrift Client ein, der seine Events über Flume ins Hadoop Filesystem (HDFS) schreibt.,
Wir gehen an dieser Stelle davon aus, dass Flume, Thrift und die Thrift PHP Extension installiert sind.
Ansonsten sind die die Verweise um das Nachzuholen:
== Allgemeine Thrift Klassen ==
Wir benötigen die allgemeinen PHP Klassen von Thrift. Dazu kopieren wir die Bibliotheken aus der Thrift Installation in einen Ordner in unserem Webroot.
Den Code der Extension benötigen wir nicht mehr und löschen ihn.
== Flume Schema ==
Wir benötigen den Aufbau eines Flume Events im Thrift Format. Dazu kopieren wir die Thrift Definition aus der Flume Installation in unser Webroot.
Das Flume Schema sieht wie folgt aus:
Alles anzeigen
== Flume Thrift Klassen ==
Nun erzeugen wir uns die PHP Klassencode für den Flume Service und kopieren ihn per Konvention in den packages Ordner innerhalb von Thrift.
== Flume Konfiguration ==
Über den Flume Master können wir dem Flume Node mitteilen auf welchem Port und mit welchem Protokoll er lauschen soll.
Dazu betreten wir den Flume Master mit der URL: localhost:35871/
Über "config" aktualisieren wir den Node dann wie folgt.
Wir richten unsere Ordnerstruktur nach Datum aus. Für den Dateiprefix verwenden wir außerdem eine dynamische Platzhaltervariable, die in den "fields" des Flume Events übertragen werden kann.
In der Flume Master Overview könnt ihr im Anschluss sehen, falls es zu Fehlern gekommen ist.
== Anwendungscode ==
In unserem Beispiel wollen wir die Events als Remore Procedure Call (RPC) an Flume senden. Wir agieren damit als Sender.
Als Anwendungsfall wollen wir die Anzahl an Seitenaufrufen speichern. Unsere Nachricht sieht dabei wie folgt aus, wir trennen die website und die Session ID mit einem Semikolon.
Als Protokoll nehmen wir "TBinaryProtocolAccelerated" weil es die Thrift PHP Extension nutzt und performanter ist. Alternativ lässt sich auch das "TBinaryProtocol" nutzen.
Alles anzeigen
Ihr könnt euch den gesamten Quelltext hier herunterladen: easy-coding.de/Attachment/1150…7dbb3b97d1ddd9c174213f466
Hier ein Screenshot aus dem Hue Webinterface:
easy-coding.de/Attachment/1122…7dbb3b97d1ddd9c174213f466
Wir gehen an dieser Stelle davon aus, dass Flume, Thrift und die Thrift PHP Extension installiert sind.
Ansonsten sind die die Verweise um das Nachzuholen:
- [wiki]Apache Thrift Installation[/wiki]
- [wiki]Thrift PHP Extension installieren[/wiki]
- [wiki]Cloudera Flume Installation[/wiki]
== Allgemeine Thrift Klassen ==
Wir benötigen die allgemeinen PHP Klassen von Thrift. Dazu kopieren wir die Bibliotheken aus der Thrift Installation in einen Ordner in unserem Webroot.
Den Code der Extension benötigen wir nicht mehr und löschen ihn.
== Flume Schema ==
Wir benötigen den Aufbau eines Flume Events im Thrift Format. Dazu kopieren wir die Thrift Definition aus der Flume Installation in unser Webroot.
Das Flume Schema sieht wie folgt aus:
Quellcode
- typedef i64 Timestamp
- enum Priority {
- FATAL = 0,
- ERROR = 1,
- WARN = 2,
- INFO = 3,
- DEBUG = 4,
- TRACE = 5
- }
- enum EventStatus {
- ACK = 0,
- COMMITED = 1,
- ERR = 2
- }
- struct ThriftFlumeEvent {
- 1: Timestamp timestamp,
- 2: Priority priority,
- 3: binary body,
- 4: i64 nanos,
- 5: string host,
- 6: map<string,binary> fields
- }
- service ThriftFlumeEventServer {
- oneway void append( 1:ThriftFlumeEvent evt ),
- void close(),
- }
== Flume Thrift Klassen ==
Nun erzeugen wir uns die PHP Klassencode für den Flume Service und kopieren ihn per Konvention in den packages Ordner innerhalb von Thrift.
== Flume Konfiguration ==
Über den Flume Master können wir dem Flume Node mitteilen auf welchem Port und mit welchem Protokoll er lauschen soll.
Dazu betreten wir den Flume Master mit der URL: localhost:35871/
Über "config" aktualisieren wir den Node dann wie folgt.
Wir richten unsere Ordnerstruktur nach Datum aus. Für den Dateiprefix verwenden wir außerdem eine dynamische Platzhaltervariable, die in den "fields" des Flume Events übertragen werden kann.
In der Flume Master Overview könnt ihr im Anschluss sehen, falls es zu Fehlern gekommen ist.
== Anwendungscode ==
In unserem Beispiel wollen wir die Events als Remore Procedure Call (RPC) an Flume senden. Wir agieren damit als Sender.
Als Anwendungsfall wollen wir die Anzahl an Seitenaufrufen speichern. Unsere Nachricht sieht dabei wie folgt aus, wir trennen die website und die Session ID mit einem Semikolon.
Als Protokoll nehmen wir "TBinaryProtocolAccelerated" weil es die Thrift PHP Extension nutzt und performanter ist. Alternativ lässt sich auch das "TBinaryProtocol" nutzen.
Quellcode
- <?php
- $GLOBALS['THRIFT_ROOT'] = './thrift';
- include_once $GLOBALS['THRIFT_ROOT'] . '/Thrift.php';
- include_once $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php';
- include_once $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php';
- include_once $GLOBALS['THRIFT_ROOT'] . '/packages/flume/ThriftFlumeEventServer.php';
- $transport = new TSocket($host = 'localhost', $port = '1464');
- $protocol = new TBinaryProtocolAccelerated($transport);
- $client = new ThriftFlumeEventServerClient($protocol, $protocol);
- $transport->open();
- $timestamp = intval(microtime(true) * 1000);
- // log message
- $client->append(new ThriftFlumeEvent(array(
- 'priority' => Priority::INFO,
- 'timestamp' => $timestamp,
- 'host' => 'server1',
- 'body' => 'http://www.easy-coding.de/;100',
- 'fields' => array(
- 'cat' => 'torben'
- )
- )));
- $transport->close();
Ihr könnt euch den gesamten Quelltext hier herunterladen: easy-coding.de/Attachment/1150…7dbb3b97d1ddd9c174213f466
Hier ein Screenshot aus dem Hue Webinterface:
easy-coding.de/Attachment/1122…7dbb3b97d1ddd9c174213f466
9.439 mal gelesen