==== 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: {{ :hadoop:apache_flume_v01.png?400 | Apache Flume Architektur}} ==== 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//listener/alert/log.xml: 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 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: {{ :hadoop:read_listener_log_oracle_flume_v01.png?500 | Auslesen Oracle Listener Log mit Apache Fume}} 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 Ho9eWKHo9eX= WARNING: Subscription for node down event still pendinHo9eX 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 ==== * http://flume.apache.org * Doku: * http://flume.apache.org/releases/content/1.5.0.1/FlumeUserGuide.html * http://flume.apache.org/FlumeUserGuide.html * https://blogs.apache.org/flume/entry/flume_ng_architecture Netz: * http://yourstory.com/2012/04/hive-for-retail-analysis/ * http://www.lopakalogic.com/articles/hadoop-articles/log-files-flume-hive/ * http://harish11g.blogspot.de/2012/05/retail-analysis-hive-flume-hadoop.html * http://www.implementhadoop.com/use-case-1-apache-log-analysis/ * http://www.vmware.com/files/pdf/products/vsphere/VMware-vSphere-Data-Ingestion-Solution-Guide.pdf * http://www.rittmanmead.com/2014/05/trickle-feeding-webserver-log-files-to-hdfs-using-apache-flume/ * http://sanjivblogs.blogspot.de/2011/04/quick-flume-installation-and.html Vorträge: * http://archive.apachecon.com/na2013/presentations/27-Wednesday/Big_Data/11:45-Mastering_Sqoop_for_Data_Transfer_for_Big_Data-Arvind_Prabhakar/Arvind%20Prabhakar%20-%20Planning%20and%20Deploying%20Apache%20Flume.pdf XML Stream: * http://www.ibm.com/developerworks/opensource/library/bd-flumews/index.html