AI

Upgrade auf SPARK 3.0.x? Was bringt das in der Praxis?

2 Min. Lesezeit
Mittwoch, 07. April 2021

Viele unserer Kunden setzen im Bereich Industrial IoT und Data Science (mit wirklich großen Datenmengen) auf SPARK und dabei insbesondere auf Azure Databricks. Mit gutem Grund, denn die Umgebung bietet alles, was sich der Data Scientist von heute wünscht: R, Python, Scala, MLflow integriert, Interaktion mit allen Datenlieferanten in Azure, AD Integration und vieles mehr.

Eine stetige Weiterentwicklung ist jedoch Segen und Fluch zugleich. Denn man bleibt zwar immer am Ball bezüglich aller Neuentwicklungen, aber man muss das Risiko in Kauf nehmen, dass neuere Versionen etwas sensibler auf Syntax und Semantik achten. Auch eine notwendige Code-Überarbeitung ist ein nicht zu unterschätzender Faktor.

Aber warum sollte man dann überhaupt auf Spark 3.0.x umsteigen? Ganz einfach: was man dabei gewinnt, ist vielversprechend! Spark verspricht bei Spark 3.0.x einen Geschwindigkeitsgewinn von bis zu 10- und (unglaublichen) 100-fachen Beschleunigungen von einzelnen Statements. Näheres dazu können Sie in meinem Beitrag über Spark 3.0.x genauer nachlesen.

Wichtig bei der Entscheidung für eine Umstellung ist jedenfalls immer der „realistische“ Gewinn, der durch die Änderungen entsteht. Wir haben bereits bei mehreren Kunden die Umstellungen auf Spark 3.0.x durchgeführt und können von 20-25 % (in kleineren Bereichen von über 50 %) Beschleunigungen berichten. Insbesondere Schnittstellen zu R und Python sind schneller und SQL – Abfragen werden wirklich spürbar besser optimiert (Stichwort Adaptive Query Execution).

Was waren aber die großen Herausforderungen, mit denen wir zu kämpfen hatten?

  • Treiber für Spark (insbesondere Maven-Treiber für Excel, CosmosDB oder SQL) werden derzeit nicht angeboten. Das ändert sich aber zumindest (hoffentlich) für CosmosDB wieder. Bei SQL allerdings definitiv nicht mehr.
  • Dadurch mussten Datenschnittstellen (insbesondere zu SQL) grundlegend umgeschrieben werden. Wir setzen hier sehr erfolgreich auf JDBC.
  • Manche Typspezifikationen und syntaktische Details wurden geändert. Damit wurde ein Überarbeiten von vielen (auch sehr „alten“) Codestücken notwendig.

Ich erkläre es gerne anhand eines kleinen Beispiels - in eigener Sache - für die neuen (genaueren) Prüfungen in Spark. Ein Codestück zum Erzeugen von Datenreihen von Dates in Spark kommt bei mir sehr häufig vor:

Spark 2.4.5:

  SELECT date_add(CAST('2020-05-01' AS TIMESTAMP), cnt.id) Empfang

  FROM (

      SELECT id

      FROM range((DATEDIFF(current_date(), '2020-05-01') - 5), DATEDIFF(current_date(), '2019-05-01'))

    ) cnt

Dies wirft in Spark 3.0.x den Fehler:

cannot resolve 'date_add(…, cnt.`id`)' due to data type mismatch: argument 2 requires (int or smallint or tinyint) type

Der Fehler entsteht durch den fehlenden CAST auf INT, die Range-Funktion liefert hier fix BIGINTs und damit den falschen und nicht mehr automatisch eindeutig konvertierbaren Datentypen. Daher

Spark 3.0.x:

  SELECT date_add(CAST('2020-05-01' AS TIMESTAMP), cnt.id) Empfang

  FROM (

      SELECT CAST(id AS INT)

      FROM range((DATEDIFF(current_date(), '2020-05-01') - 5), DATEDIFF(current_date(), '2019-05-01'))

    ) cnt

Trotz der kleinen Herausforderungen, die es beim Umstieg zu meistern gilt, kann ich Spark 3.0.x definitiv empfehlen!