Flume mit PHP

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

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

    Quellcode

    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.

    Quellcode

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


    Das Flume Schema sieht wie folgt aus:

    Quellcode

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

    Quellcode

    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.

    Quellcode

    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.

    Quellcode

    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.

    Quellcode

    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();
    Alles anzeigen


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

    Hier ein Screenshot aus dem Hue Webinterface:
    easy-coding.de/Attachment/1122…6810c40d03b12dffdc9a49321
    Bilder
    • hue-flume-php.png

      30,55 kB, 708×437, 1.190 mal angesehen
    Dateien
    • thrift-example.zip

      (34,03 kB, 1.044 mal heruntergeladen, zuletzt: )

    9.438 mal gelesen