Flume mit PHP

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Wir richten in diesem Beispiel einen Thrift Client ein, der seine Events über Flume ins Hadoop Filesystem (HDFS) schreibt.
    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:
    • [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.

    Source Code

    1. mkdir -p /var/www/thrift-example
    2. cd ~/thrift-0.5.0
    3. cp -r lib/php/src/ /var/www/thrift-example/thrift
    4. rm -rf /var/www/thrift-example/thrift/ext


    == 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.

    Source Code

    1. cd ~/flume
    2. cp src/thrift/flume.thrift /var/www/thrift-example/


    Das Flume Schema sieht wie folgt aus:

    Source Code

    1. typedef i64 Timestamp
    2. enum Priority {
    3. FATAL = 0,
    4. ERROR = 1,
    5. WARN = 2,
    6. INFO = 3,
    7. DEBUG = 4,
    8. TRACE = 5
    9. }
    10. enum EventStatus {
    11. ACK = 0,
    12. COMMITED = 1,
    13. ERR = 2
    14. }
    15. struct ThriftFlumeEvent {
    16. 1: Timestamp timestamp,
    17. 2: Priority priority,
    18. 3: binary body,
    19. 4: i64 nanos,
    20. 5: string host,
    21. 6: map<string,binary> fields
    22. }
    23. service ThriftFlumeEventServer {
    24. oneway void append( 1:ThriftFlumeEvent evt ),
    25. void close(),
    26. }
    Display All


    == 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.

    Source Code

    1. cd /var/www/thrift-example/
    2. thrift --gen php flume.thrift
    3. mv gen-php/ thrift/packages


    == 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.

    Source Code

    1. Source: rpcSource(1464)
    2. Sink: collectorSink("hdfs://localhost/tmp/flume/%Y-%m-%d/%H00/","%{cat}")


    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.

    Source Code

    1. website;sessionid


    Als Protokoll nehmen wir "TBinaryProtocolAccelerated" weil es die Thrift PHP Extension nutzt und performanter ist. Alternativ lässt sich auch das "TBinaryProtocol" nutzen.

    Source Code

    1. <?php
    2. $GLOBALS['THRIFT_ROOT'] = './thrift';
    3. include_once $GLOBALS['THRIFT_ROOT'] . '/Thrift.php';
    4. include_once $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php';
    5. include_once $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php';
    6. include_once $GLOBALS['THRIFT_ROOT'] . '/packages/flume/ThriftFlumeEventServer.php';
    7. $transport = new TSocket($host = 'localhost', $port = '1464');
    8. $protocol = new TBinaryProtocolAccelerated($transport);
    9. $client = new ThriftFlumeEventServerClient($protocol, $protocol);
    10. $transport->open();
    11. $timestamp = intval(microtime(true) * 1000);
    12. // log message
    13. $client->append(new ThriftFlumeEvent(array(
    14. 'priority' => Priority::INFO,
    15. 'timestamp' => $timestamp,
    16. 'host' => 'server1',
    17. 'body' => 'http://www.easy-coding.de/;100',
    18. 'fields' => array(
    19. 'cat' => 'torben'
    20. )
    21. )));
    22. $transport->close();
    Display All


    Ihr könnt euch den gesamten Quelltext hier herunterladen: easy-coding.de/Attachment/1150…135c99ec113916cde06a2767f

    Hier ein Screenshot aus dem Hue Webinterface:
    easy-coding.de/Attachment/1122…135c99ec113916cde06a2767f
    Images
    • hue-flume-php.png

      30.55 kB, 708×437, viewed 523 times
    Files

    4,915 times viewed