Unternehmen sammeln ihre Geschäftsdaten zunehmend in Hadoop-basierten Data Lakes/Hubs, um Analysten eine umfassende Sicht auf die Geschäftsprozesse zu geben und schnell neue Datenprodukte und -dienste umsetzen zu können. Bei der Anbindung und Konsolidierung der unterschiedlichen Daten steht der Architekt vor mehreren Herausforderungen: schnelle Erschließung neuer Datenquellen, automatisiertes Testen, Modellierung von Abhängigkeiten zwischen Tabellen (Data Lineage) und die Behandlung spät eintreffender Daten.
Wir zeigen den Aufbau solcher Datenplattformen und skizzieren praktische Umsetzungen mit den Open-Source-Werkzeugen Schedoscope (Otto Group) und Airflow (Airbnb).
Skills
Interesse an Big-Data-Architekturen, grober Überblick über das Hadoop-Ökosystem. Gegebenenfalls eigene schmerzhafte Erfahrungen mit Oozie.
Lernziele
Der Aufbau einer Big-Data-Platform endet nicht mit der Installation von Hadoop: Die organisatorischen und technischen Prozesse sind komplex und können durch die Wahl geeigneter technischer Werkzeuge unterstützt werden.
Event: data2day 2016, 05.10.2016
Speaker: Dr. Dominik Benz, Hans-Peter Zorn
Mehr Vorträge: https://www.inovex.de/de/content-pool/vortraege/
2. Ein See, ein See, ... wozu?
http://p5.focus.de/img/fotos/crop287471/1000162586-cfreecrop-w960-h541-ocx0_y63-q75-p5/seeelefant.jpg
https://c2.staticflickr.com/6/5321/9283741715_ba20166c37_b.jpg
Unterschiedliche
Datenquellen,
Formate Integration,
Verknüpfung
Kosteneffiziente
Langzeit-
archivierung
Offloading
Vorverarbeitung
DWH
Zentrale
Anlaufstelle für
Daten
2
Inspiration für
neue
Datenprodukte
Spielwiese für
Analysten,
Exploration
3. 3
Der Weg zum See
Definition,
Herausforderungen
Werkzeuge (Airflow/
Schedoscope)
Lösungsansätze
Vergleich&
Empfehlungen
4. Typischer Aufbau
raw processed datahub analysisingress egress
scheduling, orchestration, metadata
user access, system integration,
development
4
5. 5
Herausforderungen
raw processed datahub analysisingress egress
Scheduling, orchestration, metadata
user access, system integration,
development
Agile
Anbindung
Modellierung
Abhängigkeiten
Testing der
Transformationen
Behandlung spät
ankommende
Daten
6. › Kleinste Einheit: Artefakt von zusammengehörigen Daten („Tabelle“)
› Jedes Artefakt ist als Hive-Tabelle registriert
› Bewirtschaftung = (Neu)Erstellung der Artefakte
› Berücksichtigung von Abhängigkeiten bei der Bewirtschaftung
› Fokus: kontinuierlich neue Daten (Batches, Daten in Zeitscheiben)
6
Definition
Data Lake in unserem Kontext:
7. 7
Der Weg zum See
Werkzeuge (Airflow/
Schedoscope)
Lösungsansätze
Vergleich&
Empfehlungen
8. › Interne Datenplattformen u.a.
bei Otto Group BI
› Gestartet mit Oozie; Probleme:
› Langsame Entwicklungszyklen
› Viele redundante XML-Dateien
› UnzureichendeClusterauslastung
› Fehleranfällig
› Fehlersuche schwierig
8
Ausgangslage Werkzeuge
easy statt oozie J
› „Schemaiscode“
› Goal-drivenscheduling
› OpenSource, Scala(OttoGroupBI)
Airflow
› „Workflow iscode“
› Dynamische Daten-Pipelines
› OpenSource, Python(AirBnB)
9. 9
s
Agile Anbindung
› Definition von „Views“ (Schema)
› Statisch typisierte Scala-DSL
› Agiles, schnelles Erstellen neuer
Quellen & Ansichten
Agile Anbindung
› Abhängigkeiten Teil der View-
Definition
› Integriertes Unit-TestFramework
› Entwickelt seit 2015bei Otto Group BI
› Open Source (Apache SL 2.0) Agile Anbindung
› Ziel-getriebene Beladung
(„Materialized Views on Demand“)
10. 10
s
Agile Anbindung
case class Nodes(
year: Parameter[String],
month: Parameter[String]) extends View
with MonthlyParameterization
with Id
with PointOccurrence {
val version = fieldOf[Int]
val user_id = fieldOf[Int]
val longitude = fieldOf[Double]
val latitude = fieldOf[Double]
comment("View of nodes partitioned by year and
month with tags and geohash")
storedAs(Parquet())
}
11. 11
s
Agile Anbindung
case class Nodes(
...
val version = fieldOf[Int]
val user_id = fieldOf[Int]
val longitude = fieldOf[Double]
val latitude = fieldOf[Double]
transformVia(() =>
HiveTransformation(
insertInto(this,
queryFromResource(“hql/insertnodes.hql")))
)
...
}
16. 16
Der Weg zum See
Lösungsansätze
Vergleich&
Empfehlungen
17. Agilität
Entwicklung:
• Schema
• Transformation
• Workflow
Deployment
dev
Testen
Deployment
prod
Schema,
SQL/Spark, Oozie-
XML
Maven, Jenkins,..
FitNesse,
Explorativ, Tests
mit Hive
› Viele Schrauben
› Viele
Fehlerquellen
17
18. › Data Engineering == Softwareentwicklung
› Best Practices ähnlich
18
Agilität
Wie wird man schneller?
Agile Anbindung
› Weniger unterschiedliche Tools
weniger Konfigurationen an zu
passen
Agile Anbindung
› Früh testen
› Zeit bis zum entdeckten Fehler
reduzieren
› Continuous Integration/Delivery
› Automatisierung!
19. 19
Testing
› Tippfehler (im XML, SQL)
› Logische Fehler
› Schema-Änderungen in
vorgelagerten Tabellen
› Änderungen im Verhalten
der Plattform, ...
end-to-end (zB FitNesse)
› Langsam, Tests getrennt
von Codebase
› trotzdem wichtig!
isoliert („unit-test style“)
› define input, run
transformation, check output
20. 20
Testing
Schedoscope
1
1
1
3
3
2
"processed.Nodes" should "load correctly" in {
new Nodes(p("2013"), p("06")) with test {
basedOn(nodeTags, nodes)
then()
numRows shouldBe 1
row(v(id) shouldBe "122318",
v(occurredAt) shouldBe "2013-06-17 15:49:26Z",
v(version) shouldBe 6,
v(user_id) shouldBe 50299,
21. 21
Testing
Airflow
1
1 3
Agile Anbindung
› Kein integriertes Testen
› Einzelne Tasks können über CLI separat ausgeführt werden
(„airflow test“)
› Keine direkte Unterstützung zur Erzeugung von
Eingabedaten, Prüfen von Assertions
› Aber: Python-Bordmittel (pyunit, ...) können nahtlos
angebunden werden
› Zügige manuelle Erstellung einer Testumgebung
22. 22
Testing
Airflow - Code
1
1 3
processed_clicklog = HiveTestDataHook(
"src_omniture_clicklog",
"version='post',report_suite='testsuite',day=20151014")
for i in range(0,10):
processed_clicklog.add_row({"evar": {1:"evar_1_val", 2:"evar_2_val"}})
processed_clicklog.write()
self.run_task("omniture", "processed_to_datahub_events_pbox", "2015-10-14")
assertEquals(len(datahub_events_pbox.get_contents()), 17)
1
2
3
23. 23
Abhängigkeiten
Wer A sagt, muss auch B sagen
Agile Anbindung
› Bereinigte Views basieren auf Rohdaten
› Analytische Views <- Processed
› Aggregationen und KPI
› Export in Serving oder Analyische DB (Exasol, Redis)
› Joins
› Aggregate über Zeiträume
› Sequentielle Verarbeitung, abhängig vom Vortag
24. 24
Abhängigkeiten
Beispiel Schedoscope
case class Nodes(
year: Parameter[String],
month: Parameter[String]) extends View
with JobMetadata {
...
dependsOn(() => NodesWithGeohash(p(year), p(month)))
dependsOn(() => NodeTags(p(year), p(month)))
comment("View of nodes partitioned by year and month with
tags and geohash")
storedAs(Parquet())
}
Agile AnbindungDynamisch, frei definierbar