Einführung in den Apache Flume

Einführung in den Apache Flume

  • Orchestrierung
6 Minuten Lesezeit Aktualisiert Apr 20, 2017

Auf einen Blick: Apache Flume ist ein Werkzeug, um Datenströme mit hohem Datenvolumen effizient zu lesen und sie in Speichersysteme zu schreiben, ohne Datenverlust zu erhalten. Es unterstützt verschiedene Quellen wie Protokolle und Twitter-Feeds.

  • Flume liefert Daten an Systeme wie HDFS, Hive und ElasticSearch.
  • Die Konfiguration beinhaltet die Definition von Quellen, Sinks und Kanälen zur Verwaltung des Datenflusses.

Flume 101

Apache Flume liest eine Datenquelle und schreibt sie in unglaublich hohem Volume und ohne Verluste von Ereignissen in den Speicher. Diese Datenfeeds umfassen Streaming-Protokolle, Netzwerkverkehr, Twitter-Feeds usw. (Beispiele unten)

Aber es bearbeitet keine Datenmanipulation. Stattdessen kann man es in etwas schreiben, das das ermöglicht, wie Hive, und in diesem Fall die SQL-ähnlichen Befehle (HQL) von Hive verwenden, um es zu verarbeiten. Oder man gibt es an ElasticSearch aus, wo die Daten im JSON-Format gespeichert werden, das mit Kibana abgefragt werden kann. Es gibt viele weitere Möglichkeiten, wo man die Daten speichern kann.

play

Installation

Die Installation von Flume ist einfach. Man lädt es einfach herunter und entpackt es. Es gibt keinen Klassenpfad oder Ähnliches, das man festlegen kann. Man startet Flume nicht per se. Stattdessen startet man Agenten, einen für jede Datenquelle, die man lesen und speichern möchte.

Kanalquelle und Senken

Es gibt nicht viel Terminologie, die man beherrschen muss:

Eine Quelle sind Eingabedaten. Eine Senke wird ausgegeben. Und ein Speicherkanal speichert Ereignisse im Speicher, mit der Aufbehalt, dass diese verloren gehen, wenn der Agent stirbt. Einige der Senken, Quellen und Speicherkanäle, die Flume unterstützt, umfassen:

Quellen – Avro (Datenserialisierung mit einem Schema), Thrift (von Facebook geschriebene Abstraktion, um die Kommunikation zwischen verschiedenen Programmiersprachen zu erleichtern), Exec (Shell-Befehle), JMS (Messaging), Twitter, Kafka (LinkedIns Streaming-Produkt), NetCat, Syslog, HTTP, benutzerdefiniert (du kannst deine eigenen schreiben, außerdem gibt es viele Drittanbieter).

Sinks—HDFS, Hive, Logger (Apache log4j), ElasticSearch, Kafka, Custom (Drittanbieter-Plugins wie Cassandra, HBase und MongoDB)

Speicherkanäle – JDBC (bedeutet Datenbanken), Kafka, Datei, Benutzerdefiniert

Konfiguration

Die Konfiguration eines Flume-Agenten folgt dem unten gezeigten Format. Es gibt Quellen (Eingang), Senken (Ausgabe) und Kanäle (verbindet Quellen mit Senken). Der Agentname ist der Name, den Sie sich ausdenken.

Die Farbcodierung zeigt, wie man die Namen von Quellen, Sinks und Kanälen deklariert und diese dann mit den entsprechenden Optionen verknüpft.

    (agent name).sources = (source name)
(agent name).channels = (channel name)
(agent name).sinks = (sink name)

(agent name).sources.(source name).options = value
(agent name).sinks.(sink name).options = value

(agent name).channels.(channel name).options = value

(agent name).sinks.(sink name).channel =   (channel name)
(agent name).sources.(sink name).channel =   (channel name)

Um einen Agenten zu starten, geht man in den Bin-Ordner und führt aus:

    ./flume-ng agent -n (agent name) -c conf -f ../conf/(agent config file name)

Folge einer Reihe

Hier ist ein Beispiel, wie man Syslog auf einem CentOS-System liest. In der Praxis würde man höchstwahrscheinlich Syslog verwenden und dann Flume so konfigurieren, dass es auf TCP- oder UDP-Nachrichten hört. Aber hier verwenden wir einfach Tail.

Wir möchten diese Daten in Hadoop speichern, daher erstellen wir ein Verzeichnis:

    hadoop fs -mkdir /flume

Hier ist unsere Konfigurationsdatei. Beachten Sie die Typen exec und hdfs. Jeder Typ hat unterschiedliche Optionen. Zum Beispiel benötigt der exec-Typ einen Befehl zur Ausführung. Und der hdfs-Typ benötigt den Pfad.

    cat ../conf/flume.conf

# give names to the agent, source, sinks, and channels
agent.sources=tail
agent.sinks=hdfs
agent.channels=ch1

# tell it what command to run
agent.sources.tail.type=exec
agent.sources.tail.command=tail -F /var/log/messages

# give Hadoop options
agent.sinks.hdfs.type=hdfs
agent.sinks.hdfs.hdfs.path=/flume
agent.sinks.hdfs.hdfs.filePrefix=syslog
agent.sinks.hdfs.hdfs.rollInterval=10
agent.sinks.hdfs.hdfs.rollSize=0

# give channel options
agent.channels.ch1.type=memory
agent.channels.ch1.capacity=1000

# connect the sources and sinks to the channel
agent.sources.tail.channels=ch1
agent.sinks.hdfs.channel=ch1

Starte den Flume-Agenten. Der Name des Agenten muss mit dem übereinstimmen, den du in flume.conf eingetragen hast.

    ./flume-ng agent -n (agent  name) -c conf -f ../conf/(config file)

Dann schreibt stdout Nachrichten, die zeigen, dass die Daten geschrieben wurden:

    17/03/08 16:42:44 INFO hdfs.HDFSEventSink: Closing /flume/syslog
17/03/08 16:42:44 INFO hdfs.BucketWriter: Closing /flume/syslog.1488987752411.tmp
17/03/08 16:42:44 INFO hdfs.BucketWriter: Renaming /flume/syslog.1488987752411.tmp to /flume/syslog.1488987752411

Wir können uns anschauen, was es mit Cat geschrieben hat. Es wird nicht immer lesbarer Text sein.

    hadoop fs -cat /flume/syslog.1488987752411

Wenn du einen Fehler in der Konfigurationsdatei hast, gibt dir Flume einen Java-Stack-Trace mit einer recht freundlichen Fehlermeldung, die dir sagt, was falsch ist.

Twitter

Hier schreiben wir Twitter-Tweets mit der Streaming-API von Twitter und speichern diese dann in Hadoop. Dazu musst du zuerst eine App auf https://apps.twitter.com/ erstellen, die dir die Schlüssel gibt, die du zum Verbinden brauchst.

Die Tweets haben in Flume keine Struktur. Wenn du also mit ihnen arbeiten willst, würdest du sie zum Beispiel an Hive schreiben. Dafür musst du das Twitter-Schema in Hive erstellen. Du kannst im Internet nach Anleitungen suchen, wie das geht. In diesem Beispiel schreiben wir sie einfach an Hadoop.

    TwitterAgent.sources = Twitter
TwitterAgent.channels = t1
TwitterAgent.sinks = hdfs

TwitterAgent.sources.Twitter.type = org.apache.flume.source.twitter.TwitterSource
TwitterAgent.sources.Twitter.consumerKey = (obfuscated)
TwitterAgent.sources.Twitter.consumerSecret =  (obfuscated)
TwitterAgent.sources.Twitter.accessToken =  (obfuscated)
TwitterAgent.sources.Twitter.accessTokenSecret =  (obfuscated)
TwitterAgent.sources.Twitter.keywords = health
TwitterAgent.sinks.console.type = logger

TwitterAgent.sinks.hdfs.type=hdfs
TwitterAgent.sinks.hdfs.hdfs.path=/flume/twitter
TwitterAgent.sinks.hdfs.hdfs.filePrefix=messages
TwitterAgent.sinks.hdfs.hdfs.rollInterval=10
TwitterAgent.sinks.hdfs.hdfs.rollSize=0

TwitterAgent.channels.t1.type=memory
TwitterAgent.channels.t1.capacity = 1000


TwitterAgent.sources.Twitter.channels = t1
TwitterAgent.sinks.hdfs.channel = t1

Listen Sie dann die in Hadoop geschriebenen Dateien auf:

    -rw-r--r--   1 root supergroup  217127 2017-03-08 14:54 
/flume/twitter/messages.1488981289896
-rw-r--r--   1 root supergroup  232847 2017-03-08 14:55
/flume/twitter/messages.1488981289897
-rw-r--r--   1 root supergroup     227083 2017-03-08 14:55 
/flume/twitter/messages.1488981289898

Sie können Tweets auf der Konsole protokollieren mit:

    TwitterAgent.sinks.console.type = logger

Aber wie du siehst, sind sie in Hex, also schwer zu lesen:

    7/03/08 14:44:39 INFO sink.LoggerSink: Event: { headers:{} body: 4F 62 6A 01 02 16 61
76 72 6F 2E 73 63 68 65 6D Obj...avro.schem }
17/03/08 14:44:41 INFO sink.LoggerSink: Event: { headers:{} body: 4F 62 6A 01 02 16 61 
76 72 6F 2E 73 63 68 65 6D Obj...avro.schem }

Das ist eine grundlegende Einführung in Flume. Wie du siehst, ist es überhaupt kein kompliziertes Produkt. Als Übung könntest du jetzt versuchen, Syslogs für Flume zu schreiben.

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Orchestrierung

Interessieren Sie sich für mehr von BMC?

The Brief ist unsere monatliche E-Mail zum Mainframe und zur Enterprise-Orchestrierung: Recherchen, Kundenberichte, Produktnachrichten, Events.

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Sie haben The Brief abonniert

Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.