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.
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.
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.
Hadoop-Leitfaden
- Hadoop-Tutorial für Anfänger: Hadoop-Basics
- Eine Einführung in die Hadoop-Verwaltung
- Einführung in die Hadoop-Sicherheit
- Einführung in den Apache Flume
- Eine Einführung in Hive
- Eine Einführung in HDFS
- Einführung in Hbase
- Hadoop-Beispiele: 5 reale Anwendungsfälle
- Hadoop-Karrieren: Einstellung
- Hadoop-Interviewfragen
- Eine Einführung in die Hadoop-Analyse
- Einführung in Apache Pig
- Eine Einführung in Apache-Garn
- Eine Einführung in die Hadoop-Architektur
- Vorteile und Vorteile von Hadoop
- Hadoop mit Apache Cassandra verwenden
- Hadoop vs Kubernetes: Werden K8s & Cloud Native Hadoop beenden?
- Hadoop-Zertifizierungen
- Hadoop-Cluster: Eine Einführung
- Hadoop-Ökosystem und Komponenten
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.