Inhaltsverzeichnis
Die Oracle RDBMS und NoSQL Datenbank mit Hadoop verwenden
Wie lassen sich die beiden Welten, die Oracle RDBMS Datenbank und der NoSQL Ansatz sinnvoll für die Archivierung und das Datensammeln einsetzen?
Dazu muss die bestehende traditionelle Oracle Datenbank in die Welt von Hadoop und NoSQL integriert werden, um in der Kombination die Vorteilen beiden Welten für die Analyse und Archivierung von Daten einsetzen zu können.
Hadoop, mit einer entsprechen Container Datenbank Lösung, eignet sich gut um im ersten Schritt Daten zu sammeln und/oder im letzten Schritt Daten zu archivieren.
Die eigentliche Oracle RDBMS Datenbank kann dabei schnell und schlank gehalten werden, um Hardware und damit Lizenzkosten einzusparen
Mit dem kostenpflichten Adapter der Oracle RDBMS lässt sich relativ einfacher eine tiefe Integration mit Hadoop erreichen.
Am Beispiel einer zentralen Archivierung und Auswertung von der Audit Log Daten von vielen Oracle Datenbank Umgebungen werden die möglichen Konzepte dargestellt und vertieft.
Siehe auch meinen Vortrag zu diesem Thema auf einem DOAG Hadoop Workshop und der DOAG 2014:
⇒ Die Oracle Datenbank und Apache Hadoop - DOAG 2014 - Nürnberg 18.11.2014
Bzw. unter Sildeshare: [slideshare id=51535733&doc=oraclehadoop-doag-bigdata092014gpi-150812090124-lva1-app6892]
Integration oder alles neu entwickeln?
In den meisten Umgebungen mit hohen Datenaufkommen sind bereits ausgefeilte Datenbank System und komplexe Data Warehouse Umgebungen im Einsatz.
Viel Energie und erhebliche Kosten sind in den Aufbau dieser Landschaften geflossen, die zum aktuellen Zeitpunkt auch oft noch ausreichend skalieren und erfolgreich betrieben werden.
Bei neuen Anforderungen kann es sich aber durchaus lohnen auch in neue Technologien einzusteigen.
Die zu lösende Frage heißt dann aber wie die „neu“ und „alte“ Welt produktiv und sinnvoll verknüpft werden kann.
Die Integration kann zum Beispiel über das Berichtwesen erfolgen, d.h. die Daten werden komplett voneinander getrennt verarbeitet und erst im Berichtwesen zusammen gefügt.
Oder die Datenbanken werden eng mit Hadoop verwoben, die eigentlichen Abfragen erfolgen weiterhin klassische über eine zentrale Datenbank Umgebung, die aber im Backend auf die Daten im Hadoop Cluster mit verschieden Methoden und Schnittstellen adhoc zugreift.
Für die Integration stehen im Prinzip zwei Konzepte zur Verfügung:
- Das External Table Prinzip – Daten bleiben im HDFS und werden über die Datenbank per SQL „on the fly“ gelesen
- SQL*Loader Prinzip – Daten werden für die jeweilige Abfrage zuvor in die Datenbank geladen
Für das „External Table Prinzip“ steht uns zur Verfügung:
- Oracle External Table auf ein freigegebenes HDFS Verzeichnis
- Oracle External Table mit dem kostenpflichtigen Oracle Adapter - Oracle SQL Connector for Hadoop - OSCH
- Oracle External Table mit einem eigenen Adapter über die „PREPROCESSOR“ Anweisung des external Table Kommandos
- Oracle heterogeneous Gateway mit einen JDBC Treiber auf z.B. eine Hive Datenbank
- Eigene Java Klassen implementieren das MapReduce Pattern in der Oracle Datenbank und lesen dazu die Daten auf dem HDFS
Für das „SQL*Loader Prinzip“ steht uns zur Verfügung:
- Oracle Loader for Hadoop – OLH
- Apache Sqoop
- Eigene Java Klassen implementieren das MapReduce Pattern und lesen die Daten in die DB ein
Übersicht über Data Transfer/Import-Export Frameworks
Oracle Big Data
Oracle Direct Connector for Hadoop Distributed File System
Apache Sqoop(TM)
- Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases see ⇒ http://sqoop.apache.org/
Quest
- Data Connector for Oracle and Hadoop ⇒ http://www.quest.com/data-connector-for-oracle-and-hadoop/
Apache Flume
Flume ist für das Sammeln von Log Files gedacht:
Flume Tutorial: ⇒ http://hortonworks.com/hadoop-tutorial/how-to-refine-and-visualize-server-log-data/
Erste Schritte mit dem Oracle SQL Connector for HDFS - OSCH
Mit dem „Oracle SQL Connector for HDFS„ wird eine External Table in der Oracle Datenbank mit Daten auf einem HDFS Cluster verbunden. Die Daten werden als Datenstrom vom HDFS Filesystem gelesen und in der Oracle Datenbank wie gewohnt bei einer External Table verarbeitet.
Mit einem Kommando Zeilen Werkzeug wird dazu die External Table per SQL Befehlt in der Oracle Datenbank angelegt und pro Datendatei im HDFS ein Locatoin File im Fileystem im Verzeichnis des DIRECTORY der external Table abgelegt.
Es können Datapump External Table Exports, Hive Tabellen und strukturierte Text Dateien ausgelesen werden.
Wird nun auf die External Table zugegriffen zieht die PREPROCESSOR Anweisung im DDL der Tabelle, eine Java Klasse liest die Informationen im den Location Files und erzeugt eine Datenstrom auf die entsprechenden Dateien im HDFS.
Installation
- Hadoop Client auf DB Host aufsetzen
- Zip Archive auspacken und Umgebung anpassen
- Oracle DB User einrichten/konfigurieren
- Mit „external Command Tool“ die External Tabelle anlegen
- Abfragen
Eine externe Tabelle anlegen
Die External Tabelle wird mit dem „external Command Tool“ des Adapters angelegt.
Im folgenden Beispiel wurde zuvor die AUD$ einer anderen Datenbank per Daten laden mit Apache sqoop in das HDFS geladen.
Zuvor muss der entsprechende User in der Datenbank angelegt werden und die entsprechenden Rechte besitzen.
Beispiel für eine Befehlt um eine solche external Table anzulegen:
hadoop jar $OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ -D oracle.hadoop.exttab.hive.tableName=ext_ora_audit_gpi \ -D oracle.hadoop.exttab.hive.databaseName=default \ -D oracle.hadoop.exttab.sourceType=hive \ -D oracle.hadoop.exttab.tableName=ext_ora_audit_gpi_hive \ -D oracle.hadoop.connection.url=jdbc:oracle:thin:@//localhost:1521/orcl \ -D oracle.hadoop.connection.user=scott \ -D oracle.hadoop.exttab.defaultDirectory=HADOOP_EXT_TABS \ -createTable
In der Datenbank wird die passende External Table angelegt, der interessante Teil des DDL Statements für die External Table ist die Preprozessor Anweisung und die Angabe der Location Dateien mit den Informationen (im XML) Format, wo auf dem HDFS die eigentlichen Daten zu finden sind.
Die Performance hängt davon ab wie schnell die Daten aus dem HDFS gelesen werden können, eine performante Netzwerkanbindung an das Hadoop Cluster ist dabei unbedingte Voraussetzung, da die Daten zur Datenbank gestreamt werden und erst dort verarbeitet werden.
In den ersten Schritten ergaben sich einige kleinere Problem bei der Umsetzung.
Für die Verwendung von Hive Tabellen müssen zum Beispiel die Hive Klassen mit dem Klassenpfad der Umgebung aufgenommen werden, das ist mir über einen fest kodierten Eintrag in der „hadoop.sh“ Datei gelungen.
Auch darf die Hive Tabelle darf keine Spalte von Typ Binary enthalten.
Auch konnte das Kommando Tool die Darstellung der Null Spalte nicht richtig interpretieren, in meine zuvor mit sqoop auf das HDFS importieren Daten wird null als 'null' dargestellt, d.h. der im SQL Statement für die externe Tabelle erzeugte Format Anweisung „TIMESTAMP“ CHAR DATE_FORMAT DATE MASK 'YYYY-MM-DD' NULLIF „TIMESTAMP“=0X'5C4E'“ (/t) muss dann auf „TIMESTAMP„ CHAR DATE_FORMAT DATE MASK 'YYYY-MM-DD' NULLIF „TIMESTAMP“=0X'276E756C6C27'“ angepasst werden.
siehe im Detail: ⇒ Erste Schritte mit der Oracle Big Data Appliance - AUD$ Daten in der DB wieder als External Table zur Verfügung stellen
Oracle Loader for Hadoop - OLH
Mit dem Oracle Loader for Hadoop - OLH werden Daten aus dem Hadoop Cluster in die Oracle Datenbank geladen.
- Online Mode – Daten werden direkt in die Datenbank geladen
- Offline Mode – Daten werden zuerst aus dem Hadoop in DataPump oder CSV Format erzeugt und können später traditionell eingebunden werden
Beispiel für die Umsetzung ⇒ Mit dem Oracle Loader for Hadoop – OLH vom Hadoop Daten einlesen
Online Doku Release 3 ⇒ http://docs.oracle.com/cd/E53356_01/doc.30/e53067/olh.htm#BDCUG140
Oracle External Table mit Hadoop ohne OSCH einsetzen
Seit Oracle 11g Release 2 kann mit der PREPROCESSOR Anweisung etwas Logik mit externen Programmen eingebaut werden.
Über die PREPROCESSOR Anweisung beim Anlegen einer Oracle External Table kann eine Shell Datei aufgerufen werden.
Als Aufrufparameter erhält die Shell Datei dabei die LOCATION Angabe der External Table.
In der Datei wiederum ist der Entwickler frei, alles zu entwickeln und aufzurufen was notwendig ist.
Das Ergebnis wird auf STANDARD OUT ausgegeben und von dort von der DB verarbeitet.
Pro Datei in der LOCATION Angabe wird die Shell Datei dabei aufgerufen.
Bei der Entwicklung ist zu beachten, dass die Shell Datei im Scope eines DB Server Prozess aufgerufen wird und damit nur die in diesem Scope gültigen Rechte und Umgebungsvariablen zur Verfügung stehen. Entsprechend genau müssen Pfade und Umgebungsvariablen bei Bedarf gesetzt werden.
Im Detail siehe hier ⇒ CSV Dateien in Oracle als external Table lesen und importieren
Oracle External Table über FUSE anbinden
Über das Fuse Projekt kann das Hadoop HDFS als Filesystem an den Datenbank Host angebunden werden.
Damit steht die klassischen Oracle External Table Methode zur Verfügung ohne eine extra Lizenz zur Verfügung.
Allerdings muss mit höheren CPU Bedarf für diese Lösung gerechnet werden.
Siehe hier ⇒ Hadoop HDFS mit Apache Fuse als "normales" Filesystem mounten
Einsatz von Open Source Werkzeugen zum Lese/Schreiben der Daten
Auch ohne den Oracle Adapter kann eine Lösung auf Basis der Werkzeuge rund um das Hadoop Cluster umgesetzten werden.
Mit dem SQL*Loader Werkzeug Apache sqoop kann ähnlich wie mit dem Oracle Loader gearbeitet werden, mit sqoop können Daten in beiden Richtungen, auf das HDFS oder in die Datenbank transferiert werden.
Für mehr Informationen im Detail siehe:
Apache Flume um die Logfiles einzulesen
Mit Apache Flume können Log Events eingesammelt und zentral auf dem HDFS abgelegt werden.
Siehe hier ⇒ Apache Flume - Lesen des Listener Logs einer Oracle 11g Datenbank
Auswertung der Daten
Ziel ist es zwar auch über die zentrale Oracle das Berichtwesen zu organisieren, allerdings sind bei sehr großen externen Tabellen doch Grenzen gesetzt.
Da per JDBC direkt auf die Hive Tabellen zugegriffen werden kann, können auch vielen bekannte Werkzeuge verwendet werden um die Daten direkt auszuwerten
Als Alternative bietet sich eine wirklich für Hadoop entwickelte Lösung wie Hue als freie Opensource Lösung an. Neben den reinen Abfragen kann das Werkzeug auch die Verwaltung der Daten vereinfachen.
Siehe hier ⇒ Das Hue Web interface für die Analyse von Daten mit Apache Hadoop
Fazit
Ein Apache Hadoop Cluster bietet sich als eine gute Lösung für die Anforderung eines zentralen Audit Vaults für Log Daten an.
Die notwendigen Werkzeuge für die Umsetzung der Anforderung sind verfügbar, die meisten Fragen relativ gut dokumentiert. Funktional steht alles zur Verfügung, was benötigt wird.
Die Orchestrierung des Ganzen ist jedoch die große Herausforderung bei einem solchem Projekt.
Der damit verbunden Aufwand sollte nicht unterschätzt werden. Neben der benötigten Hardware ist der Betrieb einer größeren Cluster-Umgebung schnell eine große Herausforderung. Professionelle Lösung wie Splunk© bieten „Out of the box“ bereits alle notwendigen Features und es muss genau im Detail geklärt werden, ob sich der hohe Zeitaufwand einer Eigenentwicklung am Ende auszahlt.
Der große Vorteil der Eigenentwicklung einer Audit Valut Lösung liegt darin, mit diesem Projekt einen guten Einstieg in diese neue Technologie ohne großes Business Risiko umsetzen zu können.
Die damit gemachten Erfahrungen können Eins zu Eins dazu dienen, die bestehenden DWH Umgebung zu erweitern und zu ergänzen, um auch in der Zukunft auch mit großen Datenmengen wettbewerbsfähig zu bleiben.
Quellen
Oracle:
Release 3
Netz: