Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung Offloading Data Warehouse – Objekte mit Hadoop Konzepte und technische Umsetzung Mit Beispiel-Szenario September 2016 1 Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 2 Die Themen Offloading Data Warehouse –Objekte mit Hadoop Konzepte und technische Umsetzung ............ 1 Big Data und mehr.. ...................................................................................................................... 3 Den schnellen Nutzen für das Data Warehouse mit Hadoop ..................................................... 3 Die Hadoop-Technologie verspricht Hilfe ...................................................................................... 4 Offloading Data Warehouse? Aber wie? ....................................................................................... 4 „Finden der richtigen Kandidaten für das Offloading“ ................................................................. 5 Die Umsetzung dieser Architektur ................................................................................................. 6 Voraussetzungen ....................................................................................................................... 6 Selektieren der Daten im DATA WAREHOUSE ......................................................................... 6 Bewegen der Daten in das HDFS .............................................................................................. 7 Die Organisation der Daten im HDFS ........................................................................................ 8 Der Abfragen-Part ......................................................................................................................... 8 SQL ............................................................................................................................................ 8 Hive ............................................................................................................................................ 8 Big Data SQL ............................................................................................................................. 9 Die Anwendung von Big Data SQL und die Hilfsobjekte .......................................................... 11 Gesplittete Fakten Tabellen und die Kombination von In-Memory Datenbank und HDFS ....... 12 Zusammenfassung der Faktoren, die die Leseperformance auf HDFS beeinflussen .............. 12 Ein Star Schema Szenario .......................................................................................................... 13 Die Ausgangsdaten .................................................................................................................. 13 Genutzte Infrastruktur............................................................................................................... 14 Übersicht zu den genutzten Objekte in dem Szenario und die Vorgehensweise ..................... 15 Schritt 1: Sqoop – Der Offload-Vorgang ................................................................................... 15 Schritt 2: Die Daten im HDFS ................................................................................................... 16 Schritt 3: Die Hive Definition ..................................................................................................... 16 Schritt 4: External Table in der Oracle Datenbank ................................................................... 17 Schritt 5. Die Abfragen ............................................................................................................. 17 Erfahrungen, Bewertung und Ausblicke ...................................................................................... 24 Datenmengen und Realität ....................................................................................................... 24 Technisches Know how ist beherrschbar ................................................................................. 24 Implementierung, Implementierungsaufwand und was sich wirklich ändert ............................. 24 Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 3 Big Data und mehr.. Heute gibt es eine Reihe von Einsatzszenarien für Big Data, auch wenn der Begriff Big Data zunehmend verwischt und oft für alles herhalten muss, was Softwarehersteller anbieten. Die Diskussion hat aber das Bewusstsein gegenüber Daten in den Unternehmen, und mehr noch, gegenüber den Daten in unseren Alltagssituationen geschärft. Data Warehouse-Anwendungen haben in der Vergangenheit immer wieder versucht zumindest die Unternehmensdaten zusammenzufassen, zu konsolidieren und sie passgenau den Anwender für Analysezwecke anzubieten. Big Data-Konzepte versprechen heute mehr: Sie beschäftigen sich mit neuen Datenquellen außerhalb der Unternehmen, Sie beschäftigen sich mit neuen Datenarten, z. B. Kommunikations- und Bewegungsdaten, Sie wenden neue Prinzipen an z. B. „zuerst sammeln dann mal sehen, was man davon hat“ … Ohne diese Liste fortzusetzen lässt sich jetzt schon feststellen: Das klassische Data Warehouse wird weiter seine Dienste tun, aber mit Big Data wird es noch mehr können. Den schnellen Nutzen für das Data Warehouse mit Hadoop Die Big Data Diskussion ist aktuell geprägt von der Suche nach Use-Cases, neuen Geschäftsoptionen oder der Suche nach dem, was man alles mit den uns umgebenden Daten anfangen kann. Die vorliegende Darstellung sucht nicht nach neuen Use Cases, sondern Sie beschäftigt sich mit den Potenzialen der Hadoop-Technologie als Erweiterung der bestehenden Data Warehouse – Lösungen in den Unternehmen. Die Früchte der neuen Technologie liegen zumindest für das Data Warehouse greifbar nah, wie die vorliegende Beschreibung zeigen wird. Die HadoopTechnologie liefert für das klassische Data Warehouse mindestens die folgenden drei interessanten Nutzenaspekte: 1. Datenvolumen in den Griff bekommen Es ist die Natur von Data Warehouse-Systemen, dass sie wachsen, und je wichtiger die Rolle des DATA WAREHOUSE im Unternehmen wird, umso größere Datenmengen sammeln sich an und damit steigen auch die Kosten, durch das Speichern von gewaltigen Datenmengen in hochentwickelten relationalen Datenbanksystemen. 2. Auch bei extrem hohen Datenmengen performant auswerten Bei großen Datenmengen wird trotz schnellerer Datenbanktechnik der Performance-Aspekt wieder relevant. Abfragen auf 100 Terabyte große Tabellen stehen im Raum. Das Cluster-Verfahren, das die Hadoop-Technologie mit sich bringt, verspricht die Performance-Herausforderung mit einem überschaubaren Invest zu beherrschen. 3. Neue Datenarten: „Es muss nicht immer alles rein ins Data Warehouse“ Die Analysen zu Strategie und Taktik von Unternehmen haben sich in den vergangenen Jahren gewandelt: hat man bislang primär den Unternehmenserfolg durch Berichte und Statistik gemessen, so sucht man heute neue Handlungsoptionen und Geschäftsfelder wo immer man sie auch finden kann. Bei den dazu benötigten neuen Datenarten wie Bewegungs-, Wetter-, Video- oder Audiodaten fragen sich viele Verantwortliche, ob diese Daten noch in ein herkömmliches DATA WAREHOUSE gehören. Anderseits will man diese Daten einem Analysevorgang unterziehen und sie mit Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 4 herkömmlichen Daten kombinieren. Also gehören sie doch wieder in das DATA WAREHOUSE und lassen das Datenvolumen noch mehr wachsen. Die Hadoop-Technologie verspricht Hilfe Die Mitte des letzten Jahrzehnts entwickelte Hadoop-Technologie liefert im Kern zwei entscheidende Merkmale: 1. Mit HDFS (Hadoop Distributed File System) ein über einen beliebig erweiterbaren RechnerVerbund (Cluster) verteiltes Dateisystem, in dem man ohne Gedanken an Ort und Platz zu verschwenden, alle massenhaft gesammelten Daten loswerden kann. 2. Mit MapReduce (bzw. Spark als Nachfolgeverfahren) ein extrem parallelisierbares Bearbeitungsverfahren, das auch sehr große Datenmengen bewältigen kann. Hadoop verspricht darüber hinaus eine Reihe von Vorteilen: Kosten: Das HDFS begnügt sich mit Standard Hardware. Man kann sehr große Datenmengen mit kostengünstigen vorhalten und für aus dem Open Source Apache-Pool stammende Hadoop Software sind keine Lizenzen an Hersteller zu bezahlen. Schema on Write vs. Schema on Read: Anders als in einem Datenbanksystem, das eingehende Daten zunächst syntaktisch prüft und z. B. in Spalten organisiert (Schema On Write), legt man bei dem HDFS die Daten ungeachtet einer möglichen Struktur oder syntaktischen Korrektheit direkt ab. So sind große eingehende Datenströme sehr schnell versorgt. Allerdings muss der spätere Analysevorgang die Strukturierung dieser Daten nachholen (Schema on Read). Offloading Data Warehouse? Aber wie? Bzgl. Data Warehouse heißt das Zauberwort jetzt „Offloading“. D. h. man verlagert die wachsenden Daten des DATA WAREHOUSE in das HDFS. Ziel ist vor allem Kosten zu sparen: bei der Datenhaltung und durch die Aufwandminimierung bei dem ETL-Prozess (Schema on Read - Gedanke). In einigen Vorträgen, gerade aus der Open Source Community, hört man schon Vorschläge nach denen das DATA WAREHOUSE komplett in das HDFS gelegt werden soll. Aber bei dieser pauschalen Betrachtung sollte man den Sinn und Zweck eines DATA WAREHOUSE nicht aus dem Auge verlieren. Denn zum einen soll ein DATA WAREHOUSE z. B. durch Normalisierung eine gewisse Redundanzfreiheit und Harmonisierung in den Daten gewährleisten und weiter: Ein DATA WAREHOUSE soll durch eine bewusste Strukturierung der Daten den Analyseprozess unterstützen, Beispiele sind hier die hierarchisch aufgebauten Dimensionen und ihre Beziehungen zu einer Faktentabelle im multidimensionalen Star-Modell. Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 5 „Finden der richtigen Kandidaten für das Offloading“ Also bedeutet das: wir müssen die unterschiedlichen Ziele von neuer Technologie und sinnvollen Warehouse-Konzepten miteinander in Einklang bringen. Ein erster Schritt ist die Auswahl von Datenarten, die sich für ein Offloading anbieten1. Ausgangsarchitektur eines Data Warehouse Im Integration Layer (Data Stage) hatte man bislang Daten zu Prüf- und Aufbereitungszwecken nur temporär vorgehalten und man versuchte die eingehenden Datenmengen durch Selektion möglichst gering zu halten, um das Datenwachstum im DATA WAREHOUSE zu begrenzen. Mit Hadoop lässt sich die Funktion eines Integration Layers jetzt offener gestalten: Man kann Daten dort liegen lassen, von denen man noch nicht weiß, wer sie wie später analysieren wird. Man sammelt Daten auf Vorrat und hat damit die Idee des Data Lake verwirklicht. In diesem Data Lake sammelt sich jetzt alles ungeachtet der Struktur, Quelle, Machart und späteren Verwendung. Nur Teile daraus wandern wirklich in das DATA WAREHOUSE. Ein als Data Lake umfunktionierter Integration Layer wird auch für Endbenutzer geöffnet, was bislang undenkbar war. Im Enterprise Layer (Kern-Warehouse-Schicht) finden wir die Masse der Stamm- und Referenzdaten. Diese reflektieren die Unternehmens- und auch Geschäftsprozessstruktur. D. h. diese stellen in Verbindung mit entsprechenden Kennzahlen einen strategischen Wert für das Unternehmen dar. Solche Informationen gehören in einen standardisierten, strukturierten und von Redundanzen bereinigten Raum. Der beste Platz dafür ist eine relationale Datenbank. Es bleiben die voluminösen granularen, transaktionalen Bewegungsdaten, die einen sehr hohen Anteil der Gesamtdatenmenge des DATA WAREHOUSE ausmachen. In diesem Pool entstehen die ersten Kandidaten für ein Offloading. Im User View Layer (Data Marts) mit den multidimensionalen Star Schemen bieten sich die großen Fakten-Tabellen an. Allerdings bei nach Zeit partitionierten Faktentabellen nur die älteren Daten. Die Partitionen der jüngsten Berichts- Analyseperioden würde man für eine In-Memory-Speicherung vorhalten. Auch die hierarchisch strukturierten Dimensionen bleiben in der relationalen Datenbank. 1 Für diese Betrachtung wird Verständnis für eine grundlegende Warehouse-Architektur vorausgesetzt. Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 6 Mögliche Zielarchitektur eines mit Hadoop-Technik erweiterten Data Warehouse Die Umsetzung dieser Architektur Voraussetzungen Mindestens zwei Voraussetzungen müssen bei der Umsetzung einer solchen Architektur gegeben sein: 1. Data Warehouse-Daten sollten selektierbar sein und performant periodisch in das HDFS bewegt werden können. 2. Die HDFS-Daten sollten kombiniert mit den Datenbankdaten mit SQL abfragbar sein. Mehr noch: Es sollte möglich sein, sog. Hybride Tabellen mit einem einzigen Select abzufragen, also Tabelle, die je nach Alter der Daten ein Teil in der Datenbank (eventuell InMemory) und einen zweiten Teil im HDFS liegen haben. Offload von Faktentabellen Selektieren der Daten im DATA WAREHOUSE Selektierbar sind Daten Im DATA WAREHOUSE über eine entsprechende SQL-Abfrage immer. Allerdings kann man diese Selektion durch die zeitbezogene Partitionierung erleichtern und vor Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 7 allem standardisieren. Große Faktentabellen sind in einem Oracle DATA WAREHOUSE meistens partitioniert, so dass das Verfahren aus Datenbank-Sicht leicht möglich ist. Bewegen der Daten in das HDFS Zur Datenbewegung aus der Datenbank in das HDFS nutzt man entweder das bidirektionale Sqoop (Open Source und Standort HDFS-Cluster) oder das Oracle Tool Copy2Hadoop (Standort Oracle Datenbank). Sqoop ist ein Batch-Utility zum Exportieren und Importieren von Daten aus relationalen Datenbanken. Oracle stellt für Sqoop ein zusätzliches Add-In (OraOop) zur Verfügung, das den Zugriff von Sqoop auf die Oracle Datenbank optimiert. Mit Sqoop lässt sich ein Query-Parameter formulieren, der analog zur Where-Klausel eines Select-Statements arbeitet. Man kann jedoch auch komplette Tabellen und, was dem hier angesprochenen Konzept entgegen kommt, einzelne Tabellen-Partitionen über deren Namen ansprechen und in das HDFS laden. Durch das Oracle-AddIn OraOop kennt Sqoop die Strukturdaten, wie sie in dem Oracle – Datenbank-Dictionary enthalten sind, sehr genau, so werden u. a. Feldtyp-Konvertierung passgenau unterstützt. Sqoop erzeugt auf dem Hadoop-Cluster einen MapReduce-Job. Damit ist der Vorgang auch unabhängig von der Datenbank massiv parallelisierbar. Mit Sqoop lässt sich aber auch die Zielwelt im HDFS sehr gut bestimmen. Sqoop unterstützt die wichtigsten File-Typen wie Parquet, ORC2, AVRO und natürlich einfache CSV-Dateien. Die Zielobjekte sind beim Schreiben komprimierbar, man kann sie partitionieren und auch automatisch Hive-Metadaten erzeugen lassen. Die beispielhaften Ladezeiten in der folgenden Tabelle entstammen aus einem Szenario mit einer Exadata Quarter Rack und Big Data Appliance Starter Rack (6 Cluster Knoten): Ladezeiten von sqoop 2 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC#LanguageManualORC-FileStructure Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 8 Das Oracle-Utility Copy2Hadoop erzeugt mit Hilfe einer External Table ein Datapump-File und legt es im HDFS ab. Dieses Datapump-File ist später wieder über eine External Table aus der Datenbank heraus lesbar. Und, das sollte nicht vergessen werden, dieses File kann auch über Hive 3 im HDFS gelesen werden. Es besteht also durchaus eine gewisse Offenheit. Setzt man eine Oracle Exadata-Maschine in Verbindung mit Oracle Big Data Appliance ein, so kann man den Ladevorgang mit beiden Tools durch das dazwischen eingesetzte Infiniband-Protokoll gegenüber TCP/IP erheblich beschleunigen. Die Organisation der Daten im HDFS Die Ablage der Daten im HDFS sollte nicht zufällig erfolgen, denn man hat Optionen, die sich auf das spätere Lesen der Daten deutlich auswirken können. Eine erste Option ist die Komprimierung. Komprimierungs-Utilities (Gzip, Snappy) können z. B. während des Schreibvorgangs durch Sqoop angesprochen werden. Komprimierungsfaktoren von 24 lassen sich gut erreichen und damit minimiert sich vor allem der später aufzubringende IOLeseaufwand. Das Lesen wird also schneller. Performantes Lesen wird auch durch den Dateityp unterstützt. Auch in der Hadoop-Szene geht man dazu über, Daten in einer organisierten und strukturierten Form zu speichern. Parquet, ORC und AVRO Files sammeln Metainformationen über die Struktur der Daten und speichern sie in separaten Objekten. Solche Dateien sind schon fast eigenständige Datenbanken mit Indexblöcken, ColumnStrukturen und Metadatenverweisen. Es ist also zu überlegen, die ausgelagerten Warehouse-Daten z. B. als Parquet- oder AVRO-File abzulegen. Das später von Oracle eingesetzte Big Data SQL wird mit allen Dateitypen zurechtkommen und von der Optimierung, den diese File-Typen mitbringen profitieren. Der Abfragen-Part SQL Die ausgelagerten DATA WAREHOUSE-Daten befinden sich jetzt auf einem Hadoop-System. Die Anwender arbeiten jedoch weiterhin mit den Daten in dem DATA WAREHOUSE. Sie werden von der zusätzlichen Datenhaltung im Hadoop nichts merken. Der Grund dafür ist die Verwendung von SQL. SQL wird in vielen Business Intelligence- und anderen Analysewerkzeugen als die Abfragesprache schlechthin genutzt. Gelingt es mit SQL auch auf HDFS-Daten zuzugreifen, so sind all diese Werkzeuge ohne Einschränkung oder zusätzlichen Lernaufwand für die Anwender weiterhin nutzbar. Hive In aktuellen Hadoop-Umgebungen wird das Lesen u. a. durch Hive unterstützt. Hive stellt eine Art SQL-Engine in der Hadoop-Welt dar. Die wichtigste Eigenschaft von Hive ist dabei die Metadatenartige Strukturierung von HDFS-Files. Danach erscheinen z. B. CSV-Files als wenn es Tabellen einer relationalen Datenbank wären, auf die man mit HiveQL zugreifen kann. Zudem unterscheidet Hive zwischen externen und internen Tabellen. Interne Tabellen organisiert Hive in eigenen 3 Auf Hive wird weiter unten noch eingegangen. Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 9 Dateiverzeichnissen. Beide Tabellenarten sind jedoch letztlich Files in dem HDFS-Directory, die auch ohne Hive geschrieben, gelesen und bearbeitet werden können. Big Data SQL Oracle Big Data SQL nutzt diese Metadaten-Funktion von Hive. Für das Lesen der eigentlichen Daten wendet man die bereits von der Exadata her bekannten Smart-Scan-Prozesse an. Dabei überträgt man die Abfrageanforderung des Selects aus der Oracle Datenbank auf ein kleines Softwarepaket auf jedem einzelnen Cluster-Knoten des Hadoop-Systems. Man verfolgt zwei Ziele: Das schnelle Lesen und Interpretieren der HDFS-Daten, Das Reduzieren der Datenmenge, die zur eigentlichen Datenbank-Instanz und damit zum Anwender fliest. Wie in dem Beispiel weiter unten zu sehen ist, entstehen dabei extrem gute Performancewerte mit einer horizontalen Skalierung, denn das Verfahren nutzt die Hadoop-eigene Parallelisierung über die Rechenkerne der Hadoop-Clusterknoten. Zum Verstehen der Daten in den HDFS-Datenblöcken kommen C-basierte Lese-Routinen und native Hadoop Klassen zum Einsatz. Erst danach findet eine Konvertierung in „Oracle-Verstehbare“-Column- und Feldstrukturen statt. Der Lesevorgang in Hadoop durch Big Data SQL Oracle hat in diesem Verfahren eine Reihe von Optimierungen eingebaut: Der Storage-Index merkt sich z. B. Max/Min-Werte pro Column und Block. Dieser Effekt wird natürlich erst spürbar sein, nachdem die HDFS-Daten bereits einmal gelesen und der Index dynamisch aufgebaut wurde. Der Storage-Index berücksichtigt Abfrage-Bestandteile wie: o Equality (=) o Inequality (<, !=, or >) o Less than or equal (<=) o Greater than or equal (>=) o IS NULL o IS NOT NULL Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 10 Ein Storage-Index ist Knoten-lokal. D. h. er bezieht sich immer nur auf die Daten, die auf einem einzelnen Hadoop-Cluster-Konten liegen. Sind Daten von einem weiteren Knoten von der Abfrage betroffen, so muss dieser neu aufgebaut werden. Für eine HDFS-Datei (Hive-Table) sind bis zu 32 Columns indizierbar. Wird allerdings aus der Datenbank noch eine zweite External Table (siehe weiter unten) definiert, so erhält man weitere 32 Indexe.Die Storage Indexe arbeiten für numerische Felder genauso wie für Character und Date-Felder. Viele, von der Datenbank her bekannten SQL-Funktionen, bringt Big Data SQL in einem Offload-Schritt auf die Cluster-Knoten. Das Ausnutzen solcher Funktionen auf der HadoopSeite verlagert den wohl größten Teil des Interpretationsaufwands auf die Hadoop-Seite und wenn es einschränkende Funktionen sind, dann minimiert sich die zu bewegende Datenmenge enorm. Hier ein Ausschnitt aus den „Offloadable Functions“: != < <= = > >= ABS ACOS ADD_MONTHS ADJ_DATE ASCII ASCIISTR ASIN ATAN ATAN2 BIN_TO_NUM BITAND CAST CEIL CHARTOROWID CHR CLUSTER_ID CLUSTER_PROBABILI TY COALESCE COMPOSE CONCAT CONVERT COS COSH CSCONVERT DECODE DECOMPOSE DUMP EXISTSNODE EXP EXTRACTVALUE FEATURE_ID FEATURE_VALUE FLOOR FROM_TZ GREATEST GROUPING HEXTORAW INITCAP INSTR INSTR2 INSTR4 INSTRB INSTRC JSON JSON_EXISTS JSON_QUERY JSON_VALUE LAST_DAY LEAST LENGTH LENGTH2 LENGTH4 LENGTHB LENGTHC LN LNNVL LOG LOWER LPAD LTRIM MAX MIN MOD MONTHS_BETWEEN NANVL NCHR NEW_TIME NEXT_DAY NLSSORT NLS_CHARSET_ID NLS_CHARSET_NAME NLS_INITCAP NLS_LOWER NLS_UPPER NUMTODSINTERVAL NUMTOYMINTERVAL NVL NVL2 ORA_CLUSTERING ORA_HASH ORA_RAWCOMPARE ORA_RAWCONCAT POWER PREDICTION PREDICTION_COST PREDICTION_PROBA BILITY RAWTOHEX RAWTONHEX REGEXP_COUNT REGEXP_INSTR REGEXP_REPLACE REGEXP_SUBSTR REMAINDER REPLACE REVERSE ROUND ROWIDTOCHAR ROWIDTONCHAR RPAD RTRIM SESSIONTIMEZONE SIGN SIN SINH SOUNDEX SQRT SUBSTR SUBSTR2 SUBSTR4 SUBSTRB SUBSTRC TAN TANH TO_BINARY_DOUBLE TO_BINARY_FLOAT TO_CHAR TO_DATE TO_DSINTERVAL TO_MULTI_BYTE TO_NCHAR TO_NUMBER TO_SINGLE_BYTE TO_TIME TO_TIMESTAMP TO_TIMESTAMP_TZ TO_TIME_TZ TO_YMINTERVAL TRANSLATE TRIM TRUNC TZ_OFFSET UNISTR UPPER VSIZE Der Grad der Parallelisierung hängt in der Datenbank von der Anzahl möglicher Prozesse ab (Anz. Threads). Das gilt jedoch nur für den Datenbank-Anteil einer Abfrageaktion. Der hier beschriebene Hadoop-Anteil unterliegt eigenen und Datenbank-unabhängigen Regeln. Die Hadoop-Technik ist eine Parallelisierungs-Technik. Z. B. verfügt die Oracle Big Data Appliance Maschine in der 6-Knoten-Starter Rack-Variante bereits über 264 Rechenkerne, womit eine Parallelisierung von 264 auch unter Berücksichtigung weiterer paralleler anderer Aktivitäten auf der Maschine möglich ist. D. h. im Ergebnis wird der Smart-Scan-Vorgang auf der HadoopMaschine mit 264 parallelen Scan-Anteilen und der Datenbank-Anteil des Selects vielleicht mit parallel 24 durchgeführt. Der Parallelisierungs-Faktor auf der Hadoop-Maschine wird intern bestimmt und kann nur durch interne, nicht öffentliche, Parameter beeinflusst werden. Mit diesem Verständnis im Hintergrund kann man die potenzielle Performance einer Abfrage auf HDFS-Daten gut einschätzen und zumindest auf die Parallelisierung der Datenbank einwirken: Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 11 o Hat man eine Abfrage mit einem hohen Anteil an „Offloadable“-Anteilen, so wird die Parallelität des Hadoop-Systems gute Dienste leisten. Parallelisierung in der Datenbank hilft hier nicht. o Hat man wenige Offload-Anteile, so muss man sich Gedanken um eine höhere Parallelisierung in der Datenbank machen. Bloom Filter sind in der Datenbank-Technik zur Join-Bildung bereits bekannt. Auch zur JoinBildung zwischen HDFS-Dateien oder zwischen einer HDFS-Datei und Oracle DatenbankTabellen nutzt Big Data SQL Bloom-Filter. Dabei wird sinnvoll ein großes Objekt mit mehrere kleinen „gejoint“. Das passt ideal für ein Szenario, in dem man eine große Fakten-Tabelle eines Star Schemas in das HDFS verlagert, während die stark strukturierten Dimensionen in der Datenbank bleiben. Das Verfahren erzeugt aus den kleinen Tabellen in der Datenbank sogenannte Bloom-Filter-Objekte, sendet sie auf die Hadoop-Cluster-Knoten und nutzt sie dort im Verlauf der Smart Scan-Prozesse zum Filtern der großen HDFS-Dateien. Verringerung der bewegten Datenmengen zwischen Hadoop und Datenbank durch Bloom Filter Die Anwendung von Big Data SQL und die Hilfsobjekte Die Anwender arbeiten weiterhin aus der Oracle heraus. Die HDFS-Daten befinden sich jedoch jetzt auf dem Hadoop-Cluster. Das sind neben dem Datenbank-Server eine Reihe von separaten Maschinen. Das Oracle-Mittel für den Zugriff auf außerhalb der Datenbank liegende Daten heißt External Table. Um das Zusammenspiel der Offload-Lösung zu vervollständigen benötigt man innerhalb der Oracle Datenbank eine External Table Definition, die über passende Konfigurationseinträge (DEFAULT DIRECTORY DEFAULT_DIR) den Weg auf den HDFS Name Node des Hadoop Systems zeigt. Diese External Table Definition lässt man sich am einfachsten von dem Datenbank-Package dbms_hadoop.create_extddl_for_hive erzeugen. (Ein Beispiel dazu ist unten in dem Szenario abgedruckt). Die zweite Komponente in diesem Zusammenspiel ist eine Hive-Tabelle zur Dokumentation der Column-Struktur des jeweiligen HDFS-Files. Auch diese Hive-Definition lässt man sich am einfachsten durch das Sqoop-Utility erzeugen. Sqoop verfügt über einen Steuerparameter, der aus der zu transportierenden Datenbank-Tabelle eine DDL-Definition in Hive hinterlegt. Will man in Hive eine externe Tabelle anlegen, was wir in unserem Offload-Szenario tun wollen, so starten man einen Dummy-Sqoop-Job mit der Query-Option z. B. 1=2. Dann bewegt Sqoop keine Daten aber legt eine Hive-Definition an, die man manuell auf „external“ ändert. Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 12 Gesplittete Fakten Tabellen und die Kombination von In-Memory Datenbank und HDFS An dieser Stelle sollte noch ein besonderer Fall erläutert werden. In der Praxis will man gegebenenfalls unterschiedliche Bereiche der Analysedaten unterschiedlich performant den Anwendern anbieten. Z. B. sollen Daten der letzten Berichtsperiode (letzter Tag, letzte Woche, letzte Dekade, letzter Monat, letztes Quartal ..) besonders performant für die Masse der Anwender bereitstehen, während Abfragen auf ältere Daten für eine kleinere Benutzergruppe auch etwas länger dauern können. Die Oracle-Datenbank kennt die Möglichkeit der Partitionierung. Mit diesem Hilfsmittel lassen sich aktuelle Daten (die jüngsten Partitionen) In-Memory für Abfragen im Millisekunden-Bereich vorhalten, während ältere Daten im HDFS liegen können. Soweit ist das vorstellbar, aber offen bleibt die Anforderung nach dem „Single-SQL-Statement“. Die Anwender wollen u. U. mit einem einzigen Select-Statement gleichzeitig auf In-Memory und HDFS zugreifen können. Sie werden ihre Abfragetools oder ihr Abfrageverhalten nicht ändern wollen, nur weil das DATA WAREHOUSE einen Teil der Daten in das HDFS ausgelagert hat. Hierfür gibt es sicher mehrere Lösungen. Eine davon ist eine geschickte Kombination von Views, die letztlich mit UNION gekoppelt werden. „Geschickt“ bedeutet in diesem Fall, dass das Verhalten von Big Data SQL, also z. B. das Offloading von Funktionen in der Where-Klausel, nicht verändert wird. 4 Zusammenfassung der Faktoren, die die Leseperformance auf HDFS beeinflussen Nach der Darstellung aller Performance-relevanten Punkte hier eine Zusammenfassung und eine kleine Best Practice Liste für den Einsatz des Offloading: 4 Als HDFS-Ersatz für Datenbank-Tabellen sollte ein passender File-Type z. B. Parket, AVRO oder ORC gewählt werden. Dies wird zwar die Schreibperformance des Sqoop-Jobs verschlechtern, aber Abfragen sind performanter. Die Dateien sollten im HDFS partitioniert sein. Das Komprimieren der Daten in dem HDFS sorgt für weniger IO-Aufwand beim späteren Lesen. Parallel Query in der Datenbank nutzt nur für den Datenbank-Anteil der Abfrage. Bei sehr vielen Offload-Funktionen bringt das nicht viel. Der Storage-Index wird erst beim zweiten Lesevorgang seinen vollen Nutzen erzeugen. Joins zwischen sehr großen Objekten sollten eher vermieden werden. Joins zwischen sehr großen Objekten und vielen kleinen Tabellen sind sehr performant. Bei Abfragen mit einem Partitionierungskriterium in der Where-Klausel kann ein Vergleich zwischen HDFS und Oracle-Datenbank schnell zu Gunsten der Oracle Datenbank ausfallen. Fehlt dieses Partitionierungskriterium, so ist HDFS schnell im Vorteil. Eine Lösung hierfür kann von Autor bezogen werden. Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 13 Ein Star Schema Szenario Jetzt verfügen wir über alle Bestandteile um das Ganze in einem Szenario komplett durchzuspielen. Das Konzept, nach dem wir das Szenario ausrichten ist ein Star Schema mit einer partitionierten Fakten-Tabelle, die komplett oder in Teilen (bzgl. der historischen Partitionen) in das HDFS ausgelagert werden soll. Diese Fakten-Tabelle wird zu Testzwecken unterschiedlich groß gewählt um Skalierungseffekte zu erkennen. Die Dimensionstabellen liegen weiterhin in der Oracle Datenbank. Die Daten werden schließlich mit Sqoop in das HDFS transportiert. Danach sind Vergleiche mit Beispielabfragen in beiden Umgebungen, also in der herkömmlichen Datenbankbasierten Umgebung als auch in der Hadoop-unterstützten Umgebung, möglich. Die Ausgangsdaten Die Ausgangsdaten bestehen aus einem Star Schema mit einer partitionierten Faktentabelle mit folgenden Einstellungen: Nach Zeit (Monat) partitioniert. Daten von 2011 – 2016 und damit etwa 60 Partitionen. Hybrid Columnar Compression - Query low – Variante. Dies meint, dass zwar mit Hybrid Columnar Compression gearbeitet wird, aber so, dass eine möglichst gute Abfrageperformance erzielt wird. (Die Faktentabelle beinhaltet zufallsgenerierte Testdaten. Damit sind alle Felder bis zu dem definierten Maximum gefüllt und haben sehr heterogene Werte. Unter diesen Umständen erzielt man naturgemäß geringere Kompressionsraten. In diesem Szenario wurde tatsächlich auch nur ein Faktor 2 erreicht, gegenüber Faktor 4-10 unter Echtbedingungen. Das hat auch Auswirkungen auf die Testergebnisse, die besser wären, als sie auch unter diesen eingeschränkten Bedingungen jetzt schon sind). Bitmap-Indizierung auf den Fremdschlüsselfeldern der Faktentabelle (Voraussetzung für Star Query Transformation). Star Query Transformation wurde aktiviert. Die Faktentabelle wurde mit „parallel 12“ markiert. D. h. es ist davon auszugehen, dass die Datenbank-bezogenen Anteile der Abfragen 12-fach parallelisiert durchgeführt wurden. Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 14 Die Größenverhältnisse der Faktentabelle kann man der folgenden Übersicht entnehmen. Es sind die Größenangaben für die Daten in der Datenbank, im HDFS, in komprimierter und nicht komprimierter Form für die CSV- und Parquet-File-Formate enthalten. Die Spalten unter Faktor 3 geben die absoluten Mengen nach 3-fach-Spiegelung durch das HDFS an. Größenverhältnisse der Tabellen und entsprechenden HDFS-Dateien Genutzte Infrastruktur Als Testumgebung nutzte man eine Exadata Quarter Rack und eine Big Data Appliance 5. Möglich wären natürlich auch Umgebungen ohne diese Hardware gewesen. Aber eine Big Data Appliance Maschine verfügt bereits über eine fertig installierte und konfigurierte Hadoop-Infrastruktur. Man kann davon ausgehen, dass man in dieser Umgebung optimale Testbedingungen vorfindet. 6 Auf der Big data Maschine ist die Cloudera-Distribution vorinstalliert: Apache Hadoop (CDH) Cloudera Impala Cloudera Search HBase Accumulo Apache Spark Apache Kafka Cloudera Manager Die Maschine verfügt über 6 Cluster-Knoten mit jeweils: 2 x 22 Core (2.2GHz) Intel ® Xeon ® E5 2699 v4 8 x 32 GB DDR4 2400 Memory 12 x 8 TB 7,200 RPM High Capacity SAS Drives 2 x QDR 40Gb/sec InfiniBand Ports 4 x 10 Gb Ethernet Ports 1 x ILOM Ethernet Port Die Exadata-Maschine ist mit der Big Data Appliance über Infiniband gekoppelt. 5 Fact Sheet: http://www.oracle.com/technetwork/database/bigdata-appliance/overview/bigdataappliance-datasheet-1883358.pdf 6 An dieser Stelle Dank an die Firma ISE Information Systems Engineering GmbH in Nürnberg, die ihr Exa-Demo Center für diese Tests bereitgestellt hat. In diesem Demo Center können Firmen ihren Anforderungen testen. www.ise-informatik.de/ Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 15 Übersicht zu den genutzten Objekte in dem Szenario und die Vorgehensweise In dem Szenario sind die folgenden 5 Schritte durchgeführt worden. Schritt 1 und 5 natürlich mehrfach für die unterschiedlich großen Tabellen (100 / 200 / 400 und 800 Millionen Sätze) und Komprimierungsvarianten sowie File-Typen. 1. Sqoop-Job auf die Fakten-Tabelle mit den entsprechenden Eintragungen 2. Die Redistribution des neu erstellten Files mit Faktor 3 erfolgt automatisch durch das durch HDFS 3. Der Eintrag der Metadaten im Hive-Metastore erfolgt manuell nachdem man sich eine DDLVorlage durch sqoop hat generieren lassen 4. Erstellen einer External Table in der Datenbank für späteres SQL – Hier hilft das Package „dbms_hadoop.create_extddl_for_hive“ 5. Big Data SQL Aufruf / SQL – Abfragen. Das sind die eigentlichen Abfrage-Test. Ablauf des Vergleichs-Test-Szenarios Schritt 1: Sqoop – Der Offload-Vorgang Sqoop ist ein Batch-Utility, das man von einem Linux-Cluster-Knoten aus startet. Das folgende Beispiel baut eine Verbindung zu einer Oracle-Datenbank und dem Schema „DWH“ auf. Es liest die Tabelle „F_UMSATZ“ und überführt diese in eine Textdatei (Default CSV). Das Add-In „oraoop“ ist einbezogen. Eine Datei im HDFS wird über ein Verzeichnis abgebildet. Möglicherweise existierende Daten werden zuvor gelöscht. Ansonsten würde die Datei auch fortgeschrieben werden können. Sqoop erzeugt einen Map Reduce – Job. Dieser wird hier mit parallel 100 parametrisiert, d. h. es starten 100 Mapper. Die Datei soll bei dem Schreiben in dem HDFS komprimiert werden (Parameter –z). sqoop import -D mapred.job.name='default oraoop' > --direct --connect jdbc:oracle:thin:@21.108.5.88:1521:dbm088 > --username DHW --password DWH --table F_UMSATZ \ > --as-textfile --delete-target-dir > --target-dir /user/sqoop_output/f_umsatz -m 100 -z \ \ \ Das ist nur eine kleine Auswahl von möglichen Parametern. In dem Sqoop Users Guide sind alle Parameter beschrieben7. Die folgende Übersicht enthält die Ladezeiten für die verschieden großen Tabellen und sqoopParallelisierungsgrößen also Anzahl Mapper: 7 https://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_controlling_type_mapping Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 16 Offload-Ladezeiten von sqoop Schritt 2: Die Daten im HDFS Das HDFS repliziert die neu erstellte Datei im Hintergrund mit dem Faktor 3 auf unterschiedliche Cluster-Knoten. Diesen automatischen Vorgang muss man nicht weiter kommentieren. Das passiert einfach. Hier eine Sicht auf die Daten im HDFS einmal auf die Datei selbst, bestehend aus 149 einzelnen Files (Stripes) in dem Directory „f_umsatz“ und dann ein Blick auf die ersten 4 Sätze. Man sieht, dass es sich durchaus um lesbare Daten handelt. Die Datei F_UMSATZ ist im HDFS ist als Directory realisiert Schritt 3: Die Hive Definition Das Szenario arbeitet mit einer in dem HDFS direkt liegenden Datei. Hive hat nur die Aufgabe, die Metadaten zu beschreiben. Daher handelt es sich hier aus der Sicht von Hive um eine External Table. Also Hive wird nur die Metadaten bereithalten und „überlässt“ die Daten sich selbst. Für interne Hive Tabellen legt sich Hive eine eigene Struktur an einer anderen Stelle in dem HDFS an. Bei der Übertragung kann es zu Typ-Konvertierungsfragestellungen kommen. In diesem Beispiel ist das für das Feld Zeit_ID tatsächlich geschehen. Der ursprüngliche Typ DATE wurde durch Sqoop nicht entsprechend übertragen, so dass die späteren Join-Abfragen auf das Star-Modell leider leere Ergebnismengen lieferten. Erst die Korrektur nach Timestamp war letztlich erfolgreich. Auf diese Oracle-spezifischen Typ-Konvertierungen wird in dem Sqoop-Users-Guide8 explizit hingewiesen. 8 https://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_controlling_type_mapping Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 17 CREATE EXTERNAL TABLE defAULT.F_UMSATZ_HDfs ( ARTIKEL_ID int ,KUNDEN_ID int ,ZEIT_ID TIMEstamp ,REGION_ID int ,KANAL_ID int ,UMSATZ int ,MENGE int ,UMSATZ_GESAMT int ,VERTRIEBS_KZ string ,STEUER DECIMAL(15,10) ,VERPACKUNGSART string ,HANDELSKLASSE string ,KOMMISSIONSWARE string ,LAGERWARE string ,BESCHREIBUNG string ,LIEFER_DATUM DATE ,RECHNUNGS_DATUM DATE ,ZAHLUNGS_ZIEL DATE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/sqoop_output/f_umsatz'; Schritt 4: External Table in der Oracle Datenbank Die Definition der passenden External dbms_hadoop.create_extddl_for_hive. Table dazu liefert das Package Dieses Package greift auf den Hadoop-Cluster zu und liest in Hive die entsprechenden Metadaten und auch die Speicherorte aus. Wenn die Hive-Einträge korrekt sind, kann man diese External Table – Definition bereits sofort in der Datenbank aktivieren und direkt danach erste Abfragen formulieren. Generierung External Table aus Hive-Metadaten Schritt 5. Die Abfragen Hier ist ein Ausschnitt aus den Abfragetests dokumentiert. Die Abfragen entstammen der SeminarReihe „Data Warehouse-Technik im Fokus“ und sind dort im Begleitheft9 abgedruckt. Für diese Tests wurde eine etwas erweiterte Faktentabelle genutzt, um der Praxis etwas näher zu kommen. Hier ist immer nur die Datenbank-Skript-Variante abgedruckt. Die HDFS-Variante sieht gleich aus. Dort ist nur in der FROM-Klausel anstelle von F_UMSATZ die External Table F_UMSATZ_HDFS aufgeführt. Vorbemerkung zu diesen Ergebnissen: Die Ergebniswerte dieses Tests dienen lediglich zur 9 http://oracledwh.de/downloads/AutoIndex2.2.4/index.php?dir=downloads/01_DWH_Seminare_Kurs_Materialien_Folien_und_Skripte/01_01_DWH%20Technik%20im%20Fokus%20Reihe_TI F/&file=CMD_DWH_Kurzreferenz_V3.docx Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 18 Feststellung der Machbarkeit von Star Schema-Abfragen auf Objekte im HDFS. Sie sind weniger geeignet, um eine Performance-Vergleichsaussage zwischen dem relationalen Datenbanksystem und HDFS zu treffen. Hierzu müsste auf beiden Seiten sicherlich noch mehr optimiert werden, z. B. würde man in der Oracle Datenbank für Performance-kritische Abfragen InMemory einsetzen oder zusätzliche Techniken wie Caching, Flash, Materialized Views und weitere verwenden. Auf der HDFS-Seite würde man unterschiedliche File-Typen (Parquet, ORC) einsetzen. Zu erwähnen ist auch, dass die guten Abfrage-Performancewerte bei der hier dargestellte HDFS-Variante nur durch die Optimierung von Oracles Big Data SQL mit Function-Offloading, Bloom-Filter, Storage Index, Column-Pruning und der technischen Architektur der Big Data Appliance Maschine (z. B. durch das Infiniband Protokoll) bedingt sind. Solche Abfragewerte sind z. B. nur mit Hive nicht zu erzielen. Letztliche laufen die Datenbankabfragen mit Parallel 12, während die HDFS-Variante auf im 3stelligen Bereich parallelisieren kann. Auch die relationale Datenbank lässt eine Parallelität von z. B. 128 zu. Allgemeine Abfrage über die Anzahl Zeilen bei der größten Tabellenausprägung select count(*) from f_umsatz; select count(*) from F_UMSATZ_HDFS; COUNT(*) ---------819200000 COUNT(*) ---------819200132 Elapsed: 00:00:02.85 Elapsed: 00:00: 17.97 Kommentar: Die Datenbank-Abfrage läuft über den bestehenden Bitmap-Index und ist daher besonders schnell. Abfrage 1b) Abfrage mit direktem Partition-Kriterium SELECT /*+ no cache */ sum(UMSATZ) Umsatz FROM F_UMSATZ WHERE zeit_ID = to_date('10.03.2011','DD.MM.YYYY'); 102 204 408 819 Nr 1b 1b 1b 1b Kommentar Abfrage auf Partition DB-Tabelle 00.66 00.30 00.33 00.89 HDFS-Datei 03.14 04.65 09.04 08.52 Kommentar: Die Abfrage enthält eine Zeiteinschränkung auf einen Tag und damit trifft man das Partitionierungskriterium in der Datenbank. Auch wenn die Gesamttabelle größer wird, steigt die Menge der Daten in einer Partition nicht in gleichem Maße. Der Datenbank ist es in dieser Abfrage gleichgültig, wie groß die Tabelle wirklich ist. Das Segment einer Partition bleibt immer gleich groß. Anders verhält es sich bei dem HDFS. Hier steigen die Datenmengen und offenbar auch der Aufwand bei der Abfrage. Diese HDFS-Abfragezeiten könnte man sicherlich verbessern, wenn die HDFS-Datei auch partitioniert wäre. Das ist sie hier aber nicht. So gesehen ist dieser Vergleich nicht korrekt. Abfrage 1c) mit und ohne Zeit-Kriterium 1. Versuch SELECT /*+ no cache */ sum(UMSATZ) Umsatz FROM F_UMSATZ U, D_vertriebskanal V WHERE u.kanal_id = v.kanal_id and zeit_ID = to_date('10.03.2011','DD.MM.YYYY') and V.vertriebskanal = 'Shop' Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 19 2. Versuch SELECT /*+ no cache */ sum(UMSATZ) Umsatz FROM F_UMSATZ U, D_vertriebskanal V WHERE u.kanal_id = v.kanal_id -- and zeit_ID = to_date('10.03.2011','DD.MM.YYYY') and V.vertriebskanal = 'Shop' Nr Kommentar DB-Tabelle HDFS-Datei 102 204 408 819 1c 1c 1c 1c Abfrage mit Zeitkriterium (Partitioning) 00.05 00.75 00.51 01.04 05.12 02.05 09.81 18.01 102 204 408 819 1c 1c 1c 1c Abfrage ohne Zeitkriterium (ohne Partitioning) 12.53 15.51 18.71 35.11 06.64 09.81 06.64 18.61 Kommentar: Dieses Beispiel hat zwei einschränkende Bedingungen. Eines das auf das Partitionierungskriterium trifft und eines, das nicht dem Partitionierungskriterium entspricht. Der Test wird zweimal durchgeführt. Beim zweiten Mal hat man das Zeitkriterium auskommentiert, so dass nur noch die Einschränkung auf ein Nicht-Partition-Merkmal erfolgt. In dem zweiten Testversuch fällt die Datenbankabfrage hinter die HDFS-Abfrage deutlich zurück. Ihr fehlt die Möglichkeit die Datenmenge über die Partitionierung einzuschränken. Abfrage 2 – Höhere Anzahl Joins / Group by / Order by / 5 Filter / mit und ohne DatenbankParallel 24 SELECT /*+ parallel(F_UMSATZ 24) */ sum(u.UMSATZ) Umsatz, R.REGION, Z.Quartals_nummer Quartal FROM F_UMSATZ U, D_Artikel A, D_Region R, D_Zeit Z, D_Kunde K, D_Vertriebskanal V WHERE U.Kunden_ID = K.Kunden_ID AND U.Zeit_ID = Z.Zeit_ID AND U.REGION_ID = R.Region_ID AND U.Artikel_ID = A.Artikel_ID AND U.Kanal_ID = V.Kanal_ID AND Z.JAHR_NUMMER = 2011 AND A.GRUPPE_NAME = 'Bad_Sanitaer' AND K.BERUFSGRUPPE = 'Arbeiter' AND R.REGION IN ('Mitte','Sued','Nord') AND V.Vertriebskanal = 'Shop' Group by R.Region,Z.Quartals_nummer Order by Z.Quartals_nummer; Nr 102 204 408 819 2 2 2 2 102 2 Kommentar DB-Tabelle Höhere Anzahl Joins und DB-Parallel 12 5 Joins / Group / Order by 5 02.40 Filter 03.65 04.95 06.81 Höhere Anzahl Joins und DB-Parallel 24 01.59 HDFS-Datei 03.85 13.44 18.08 20.69 03.10 Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 204 2 408 2 819 2 5 Joins / Group / Order by / 5 02.48 Filter 03.43 04.07 20 13.36 17.80 21.20 Kommentar: Man erkennt in diesem Beispiel, dass die Parallelisierung in der Datenbank die Abfrage beschleunigt. Für die HDFS-basierte Abfrage hat diese Parallelisierung keinen Effekt. Die Hadoop-Umgebung folgt ihrem eigenen Parallelisierungsverhalten und das wirkt auch ohne die Datenbank-Parallelisierung, also in diesem Fall auch schon bei dem ersten Test mit Parallel 12. Abfrage 3: 4 Joins / 2 Filter / Höherer Group by – Datenbank-Rechenanteil SELECT /*+ no cache */ a.sparte_name, z.Jahr_Nummer, r.land, sum(U.umsatz), sum(U.menge) FROM f_Umsatz U, d_region r, d_zeit z, D_artikel a WHERE U.zeit_id = z.zeit_id AND U.REGION_ID = R.REGION_ID AND U.artikel_id = a.artikel_id and z.jahr_nummer = 2012 and R.Land = 'Bayern' GROUP by a.sparte_name, z.Jahr_Nummer, r.land; 102 204 408 819 Nr 3 3 3 3 Kommentar DB-Tabelle 4 Joins + 2 Filter / Group 02.55 by 03.60 04.81 06.82 HDFS-Datei 08.41 13.73 12.47 18.23 Kommentar: Dieses Beispiel verhält sich ähnlich wie das zuvor. Allerdings muss hier die Datenbank durch den größeren Group By – Anteil und die größere Menge an Select-Feldern mehr rechnen. Bei der HDFSAbfrage sind die Antwortzeiten nahezu gleich. Abfrage 6: Analytische Funktion Rank select sum(u.umsatz) Umsatz, z.Jahr_nummer Jahr ,z.Quartals_nummer Quartal, RANK() OVER (PARTITION by z.Jahr_nummer ORDER from f_umsatz u, d_zeit z where z.zeit_id = u.zeit_id and z.Jahr_nummer between 2010 and 2013 group by z.Jahr_nummer,z.Quartals_nummer order by z.Jahr_nummer,Rangfolge; 102 204 408 819 Nr 6 6 6 6 Kommentar Rank + 2 Joins Kommentar: BY sum(U.umsatz) ASC ) AS Rangfolge DB-Tabelle 02.07 10.61 15.50 22.47 HDFS-Datei 03.15 12.26 10.63 14.11 Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 21 Die Antwortzeit der Datenbankabfrage wächst mit der Datenmenge, die HDFS-Abfrage wächst zunächst. Sie stagniert dann aber auf einem niedrigen Niveau, während die Datenbank-Antwortzeit ebenfalls steigt aber übe die HDFS-Zeit hinausläuft. Zu beachten ist die Einschränkung auf die ZeitDimension. Bei dieser Abfrage hilft die Partitionierung auf Zeit. Abfrage 7: Analytische Funktion Rank und Subselect Select /* + no cache */ * from (select sum(u.umsatz) Umsatz, z.Jahr_nummer Jahr ,z.Quartals_nummer "Top-Quartal", RANK() OVER (PARTITION by z.Jahr_nummer ORDER sum(U.umsatz) ASC ) AS Rangfolge from f_umsatz u, d_zeit z where z.zeit_id = u.zeit_id and z.Jahr_nummer between 2010 and 2013 group by z.Jahr_nummer,z.Quartals_nummer) where Rangfolge = 1 order by Jahr; 102 204 408 819 Nr 7 7 7 7 BY Kommentar Rank und Subselect DB-Tabelle 04.00 08.07 10.39 20.11 HDFS-Datei 02.93 12.30 10.62 17.08 Kommentar: Analog zu Abfrage 6. Abfrage 16: Analytische Funktion Rank / Group by / 2 Subselects select Top.Bundesland, top.Prod_grp,Top.top_umsatz,top.Top_folge, Bottom.Prod_grp,bottom.Bottom_Umsatz, bottom.Bottom_folge From (SELECT * FROM (SELECT r.land Bundesland, a.gruppe_name Prod_Grp, sum(U.Umsatz) AS Top_Umsatz, RANK() OVER (PARTITION by r.land ORDER BY sum(U.umsatz) DESC ) AS Top_folge FROM f_umsatz U, d_artikel A , d_region r WHERE U.artikel_id = a.artikel_id and U.region_id =r.region_id GROUP by r.land,a.gruppe_name ORDER by r.land) WHERE Top_folge < 3) Top, (SELECT * FROM (SELECT r.land Bundesland, a.gruppe_name Prod_Grp, sum(U.Umsatz) AS Bottom_Umsatz, RANK() OVER (PARTITION by r.land ORDER BY sum(U.umsatz) ASC ) AS Bottom_folge FROM f_umsatz U, d_artikel A , d_region r WHERE U.artikel_id = a.artikel_id and U.region_id =r.region_id GROUP by r.land,a.gruppe_name ORDER by r.land) WHERE Bottom_folge < 3) Bottom where top.Bundesland = bottom.Bundesland and top.Top_folge = bottom.Bottom_folge order by Top.Bundesland; Nr 102 16 204 16 Kommentar Ranks / Group by / 2 Subselects DB-Tabelle 17.69 44.84 HDFS-Datei 09.69 21.65 Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 408 16 819 16 01:19.20 02:35.01 22 33.94 01:04.53 Kommentar: Bei dieser Abfrage wachsen auch die Antwortzeiten bei der HDFS-Abfrage. Allerdings benötigt sie nur etwa die Hälfte der Zeit der Datenbankabfrage. Bei dieser Abfrage, hilft kein einschränkendes Partitionierungskriterium. In der Where-Klausel ist keine Einschränkung auf die Zeit-Dimension. Abfrage 19: Mehrere Subselects select a.land, round(a.top_3_umsatz/1000000,2) Top_3_In_Mill, round(b.Gesamt_pro_land/1000000,2) Gesamt_pro_Land_in_Mill, round(a.top_3_umsatz/b.Gesamt_pro_land*100,2) Anteil_Prozent from (SELECT land, sum(umsatz) Top_3_Umsatz FROM (SELECT r.land, artikel_name Artikel, sum(U.Umsatz) AS Umsatz, RANK() OVER (PARTITION by r.land ORDER BY sum(U.umsatz) DESC ) AS Rangfolge FROM f_umsatz U, d_artikel A, d_region r WHERE U.artikel_id = a.artikel_id and U.region_id = r.region_id GROUP by r.land, a.artikel_name ORDER by r.land) WHERE Rangfolge < 4 group by land) a, (SELECT land, sum(umsatz) Gesamt_pro_Land from f_umsatz U, d_region r where U.region_id = r.region_id group by land) b where a.land = b.land; 102 204 408 819 Nr 19 19 19 19 Kommentar Mehrere Subselects DB-Tabelle 29.86 43.67 01:04.46 01:48.54 HDFS-Datei 08.02 21.48 29.02 50.31 Kommentar: Analog zur Abfrage 16.. Abfrage 20: Ntile + geschachtelte Subselects SELECT sum(umsatz), anteil, (sum(umsatz)*100/Gesamt_umsatz) as Prozent FROM (SELECT k.nachName as kunde, sum(u.umsatz) as Umsatz, ntile(4) over (order by sum(u.umsatz)) as Anteil FROM d_kunde K, f_umsatz U WHERE k.kunden_id = u.kunden_id GROUP by K.nachName), (SELECT sum(u.umsatz) as Gesamt_Umsatz FROM f_umsatz_HDFS U) GROUP by anteil,Gesamt_umsatz; 102 204 408 819 Nr 20 20 20 20 Kommentar Ntile + Subselects Kommentar: Analog zur Abfrage 16.. DB-Tabelle geschachtelte 15.33 20.21 33.01 58.04 HDFS-Datei 04.99 20.04 16.59 40.14 Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung Abfrage 22:Cube Funktion SELECT a.gruppe_name, Region, Land, sum(u.menge), grouping(gruppe_name) as AG, grouping(Region) as RE FROM d_artikel a, f_umsatz U, d_region R WHERE U.artikel_id = a.artikel_id AND R.Region_id = U.Region_id AND Land = 'Schleswig Holstein' GROUP by cube (gruppe_name,Region,land); 102 204 408 819 Nr 22 22 22 22 Kommentar Cube DB-Tabelle 08.57 16.47 18.66 32.11 HDFS-Datei 02.50 10.93 07.56 19.01 Kommentar: Analog zur Abfrage 16. Abfrage 23: Vorjahresvergleich SELECT /*+ no cache */ k.nachName, z.Jahr_Nummer as Jahr, z.Monats_Nummer as Mon, sum(u.umsatz) as Umsatz, lag(sum(u.umsatz),12) over (ORDER by z.Jahr_Nummer, z.Monats_Nummer) as vorjahr FROM D_kunde k, F_Umsatz U, D_zeit Z WHERE k.kunden_id = u.kunden_id AND Z.zeit_id = u.zeit_id AND z.Jahr_nummer in (2010,2011) AND k.nachname = 'Bauer' group by K.nachName, z.Jahr_Nummer, z.Monats_Nummer order by z.Jahr_Nummer, z.Monats_Nummer; 102 204 408 819 Nr 23 23 23 23 Kommentar Vorjahresvergleich Lag Kommentar: Analog zur Abfrage 16.. DB-Tabelle 01.02 01.55 02.13 04.25 HDFS-Datei 03.21 12.46 11.00 13.38 23 Offloading Data Warehouse Objekte mit Hadoop – Konzept und technische Umsetzung 24 Erfahrungen, Bewertung und Ausblicke Datenmengen und Realität Das Szenario hat gezeigt, dass es durchaus sinnvoll sein kein größere Datenmengen in das HDFS zu verlagern. Das Szenario wurde mit Tabellen im unteren 3 stelligen GB-Bereich gemacht. Schon in diesem überschaubaren Datenvolumen konnte die HDFS-Variante ihre Stärken ausspielen. Allerdings wird man nicht wegen ein paar Sekunden schnellerer Abfragen schon gleich eine neue Infrastruktur in Form einer Hadoop-Umgebung einführen. Aber vorstellbar sind Tabellen im Terabyte-Bereich und einigen Milliarden Sätzen und Warehouse-Umgebungen, die 50, 100 Terabyte Datenvolumen überschreiten oder auch nur Umgebungen in denen eine Hand voll Tabellen mit 5, 10, 20 usw. Terabyte liegen. In diesen Fällen lohnt sich eine HDFS-Ergänzung. Technisches Know how ist beherrschbar Ganz nebenbei zeigt die Beschäftigung mit dem Szenario, dass der Know how – Aufbau zum Bewältigen der technischen Umgebung überschaubar ist. Für erfahrene WarehouseAdministratoren ist ein solches Szenario nach wenigen Tagen beherrschbar. Viele Punkte sind aus der Linux-Welt bekannt. Hadoop läuft auf Linux-Rechnern. HadoopKommandos lehnen sich an Linux-Kommandos an. SQL ist bekannt. Hive ist ein SQL-Vehikel. Die Oracle-Datenbank, also z. B. das Verhalten von External Tables sollte ebenfalls bekannt sein. Eine neue Programmier- oder Skriptsprache muss nicht erlernt werden. Man kommt ohne Java-Kenntnisse aus. Einzelne Utilities wie sqoop bringen letztlich ihr Handbuch mit, in dem alle Aufrufparameter stehen. Hier kennt man aus der Oracle-Welt z. B. den SQL Loader, der sich ähnlich verhält. Wirklich neu ist nur ein gewisses Verständnis für die Hadoop-Denkweise. D. h. das Denken in Cluster-Knoten und die Art der Parallelisierung. Implementierung, Implementierungsaufwand und was sich wirklich ändert Das Szenario zeigt, dass nicht sehr viele Komponenten zu berücksichtigen sind. Wer sich allerdings zunächst mit der technischen Architektur eines Hadoop-Clusters beschäftigt und versucht die Cloudera Hadoop Distribution zu installieren oder Performancegrenzen eines selbst gebauten Clusters austestet, der wird erst sehr spät zu den eigentlichen Zielen gelangen. Mit einer fertigen Appliance wie Oracles Big Data Appliance (BDA) verfügt man bereits nach 2-3 Wochen über eine fertige Lösung in der auch schon das Offload-Konzept realisiert ist. Der besondere Vorteil dieser Herangehensweise ist gerade der, dass an dem logischen Konzept des bestehenden Data Warehouse nichts geändert werden muss, also: Datenmodelle und Schichtenstruktur im DATA WAREHOUSE bleiben gleich. Die Art der Zugriffe für alle auf dem DATA WAREHOUSE arbeitenden Anwendungen und Benutzer bleiben gleich. Eingesetzte Abfragewerkzeuge, BI-Tools müssen nicht ausgetauscht werden. Anwender müssen nicht umlernen. Es ist keine strategische Richtungsfestlegung für weitere Entwicklungen in der Zukunft. Rückfragen zu dem Test und zu dem Dokument: Alfred.Schlaucher@oracle Tel 0177 5949132