Inhaltsverzeichnis
Apache Flume im Überblick
Mit Apache Flume können Log Events eingesammelt und zentral auf dem HDFS abgelegt werden.
- Eine Art „syslog“ Demon
- Übernimmt den Transport der Log Daten
- Eine „Source“ ließt die Quelle ein
- Ein „Channel“ puffert zwischen
- Ein „Sink“ liefert die Daten ab / schreibt die Daten z.B. auf das HDFS
Übersicht:
Installation unter Linux auf einer Datenbank Umgebung
Da die Logs der Datenbanken auf dem Host sollen eingesammelt werden sollen, wird auf dem Host Flume installiert. Weitere Libraries sind nicht notwendig.
Download der Software : http://flume.apache.org/download.html und prüfen der md5 Summe:
http://ftp-stud.hs-esslingen.de/pub/Mirrors/ftp.apache.org/dist/flume/1.5.0.1/apache-flume-1.5.0.1-bin.tar.gz md5sum apache-flume-1.5.0.1-bin.tar.gz fa43105db822ce045f885a5ebc0f869e apache-flume-1.5.0.1-bin.tar.gz tar xfvz apache-flume-1.5.0.1-bin.tar.gz mv apache-flume-1.5.0.1-bin /usr/lib/apache-flume-1.5.0.1-bin ln -s /usr/lib/apache-flume-1.5.0.1-bin /usr/lib/flume-ng cd /usr/lib/flume-ng/bin # Testen ob flume sich starten läßt ./flume-ng version Flume 1.5.0.1 #Prüfen ob auch ein "echtes" Java 7 ist installiert! java -version java version "1.7.0_67" #falls nicht installieren und mit alternatives bekannt geben!
Aufgabe - Lesen des Listener Logs einer Oracle 11g Datenbank
Architektur
Struktur der XML Log Datei im DIAG Verzeichnis
zum Beispiel dieser typische Eintrag unter $ORACLE_BASE/diag/tnslsnr/<your-server>/listener/alert/log.xml:
<msg time='2014-09-06T11:21:44.179+02:00' org_id='oracle' comp_id='tnslsnr' type='UNKNOWN' level='16' host_id='JUPITER' host_addr='127.0.0.1'> <txt>06-SEP-2014 11:21:44 * (CONNECT_DATA=(SID=GPI)(CID=(PROGRAM=null)(HOST=__jdbc__)(USER=null))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.1)(PORT=49831)) * establish * GPI * 0 </txt> </msg>
Da im Listener.log auch viele interne Vorgänge der Datenbanken, speziell im Cluster Umfeld, protokolliert werden, sollen bereits beim Lesen bestimmte Events ausgefiltert werden. Dazu muss dann später eine eigene „Source“ definiert werden.
Wir lesen die Logs direkt auf dem Oracle Server aus und schreiben die Einträge in den Logs über eine eigenen Agent auf dem HDFS Node 1 in das HDFS.
Übersicht:
Der Agent auf dem DB Server liest als Source die XML Log Datei des Listeners ein.
Ein Channel im Memory sorgt für die Flusssteuerung, ein Avro Skink serialisert die Daten und versendet diese Daten an den Agent auf dem HDFS Knoten.
Der Agent auf dem HDFS Knoten hat eine Source die wiederum die serialisierten Daten im Afro Format empfangen kann, einen Channel im Memory und einen Skink vom Typ HDFS. Damit werden dann die Daten in das HDFS geschrieben.
Voraussetzung
Flume ist installiert, Verzeichnis für die Konfiguration ist bekannt.
/usr/lib/flume-ng/bin/flume-ng version ls - /usr/lib/flume-ng/conf
Test 1 - Nur das Log auslesen und 1zu1 in das HDFS übertragen
Im ersten Test werden die Log Daten einfach in das HDFS geschrieben, um die Grundarchitektur und Konfiguration besser zu verstehen und um die Umgebung zu testen.
Die Daten werden auf dem Oracle Server gelesen und auf den HDFS übertragen, dort übernimmt ein weitere Agent die Daten und schreibt das in das HDFS.
Auf dem HDFS Node 1 - der OracleBigData Lite
Es wird ein Agent angelegt der Daten im Avro Format serialisiert annimmt und auf dann einfach auf das HDFS schreibt.
Dazu wird eine Konfiguration erstellt und der Agent gestartet:
vi /etc/flume-ng/conf/agent2-conf.properties # The configuration file needs to define the sources, the channels and the sinks # Sources, channels and sinks are defined per agent, in this case called agent2 agent2.sources = OraLogFiles agent2.channels = memoryChannel agent2.sinks = hdfsSink # Channel type avro agent2.sources.OraLogFiles.type = avro agent2.sources.OraLogFiles.bind = 10.10.10.12 agent2.sources.OraLogFiles.port = 44444 # The channel can be defined as follows agent2.sources.OraLogFiles.channels = memoryChannel # Each sinks type must be defined agent2.sinks.hdfsSink.type = hdfs agent2.sinks.hdfsSink.hdfs.path = hdfs://bigdatalite.localdomain:8020/user/oracle/gpi agent2.sinks.hdfsSink.hdfs.filePrefix = OraLogs- agent2.sinks.hdfsSink.hdfs.rollCount = 1000 agent2.sinks.hdfsSink.hdfs.batchSize = 10 #Specify the channel the sink should use agent2.sinks.hdfsSink.channel = memoryChannel # Each channels type is defined agent2.channels.memoryChannel.type = memory agent2.channels.memoryChannel.capacity = 100 # # starten # flume-ng agent -n agent2 -c conf -f /etc/flume-ng/conf/agent2-conf.properties
Auf dem Oracle Server
Eine einfache Agent Konfiguration für eine Data Source vom Type „exec“ erstellen (mit dem Typ exec wird ein OS Kommando als Datenquelle angegeben) und als Sink den Agent auf dem Hadoop Node angeben:
# Testen ob der Sink auf dem HDFS Node überhaupt erreichbar ist telnet bigdatalite.localdomain 44444 Trying 10.10.10.12... Connected to bigdatalite.localdomain. Escape character is '^]'. #OK! #Konfiguration anlegen vi /usr/lib/flume-ng/conf/agent-conf.properties # The configuration file needs to define the sources, the channels and the sinks # Sources, channels and sinks are defined per agent, in this case called agent2 agent.sources = OraListener agent.channels = memoryChannel agent.sinks = avro-forward # For each one of the sources, the type is defined # in this example we use a command from the os # Channel type exec agent.sources.OraListener.type = exec agent.sources.OraListener.command = tail -F /opt/oracle/diag/tnslsnr/oradb12c01/listener/alert/log.xml # The channel can be defined as follows agent.sources.OraListener.channels = memoryChannel #sink agent.sinks.avro-forward.type = avro agent.sinks.avro-forward.hostname = 10.10.10.12 agent.sinks.avro-forward.port = 44444 #Specify the channel the sink should use agent.sinks.avro-forward.channel = memoryChannel # Each channels type is defined agent.channels.memoryChannel.type = memory agent.channels.memoryChannel.capacity = 100 # # starten # export JAVA_HOME=/usr/java/jdk1.7.0_67 /usr/lib/flume-ng/bin/flume-ng agent -n agent -c /usr/lib/flume-ng/conf -f /usr/lib/flume-ng/conf/agent-conf.properties # einen Eintrag in das Listener Log erzeugen $ORACLE_HOME/bin/lsnrctl status
Auf dem HDFS Server:
# # Logs auf dem HDFS kontrollieren: # hdfs dfs -ls /user/oracle/gpi/ hdfs dfs -cat /user/oracle/gpi/OraLogs-.1410615198350 SEQ!org.apache.hadoop.io.LongWritable"org.apache.hadoop.io.BytesWritabl]dñ´AZ¤¯¨ QHo9eU </txtHo9eV</msg>Ho9eWK<msg time='2014-09-13T15:34:58.686+02:00' org_id='oracle' comp_id='tnslsnr'Ho9eW= type='UNKNOWN' level='16' host_id='oradb12c01.pipperr.local'Ho9eW host_addr='10.10.10.110'>Ho9eX= <txt>WARNING: Subscription for node down event still pendinHo9eX </txtHo9eX</msg>Ho9eXK" # Daten sind angekommen!
Erweitertes Beispiel
Im nächsten Schritt wird das Log vom Flume Agent mit einer eigenen Filter Source gelesen und übertragen.
Quellen
Doku:
Netz:
Vorträge:
XML Stream: