Von Calvin Knoke auf Dienstag, 18. Mai 2021
Kategorie: Big Data & AI

Big Data SQL - Teil 2: Anwendungsbeispiel

Wie im vorherigen Artikel bereits angekündigt liegt der Fokus des zweiten Teils der Blog-Reihe auf der praktischen Umsetzung von Oracle Big Data SQL. Dies erfolgt an einem Anwendungsbeispiel, welches mit möglichst realitätsnahen Daten arbeitet und im Folgenden vorgestellt wird. Es handelt sich hierbei um Blitzerdaten, welche zufällig generiert wurden. Dabei wird sowohl eine Blitzer_ID, der Stadtname und eine Region für einen Blitzer angelegt. „Stadt" sagt aus, an welchem Ort der Blitzer aufgestellt ist und die "Region" beschreibt das jeweilige Bundesland. Die Virtuelle Maschine (VM), die hier für die Umsetzung verwendet wurde, basiert auf der von Oracle bereitgestellten "Oracle Big Data Lite Virtual Machine" in der Version 4.11 (letztes Update Oktober 2018). Die VM dient zur Einarbeitung in Oracle Big Data SQL und kann dementsprechend auch ohne zusätzliche Kosten verwendet und erweitert werden. Dennoch ist zu beachten, dass keine weiteren Updates für die VM verfügbar sind und diese somit ältere Produktversionen enthält. Einen Überblick von der VM sowie den Download finden Sie über diesen Link: https://www.oracle.com/database/technologies/bigdatalite-v411.html#download_bdalite

In der VM wird die Oracle-Version 12cR1 verwendet und beinhaltet Oracle Big Data SQL in der Version 3.2. Es wird die Version 5.13.1 der Cloudera-Distribution von Apache Hadoop verwendet. Einen Überblick der Versionskompatibilitätsmatrix von Big Data SQL zu Oracle Database und Apache Hadoop finden Sie unten in der Skriptsammlung (4.1 Versionskompatibilitätsmatrix).

Da der Fokus dieser Blog-Reihe auf der Vorstellung des Oracle Big-Data-SQL-Produktes liegt, und nicht etwa eine detaillierte Anleitung für ein mögliches Produktivsystem sein soll, wurde das Hadoop-Cluster nicht abgesichert und sämtliche Sicherheitsvorkehrungen ignoriert. Folglich wurden die Schreib- und Leserechte sehr pauschal und großzügig vergeben.

Um das Anwendungsbeispiel vollständig aufzubauen, wurde ein Setup-Skript erstellt, welches sowohl eine neue Datenbank und Tabellen in Hive anlegt als auch alle notwendigen Oracle-Tabellen erstellt und diese mit Daten füllt. Außerdem werden Verzeichnisse angelegt, die für unterschiedliche Oracle-Datenbankobjekte erforderlich sind. Das Skript lässt sich in der Skriptsammlung unter 4.1 Oracle Setup-Skript einsehen.

Für das Anwendungsbeispiel ist eine weitere Komponente notwendig. Dies sind die Oracle Big-Data-Connectoren, welche die Schnittstellen von Oracle und die des Hadoop-Clusters verbindet. Mithilfe der Big-Data-Connectoren können die Daten aus dem Hadoop Cluster in die Oracle-Datenbank überführt werden. Eine detailliertere Beschreibung erfolgt im Laufe des Artikels.

1 Hadoop/Hive

Neben einer existierenden Oracle-Datenbank benötigt das Anwendungsbeispiel ein Hadoop-Cluster mit integriertem Hive. Die Anpassung bzw. das Aufsetzen erfolgt über diverse Skripte, die ebenfalls im Laufe des Artikels vorgestellt werden. Der Aufbau des HDFS besteht darin, Verzeichnisse anzulegen, welche für die spätere Ablage der Rohdaten gedacht sind. Das Skript zur Hive-Datenbank lädt die Rohdaten in die Datenbank.

Durch das Ausführen des HDFS-Setup-Skriptes werden wie erwähnt alle notwendigen Verzeichnisse im HDFS erstellt. Darunter fallen "user/${USER}/dwh" und "user/${USER}/raw". In das /raw-Verzeichnis werden die Rohdaten geladen, die sich vorab lokal auf dem Linux-OS befinden. Die verwendeten Rohdaten stammen aus der Datengenerierung und haben somit keine nähere Bedeutung. Bereinigte Daten werden in das /dwh-Verzeichnis geladen. Sobald die Verzeichnisse im HDFS angelegt wurden, werden diese mit den Beispieldaten gefüllt.

Das vollständige Skript können Sie in der Skriptsammlung unter „HDFS Setup-Skript" einsehen.

Das Hive-Setup-Skript ist für den Aufbau der in dem Hive Warehouse liegenden Datenbank zuständig. Um dies zu erreichen, werden erst die bereinigten Daten in ein temporäres Verzeichnis kopiert. Dies ist notwendig, damit sich die bereits bereinigten Daten in dem HDFS befinden und somit weiterverarbeitet werden können. In diesem Beispiel ist das "/tmp/bigdata-training/hive-in". Neben der Erstellung neuer Verzeichnisse muss sichergestellt werden, dass diese vom HDFS-Benutzer beschrieben werden können. Dies gilt jedoch spezifisch nur für diese VM. Sollte ein Sicherheitskonzept bestehen, müssen die Berechtigungen dementsprechend angepasst werden. Somit kann anschließend die Blitzer-Datenbank in Hive erstellt und diese mit Daten gefüllt werden.

Das vollständige Skript können Sie in der Skript-Sammlung unter „Hive Setup-Skript" einsehen.

Das "Create-User"-Skript wird benötigt, um einen Benutzer zu erstellen, welcher Berechtigungen für das gesamte Oracle Schema erhält. Darunter fallen die Berechtigungen zum Erstellen von Sessions, Tabellen und Views. Außerdem werden weitere Verzeichnisse angelegt, unter anderem für Big Data SQL und für die SQL-Connectoren.

Das vollständige Skript können Sie in der Skript-Sammlung unter „Create User Skript" einsehen.

Das Skript zum Erstellen des Oracle-Datenbankschemas für den Benutzer "Blitz" ist in der Skript-Sammlung unter „Create Table Skript Oracle" und das Skript zum Erstellen der Hive Tabellen unter "Create Table Skript Hive" zugänglich.

Oracle Big-Data-Connector

Die Oracle Big-Data-Connectoren sind sogenannte Software Suites, um bspw. Apache Hadoop in die Oracle-Datenbank zu integrieren. Sie werden für die Erfassung von Daten und für die Erstverarbeitung verwendet. Für die integrierte Analyse wird eine Verknüpfung zu den in Oracle Database liegenden Daten hergestellt.
Zu den Oracle Big-Data-Connectors zählen unter anderem der „Oracle SQL Connector for Hadoop", „Oracle Loader for Hadoop" und „Oracle DataSource for Hadoop".

Oracle SQL Connector for Hadoop

Der Zugriff auf die Daten in Hadoop erfolgt beim „Oracle SQL Connector for Hadoop" über die Oracle-Datenbank. Es werden externe Oracle-Tabellen verwendet, um Oracle-Datenbanken den Lesezugriff im HDFS auf Hive-Tabellen, Text-Dateien und Data-Pump-Dateien zu ermöglichen. Die externen Tabellen sind Oracle-Datenbankobjekte, die den Speicherort von Daten außerhalb der Oracle-Datenbank angeben. Durch die Abfrage auf die externe Tabelle wird auf Daten zugegriffen, die im HDFS liegen.
Für die Konfiguration des Oracle SQL Connector for Hadoop wird eine XML-Konfigurationsdatei benötigt. Im Anschluss werden alle zu konfigurierenden Eigenschaften in einer Tabelle aufgelistet und beschrieben.

Um dies zu konfigurieren, muss eine XML-Datei angelegt werden. Den Inhalt der XML-Datei können Sie in der Skript-Sammlung unter „Konfigurationsdatei  Oracle SQL Connector for Hadoop" einsehen.

Sofern die Konfiguration der XML-Datei abgeschlossen ist, können nun die Daten in eine externe Oracle-Tabelle geladen werden. Dazu muss folgendes Kommando in der Bash ausgeführt werden:

Anschließend lässt sich im SQL*Plus die externe Tabelle anzeigen:

Oracle Loader for Hadoop

Der „Oracle Loader for Hadoop" ist ein effizienter und leistungsstarker Loader für schnelle Datenübertragung von Hadoop in eine Oracle-Datenbank. Die Daten können vorpartitioniert und in ein datenbankfähiges Format umgewandelt werden. Die Datensätze können nach Primary Key oder benutzerdefinierten Spalten sortiert werden, bevor das Laden der Daten oder die Erstellung der Ausgabedatei abgeschlossen ist. Der Oracle Loader verwendet das Parallelverarbeitungs-Framework von Hadoop, um Verarbeitungsvorgänge nicht auf dem Datenbankserver ausführen zu müssen. Durch die Auslagerung wird die CPU-Auslastung auf Datenbankserver-Ebene reduziert.
Für die Konfiguration des "Oracle Loader for Hadoop" wird eine XML-Konfigurationsdatei benötigt. Im Anschluss werden alle zu konfigurierenden Eigenschaften in einer Tabelle aufgelistet und beschrieben.

Folgende Klassen sind bei der Eigenschaft „Mapreduce.job.inputformat.class" möglich:
Genauere Informationen zu den oben genannten Klassen finden Sie über folgenden Link: https://docs.oracle.com/cd/E37231_01/doc.20/e36961/olh.htm#BDCUG142
Um den Oracle "Loader for Hadoop" konfigurieren zu können, muss ebenfalls eine separate XML-Datei erstellt werden. Die Konfiguration können Sie in der Skript-Sammlung unter​ „Konfigurationsdatei Oracle Loader for Hadoop" einsehen.

Der Oracle Loader benötigt im HDFS ein temporäres Verzeichnis "tmp/olh_outputdir". Dies wird benötigt, um Daten und Reports zu speichern. Zuerst muss ein evtl. existierendes Ausgabeverzeichnis gelöscht werden. Dies erfolgt in der Bash mit folgendem Kommando:

Um nun die Daten in eine Oracle-Datenbanktabelle laden zu können, muss folgendes Kommando in der Bash ausgeführt werden:

An dieser Stelle lässt sich, wie oben bereits angedeutet, die Parallelisierung konfigurieren (-Dmapreduce.job.reduces=1). Je nach zugewiesenem Wert wird die Ausführungszeit eines MapReduce-Jobs halbiert, gedrittelt, etc. In diesem Beispiel hat dies zu keinem signifikanten Unterschied geführt, da es sich lediglich um eine kleine Datenmenge handelt, weshalb der Wert „1" gewählt wurde. Anschließend lässt sich über den SQL*Plus das Ergebnis anzeigen:

Oracle DataSource for Hadoop

Durch das Anlegen von externen Hive-Tabellen kann mit dem "Oracle DataSource for Hadoop" die Schnittstelle implementiert werden, mit der auf die Daten in einer Oracle-Tabelle zugegriffen werden kann. Es wird der direkte und transparente Zugriff auf Oracle-Tabellen ermöglicht. Außerdem sorgen implementierte Optimierungen für einen schnellen, parallelen, konsistenten und sicheren Zugang auf Stammdaten.

Um aus Hadoop auf die Daten einer bestehenden Oracle-Datenbank zugreifen zu können, muss eine externe Hive Tabelle angelegt werden, die dem Oracle-Schema entspricht. Das notwendige Skript kann in der Skript-Sammlung unter „Create External Hive Table Skript" am Ende dieses Artikels eingesehen werden.
Ausführen lässt sich das SQL-Skript in der Bash über folgendes Kommando:

Sobald das Skript abgeschlossen ist, lassen sich die Daten über die beeline-Shell mit einer SELECT-Anweisung anzeigen.

Apache Sqoop

Mit einem Connector gleichzusetzten ist „Apache Sqoop", welches nicht von Oracle stammt. Dies ist ebenfalls ein Datentransfer-Tool für Hadoop-Cluster. Es können Daten über eine JDBC-Verbindung aus SQL- in NoSQL-Datenbank-Infrastrukturen übertragen werden. Es ist sowohl ein Import nach Hadoop als auch ein Export in RDBMS möglich. Der Ablauf eines Imports ist folgender:

  1. Überprüfung der Datenbank, um die Metadaten für die zu importierenden Daten zu sammeln.
  2. Es wird dem Cluster ein Map-only-Hadoop-Job übergeben.
  3. Die Datenübertragung erfolgt schließlich unter Verwendung der gesammelten Metadaten. Die importierten Daten werden im HDFS gespeichert, abhängig von der importierten Tabelle.
Der Ablauf eines Exports lautet wie folgt:
  1. Es werden Metadaten gesammelt und anschließend der Datentransfer gestartet.
  2. Die Daten werden unterteilt und mit individuellen Jobs in die Datenbank verschoben.

Export der Daten (Hive -> SQL) über der Bash:

Import der Daten (Hadoop) über der Bash:

Zusammenfassung/ Fazit

Zusammengefasst ist der Umgang mit Oracle Big Data SQL unkompliziert und durch die von Oracle bereitgestellte Big Data Lite VM existiert eine einfache Variante, um dieses Produkt kennenzulernen. Sowohl die Oracle-Big-Data-Connectoren als auch Apache Sqoop bieten viele unterschiedliche Möglichkeiten, um Daten zwischen den Technologien zu replizieren. Wie bereits erwähnt, ist die aktuelle Version der VM (Big Data Lite 4.11) bereits veraltet. Das Produkt Oracle Big Data SQL, welches sich in der VM in der Version 3.2 befindet, wird jedoch weiterentwickelt und ist aktuell in der Version 4.1 erhältlich.

Skript-Sammlung

4.1 Versionskompatibilitätsmatrix

Oracle Setup-Skript

HDFS Setup-Skript

Hive Setup-Skript

Create User Skript

Create Table Skript Oracle

Create Table Skript Hive

Konfigurationsdatei - Oracle SQL Connector for Hadoop

Konfigurationsdatei - Oracle Loader for Hadoop

Create External Hive Table Skript

Kommentare hinterlassen