Spark, Impala und Hadoop in der Kreditrisikoberechnung Big Data In-Memory-Technologien für mittelgroße Datenmengen TDWI München, 22. Juni 2015 Joschka Kupilas, Data Scientist, Adastra GmbH 2 Inhalt Vorwort Projektbeschreibung Über Hadoop Spark und andere Hadoop Tools Ergebnisse des Projekts Zusammenfassung und Lessons Learned 3 Kurze Umfrage... > 1 PB Daten? Berechnung zu langsam? 4 Big Data überall... 5 ...wirklich? Wahr: Mehr Daten Neue Technologien ermöglichen Nutzung großer Datenmengen Aber: Nur manche Firmen haben so große Datenmengen 90% aller Probleme: „Small/Medium Data“ Mit fortschreitender Technik: „Small“ = Immer mehr GB Trotzdem zeitaufwändige Berechnung! ⇒ Hadoop für Medium Data! 6 Inhalt Vorwort Projektbeschreibung Über Hadoop Spark und andere Hadoop Tools Ergebnisse des Projekts Zusammenfassung und Lessons Learned 7 Beispiel für „Hadoop für Medium Data“ Proof-of-Concept Projekt für große deutsche Bank Berechnung von Kreditwerten Hadoop statt Datenbank + Rechenkern „Mittelgroße“ Datenmenge 8 Beispielprojekt: „Treiberanalyse“ 13 Millionen Kredite 9 Wert eines Kredits ist Funktion von Ausfallwahrscheinlichkeit Laufzeit Betrag Restbetrag Währung … Anderen Krediten derselben Person/Firma Berechnung enthält mathematische/statistische Formeln Aggregationen, Suchen, Joins Berechnung der Kreditwerte Person B Person A 10 Kredit 1 Kredit 2 Kredit 3 P( Ausfall ) = 0.01 P( Ausfall ) = 0.02 P( Ausfall ) = 0.03 Gesamt: 50.000 € Gesamt: 10.000 € Gesamt: 100.000 $ Rest: 20.000 € Rest: 3.000 € Rest: 75.000 $ Laufzeit: 60 Monate Laufzeit: 48 Monate Laufzeit: 120 Monate Restlaufzeit: 23 Monate Restlaufzeit: 6 Monate Restlaufzeit: 60 Monate Wert: 18.789€ Wert: 2.265€ Wert: 45.823€ Veränderung der Kreditwerte nach „Treibern“ 01.03.2015 01.04.2015 Kredit 3 Kredit 3 P( Ausfall ) = 0.03 + 0.02 Gesamt: 100.000 $ Rest: 75.000 $ Gesamt: 100.000 $ -1.500$ Laufzeit: 120 Monate Restlaufzeit: 60 Monate Rest: 73.500 $ Laufzeit: 120 Monate - 1 Monat Wert: 45.823€ Restlaufzeit: 59 Monate Wert: 36.723€ -9.100€ 11 P( Ausfall ) = 0.05 Einfluss der Faktoren (Treiber) Fragestellung: Welcher Faktor hat wieviel zur Veränderung beigetragen? Einfluss von Teilmengen der Faktoren? 13.000.000 Kredite × 30 Treiberteilmengen ⟹ hunderte Millionen ähnliche Berechnungen ⟹ Sehr gut parallelisierbares Problem! Datenmenge: 5GB pro Zeitscheibe 12 ⟹ Kein „Big Data“ Bisherige Situation 64 Kerne Rechenkern DB1 Rechenkern DB2 DB3 2 Stunden 13 256 GB RAM Rechenkern $$$$$ DB1 Sybase IQ $$$$$ Idee: Hadoop (Spark/Impala) DB1 Kostenlose Software DB1 < 2 Stunden? 14 Günstige Hardware Verfügbare Resourcen Gesamtkosten für Hardware: ≈ 3000 € 15 Inhalt Vorwort Projektbeschreibung Über Hadoop Spark und andere Hadoop Tools Ergebnisse des Projekts Zusammenfassung und Lessons Learned 16 Ganz Früher 17 CPU Geschwindigkeit stagniert 18 Cluster 19 Vorteile von Hadoop Im Vergleich zu Einzelrechnern: Ausfallsicherheit Erweiterbarkeit & Zukunftssicherheit Zeitersparnis/Performance Im Vergleich zu „klassischen Clustern“: 20 Kostenersparnis Einfachere Entwicklung Hadoop Ökosystem Dateisystem HDFS (oder Amazon S3,…) Low-Level Programmier-Framework zur Parallelisierung MapReduce, Spark, ... High-Level Programmiersprachen 22 Impala, Hive, ... Hadoop HDFS: Hadoop Distributed File System Dateisystem verteilt auf den Nodes des Clusters Ausfallsicherheit: Redundante Speicherung Ein Name-Node (verwaltet Metainformation) Viele Data-Nodes (speichern Daten) 23 24 HDFS 25 HDFS 26 HDFS 27 HDFS 29 Programmier-Paradigma “MapReduce” Map-Funktion: Die gleiche Berechnung auf vielen Objekten 30 Input -> (Key, Value) Reduce-Funktion: Aggregation der obigen Resultate Sortieren nach Keys Aggregieren der Values Map: f(x) = <sign(x),2x> 31 Reduce: Sum(x) Wert Key Value 4 + 8 -2 - -4 3 + 6 1 + 2 5 + 10 -3 - -6 Key Value + 26 - -10 Map 32 𝑓 = 𝑓 = 𝑓 = 𝑓 = 𝑓 = Sort & Shuffle Reduce Σ Σ Σ Publikumsaufgabe Map: Input: Text Output in (key, value)-Paaren: Paar („Vokale“, #Vokale) (inkl Ä,Ö,Ü,Y) Paar(„Konsonanten“, #Konsonanten) (inkl ẞ) Paar(„Satzzeichen“, #Satzzeichen) * = Zuständigkeit des „Nodes“ für einen Block Sort & Shuffle: Durchreichen zum „Reducer“ für Vokale, Konsonanten, Satzzeichen Reduce: 33 Summieren der Werte je Key MapReduce: Berechnungszyklus HDFS CPU & Netzwerk HDD I/O ≈ 1 sec Lokales Dateisystem Map CPU & HDD I/O 34 RAM Gute Probleme für Hadoop Viele „Objekte“ vom selben Typ Unabhängige gleichartige Berechnungen Danach Aggregation der Ergebnisse (wenn gewünscht) Beispiele: 35 Welche und wieviele Webseiten (Textdateien) enthalten ein bestimmtes Wort? Welche Benutzer könnten – laut ihren Interessen – auf eine Werbung klicken? Ergebnis Vokale 36 Konsonanten Satzzeichen Nachteile von MapReduce Starres Programmierkonzept: Alles in Map und Reduce ausdrücken ↦ Entwicklung von Higher-Level-Programmiersprachen (Pig, Hive, Impala...) Programmierung nur in Java Map ↦ Reduce ↦ HDFS: Langsam für iterative Algorithmen 37 Z.B. In Machine Learning relevant Inhalt Vorwort Projektbeschreibung Über Hadoop Spark und andere Hadoop Tools Ergebnisse des Projekts Zusammenfassung und Lessons Learned 38 „Nachfolger“ von MapReduce 39 Früher „Map“, jetzt „Transformation“ Früher „Reduce“ , jetzt „Action“ Unterschiede: verteiltes Dateisystem ↦„verteiltes RAM“ ⇒ In-Memory Lazy Evaluation Mehrere Programmiersprachen Spark: Grundbegriffe RDD: Ähnlich List, Array:… Viele Objekte des selben Typs RDD<int>, RDD<String>… Verteilt im RAM der Cluster Nodes Transformation: RDD<A> → RDD<B> parallel auf alle Elemente angewendet f(x) = x*2 RDD<float> → RDD<float> Filter() RDD<X> → RDD<X> Actions: RDD<C> → einzelner Datentyp Sum() RDD<float> → float Ergebnisse von Transformations bleiben im RAM, Ergebnisse von Actions können in HDD gehen 40 Spark: Funktionsweise Sourcecode wird von Spark: analysiert umstrukturiert in Java ByteCode umgewandelt, auf JVM ausgeführt automatisch parallelisiert Spark baut Abhängigkeitsgraphen „Lazy Evaluation“: Code wird erst/nur ausgeführt, wenn benötigt 41 Nur Daten die benötigt werden, werden berechnet Filter: Vielleicht müssen gar nicht alle Daten geladen werden First: nur das erste Element das passt muss geladen werden Sourcecode: Python 42 Umwandlung in Abhängigkeitsgraphen moby_dick.txt RDD Other Data textfile() transf action map() vokale sum() int map() konsonanten sum() int map() satzzeichen sum() int filter() a_zeilen text 43 Spark: Berechnungszyklus HDD I/O Laden RAM HDFS ≈ 1 ms Action CPU & HDD I/O 44 CPU (& Netzwerk) Warum Spark? Datenmenge klein genug für RAM Spark schneller als MapReduce Popularität Auswahl aus mehreren Programmiersprachen Bibliotheken 45 SQL, Machine Learning, Graphen, Streaming… Spark: Nachteile Noch nicht viel Wissen öffentlich verfügbar Bibliotheken: Bugs und unvollständige Dokumentation Debugging aufgrund von Lazy Evaluation schwieriger Spark SQL Library (SQL auf RDDs) nicht umfangreich genug 46 Hadoop Tools für SQL Hive Open Source Basiert auf MapReduce: Stabil Besser für Batch-Jobs, lange Jobs, sehr große Datenmengen Impala Schneller als Hive Instabiler Besser für ad-hoc- und kurze Jobs Beides getestet, für Impala entschieden 47 da kurze Rechenzeit und wenige Nodes Inhalt Vorwort Projektbeschreibung Über Hadoop Spark und andere Hadoop Tools Ergebnisse des Projekts Zusammenfassung und Lessons Learned 48 Zurück zum Projekt Treiberanalyse 01.03.2015 01.04.2015 Kredit 3 Kredit 3 P( Ausfall ) = 0.03 + 0.02 Gesamt: 100.000 $ Rest: 75.000 $ Gesamt: 100.000 $ -1.500$ Laufzeit: 120 Monate Restlaufzeit: 60 Monate Rest: 73.500 $ Laufzeit: 120 Monate - 1 Monat Wert: 45.823€ Restlaufzeit: 59 Monate Wert: 36.723€ -9.100€ 49 P( Ausfall ) = 0.05 Zurück zum Projekt Treiberanalyse Abwechselnd komplizierte Joins und andere Queries Parallel ausführbare mathematische Berechnungen ... Beobachtung: 50 Impala: Nutzt Netzwerk Spark: Nutzt CPU Messungen 150 Spark Impala Summe Alt 100 50 0 51 1 Node 2 Nodes 3 Nodes 4 Nodes Spark 00:54:42 00:30:05 00:21:28 00:16:56 Impala 01:12:27 00:41:58 00:33:50 00:30:59 Summe 02:07:09 01:12:03 00:55:18 00:47:55 Geschwindigkeit i.V.z. alter Implementierung 110 % 194 % 253 % 292 % Idee: Aufteilung der Daten Idee: Impala braucht mehr Netzwerk Spark braucht mehr CPU ⟹ manuelle Aufteilung in 2 zeitversetzte Batchjobs mit jeweils 50% Daten 52 Messungen 53 1 Job (4 Nodes) 2 Jobs (4 Nodes) Spark 00:16:56 00:15:00 Impala 00:30:59 00:20:10 Summe 00:47:55 00:35:10 Geschwindigkeit i.V.z. alter Implementierung 292 % 398 % Inhalt Vorwort Projektbeschreibung Über Hadoop Spark und andere Hadoop Tools Ergebnisse des Projekts Zusammenfassung und Lessons Learned 54 Zusammenfassung Ziel: Berechnung der Werte von 13.000.000 Krediten beschleunigen Vorher: Mathematische Berechnung auf Rechenkern Join, Lookups, Aggregationen auf Sybase IQ Server > 2 Stunden Adastras Ansatz: 55 Alle Daten auf kleinen preiswerten Cluster Kostenlose Hadoop Software verwenden Durch leicht zu implementierende Parallelisierung beschleunigen Resultate: Schneller und günstiger: Zeit Kosten 160 ???? 140 €€€€ 120 €€€ 100 €€ 80 5000 60 4000 3000 40 2000 20 1000 0 0 Alte Spark & Impala auf Implementierung Hadoop 2:20 Stunden ⇔ 35 Minuten 4 x schneller 56 Alte Spark & Impala auf Implementierung Hadoop Viele €€€€ ⇔ 3000 € Deutlich günstiger Lessons learned Spark: Gutes Framework für parallelisierbare Probleme Deutlich schneller als MapReduce bei vielen Iterationen einer Berechnung Entwicklung einfach: 57 Mehrere Programmiersprachen Bibliotheken Aber: Noch dynamisch Bibliotheken sind nicht immer 100% bugfrei Lessons learned Mischen von Hadoop-Tools für beste Ergebnisse Problem besser in SQL als in imperative Programmiersprache formulierbar: 58 Sehr simpel? ↦ Spark SQL Kompliziert, aber kurze Laufzeit? ↦ Impala Kompliziert, lange Laufzeit (hohe Wahrscheinlichkeit für Hardwarefehler)? ↦ Hive Lessons learned Hadoop nicht nur für „Big Data“ Auch „Small/Medium Data“ auf “Small/Medium Clusters”, wenn 59 Parallelisierung möglich Berechnung beschleunigt werden soll Fragen? 60