Kapitel 1. Was ist Dask?
Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com
Dask ist ein Framework für paralleles Rechnen mit Python, das von mehreren Kernen auf einer Maschine bis hin zu Rechenzentren mit Tausenden von Maschinen skalierbar ist. Es verfügt sowohl über Low-Level-Task-APIs als auch über Higher-Level-APIs für die Datenverarbeitung. Die Low-Level-Task-APIs ermöglichen die Integration von Dask mit einer Vielzahl von Python-Bibliotheken. Die öffentlichen APIs haben es ermöglicht, dass sich um Dask herum ein Ökosystem von Tools für verschiedene Anwendungsfälle entwickelt hat.
Continuum Analytics, jetzt , bekannt als Anaconda Inc, hat das von der DARPA finanzierte Open-Source-Projekt Blaze ins Leben gerufen, aus dem sich Dask entwickelt hat. Continuum war an der Entwicklung vieler wichtiger Bibliotheken und sogar an Konferenzen im Bereich der Python-Datenanalyse beteiligt. Dask ist nach wie vor ein Open-Source-Projekt, wobei ein Großteil der Entwicklung jetzt von Coiled unterstützt wird.
Dask ist im Ökosystem des verteilten Rechnens einzigartig, weil es beliebte Bibliotheken für Data Science, paralleles und wissenschaftliches Rechnen integriert. Die Integration verschiedener Bibliotheken in Dask ermöglicht es Entwicklern, einen Großteil ihres vorhandenen Wissens in großem Umfang wiederzuverwenden. Außerdem können sie häufig einen Teil ihres Codes mit minimalen Änderungen wiederverwenden.
Warum brauchst du Dask?
Dask vereinfacht die Skalierung von Analytik-, ML- und anderem in Python geschriebenen Code,1 Dask soll die Lücke füllen, in der deine bestehenden Tools wie Pandas DataFrames oder deine Scikit-Learn-Pipelines für maschinelles Lernen zu langsam werden (oder nicht mehr erfolgreich sind). Auch wenn der Begriff "Big Data" heute vielleicht nicht mehr so in Mode ist wie noch vor ein paar Jahren, sind die Datenmengen nicht kleiner und die Komplexität der Berechnungen und Modelle nicht einfacher geworden. Mit Dask kannst du in erster Linie die vorhandenen Schnittstellen nutzen, an die du gewöhnt bist (z. B. Pandas und Multiprocessing), während du über die Größenordnung eines einzelnen Kerns oder sogar einer einzelnen Maschine hinausgehst.
Hinweis
Andererseits, wenn alle deine Daten in den Speicher eines Laptops passen und du deine Analyse beenden kannst, bevor du eine Tasse deines warmen Lieblingsgetränks aufbrühen konntest, brauchst duDask wahrscheinlichnoch nicht.
Wie passt Dask in das Ökosystem?
Dask bietet Skalierbarkeit für mehrere, traditionell unterschiedliche Tools. Am häufigsten wird es zur Skalierung von Python-Datenbibliotheken wie Pandas und NumPy verwendet. Dask erweitert bestehende Tools für die Skalierung, wie z. B. Multiprocessing, und ermöglicht es ihnen, ihre derzeitigen Grenzen von Einzelmaschinen auf Multicore- und Multimaschinen zu erweitern. Im Folgenden wird ein kurzer Überblick über die Entwicklung des Ökosystems gegeben:
- Frühe "Big Data"-Abfrage
-
Apache Hadoop und Apache Hive
- Spätere "Big Data"-Abfrage
-
Apache Flink und Apache Spark
- Auf Datenrahmen fokussierte verteilte Tools
-
Koalas, Ray und Dask
Von der Abstraktion her gesehen steht Dask über den Maschinen und den Clustermanagement-Tools, sodass du dich auf den Python-Code konzentrieren kannst und nicht auf die Feinheiten der Maschine-zu-Maschine-Kommunikation:
- Skalierbare Daten und ML-Tools
-
Hadoop, Hive, Flink, Spark, TensorFlow, Koalas, Ray, Dask, etc.
- Rechenressourcen
-
Apache Hadoop YARN, Kubernetes, Amazon Web Services, Slurm Workload Manager, etc.
Wir sagen, dass ein Problem rechengebunden ist, wenn der begrenzende Faktor nicht die Menge der Daten ist, sondern die Arbeit, die wir mit den Daten verrichten. Speichergebundene Probleme sind Probleme, bei denen nicht die Rechenleistung der begrenzende Faktor ist, sondern die Fähigkeit, alle Daten im Speicher zu speichern. Manche Probleme können sowohl rechen- als auch speicherbegrenzt sein, wie es bei großen Deep-Learning-Problemen oft der Fall ist.
Multi-Core-Verarbeitung (Multi-Threading) kann bei rechenintensiven Problemen helfen (bis zur Grenze der Anzahl der Kerne in einer Maschine). Im Allgemeinen kann die Multi-Core-Verarbeitung nicht bei speichergebundenen Problemen helfen, da alle Zentraleinheiten (Central Processing Units, CPUs) den gleichen Zugriff auf den Speicher haben.2
Eine beschleunigte Verarbeitung, einschließlich der Verwendung spezieller Befehlssätze oder spezieller Hardware wie Tensor Processing Units oder Graphics Processing Units, ist in der Regel nur für rechenintensive Probleme sinnvoll. Manchmal führt die beschleunigte Verarbeitung zu speichergebundenen Problemen, da der für die beschleunigte Berechnung verfügbare Speicher kleiner sein kann als der "Hauptspeicher" des Systems.
Multi-Maschinen-Verarbeitung ist für beide Problemklassen wichtig. Da die Anzahl der Kerne in einer Maschine (zu einem erschwinglichen Preis) begrenzt ist, musst du die Verarbeitung auf mehreren Maschinen in Betracht ziehen, selbst wenn ein Problem bei bestimmten Größenordnungen "nur" rechengebunden ist. In der Regel eignen sich speichergebundene Probleme gut für die Skalierung auf mehrere Maschinen, da Dask die Daten oft zwischen den verschiedenen Maschinen aufteilen kann.
Dask ist sowohl für mehrere Kerne als auch für mehrere Maschinen skalierbar, sodass du deinen Python-Code nach Belieben skalieren kannst.
Ein großer Teil der Leistungsfähigkeit von Dask ergibt sich aus den darauf aufbauenden Tools und Bibliotheken, die sich in die jeweiligen Teile des Datenverarbeitungsökosystems einfügen (wie BlazingSQL). In den folgenden Unterabschnitten werden wir kurz darauf eingehen, wie du Dask für verschiedene Arten von Problemen nutzen kannst und wie es im Vergleich zu einigen bestehenden Tools abschneidet.
Big Data
Dask verfügt über bessere Integrationen in die Python-Bibliothek und einen geringeren Overhead für Tasks als viele Alternativen. Apache Spark (und sein Python-Pendant PySpark) ist eines der beliebtesten Tools für Big Data. Bestehende Big-Data-Tools wie PySpark verfügen über mehr Datenquellen und Optimierer (z. B. Prädikat-Pushdown), aber einen höheren Overhead pro Task. Der geringere Overhead von Dask ist vor allem darauf zurückzuführen, dass der Rest des Python-Big-Data-Ökosystems hauptsächlich auf der JVM aufgebaut ist. Diese Tools verfügen über fortschrittliche Funktionen wie Abfrageoptimierer, allerdings zu dem Preis, dass Daten zwischen der JVM und Python kopiert werden müssen.
Im Gegensatz zu vielen anderen traditionellen Big-Data-Tools wie Spark und Hadoop ist der lokale Modus bei Dask ein Bürger erster Klasse. Das traditionelle Big-Data-Ökosystem konzentriert sich darauf, den lokalen Modus zum Testen zu nutzen, während Dask sich auf eine gute Leistung konzentriert, wenn es auf einem einzelnen Knoten läuft.
Ein weiterer bedeutender kultureller Unterschied liegt in der Paketierung: Viele Big-Data-Projekte fassen alles zusammen (z. B. werden Spark SQL, Spark Kubernetes und so weiter gemeinsam veröffentlicht). Dask verfolgt einen modulareren Ansatz, bei dem die Komponenten einem eigenen Entwicklungs- und Veröffentlichungsrhythmus folgen. Der Dask-Ansatz ermöglicht eine schnellere Iteration, allerdings um den Preis gelegentlicher Inkompatibilitäten zwischen den Bibliotheken.
Datenwissenschaft
Eine der beliebtesten Python-Bibliotheken im Ökosystem der Datenwissenschaft ist Pandas. Apache Spark (und sein Python-Pendant PySpark) ist auch eines der beliebtesten Tools für verteilte Datenwissenschaft. Es unterstützt sowohl Python als auch JVM-Sprachen. Der erste Versuch von Spark, Datenrahmen zu erstellen, ähnelte eher SQL als dem, was man sich unter einem Datenrahmen vorstellt. Spark hat zwar mit dem Koalas-Projekt begonnen, die Pandas-Unterstützung zu integrieren, aber unserer Meinung nach ist die Unterstützung von Dask für die APIs der Data-Science-Bibliotheken die beste in ihrer Klasse.3 Neben den Pandas-APIs unterstützt Dask auch die Skalierung von NumPy, Scikit-Learn und anderen Data-Science-Tools.
Hinweis
Dask kann so erweitert werden, dass es neben NumPy und Pandas auch andere Datentypen unterstützt, und auf diese Weise wird die GPU-Unterstützung mit cuDF implementiert.
Parallel zu verteiltem Python
Paralleles Rechnen bedeutet, dass mehrere Operationen gleichzeitig ausgeführt werden, und verteiltes Rechnen überträgt dies auf mehrere Operationen auf mehreren Rechnern. Parallel Python umfasst eine breite Palette von Tools, die von Multiprocessing bis zu Celery reichen.4 Dask gibt dir die Möglichkeit, einen beliebigen Graphen von Abhängigkeiten anzugeben und diese parallel auszuführen. Unter der Haube kann diese Ausführung entweder von einer einzigen Maschine (mit Threads oder Prozessen) unterstützt oder auf mehrere Worker verteilt werden.
Hinweis
Viele Big-Data-Tools haben ähnliche Low-Level-Task-APIs, aber sie sind intern und werden nicht für unsere Nutzung offengelegt oder gegen Ausfälle geschützt.
Dask Gemeindebibliotheken
Die wahre Stärke von Dask liegt in dem Ökosystem, das um das Framework herum aufgebaut wurde. Verschiedene Bibliotheken bauen auf Dask auf und geben dir die Möglichkeit, mehrere Tools im selben Framework zu verwenden. Diese Community-Bibliotheken sind unter anderem deshalb so leistungsfähig, weil sie eine Kombination aus Low-Level- und High-Level-APIs bieten, die nicht nur für die First-Party-Entwicklung verfügbar sind.
Beschleunigtes Python
Du kannst Python auf einige verschiedene Arten beschleunigen, von der Codegenerierung (wie Numba) bis hin zu Bibliotheken für spezielle Hardware wie NVidias CUDA (und Wrapper wie cuDF), AMDs ROCm und Intels MKL.
Dask selbst ist keine Bibliothek für beschleunigtes Python, aber du kannst es in Verbindung mit beschleunigten Python-Tools verwenden. Um die Nutzung zu vereinfachen, integrieren einige Community-Projekte Beschleunigungstools wie cuDF und dask-cuda in Dask. Wenn du beschleunigte Python-Tools mit Dask verwendest, musst du darauf achten, deinen Code so zu strukturieren, dass Serialisierungsfehler vermieden werden (siehe "Serialisierung und Beizen").
Hinweis
Beschleunigte Python-Bibliotheken neigen dazu, mehr "native" Speicherstrukturen zu verwenden, die von Pickle nicht so leicht verarbeitet werden können.
SQL-Engines
Dask selbst hat keine SQL-Engine, aber FugueSQL, Dask-SQL und BlazingSQL nutzen Dask, um eine verteilte SQL-Engine anzubieten.5 Dask-SQL nutzt das beliebte Apache Calcite Projekt, das auch viele andere SQL-Engines betreibt. BlazingSQL erweitert Dask DataFrames, um GPU-Operationen zu unterstützen. cuDF DataFrames haben eine etwas andere Darstellung. Apache Arrow macht es einfach, einen Dask-Datenrahmen in cuDF zu konvertieren und umgekehrt.
Dask ermöglicht es diesen verschiedenen SQL-Engines, sowohl speicher- als auch rechnergestützt zu skalieren, d.h. größere Datenmengen zu verarbeiten, als in den Speicher eines einzelnen Computers passen, und Zeilen auf mehreren Computern zu verarbeiten. Dask ermöglicht auch den wichtigen Aggregationsschritt, bei dem die Ergebnisse von den verschiedenen Rechnern zu einer zusammenhängenden Ansicht der Daten kombiniert werden.
Tipp
Dask-SQL kann Daten aus Teilen des Hadoop-Ökosystems lesen, aus denen Dask nicht lesen kann (z. B. Hive).
Zeitplanungsprogramm für den Arbeitsablauf
Die meisten Unternehmen benötigen irgendeine Art von geplanter Arbeit, von Programmen, die zu bestimmten Zeiten laufen (z. B. zur Berechnung der Tages- oder Monatsabschlüsse), bis hin zu Programmen, die als Reaktion auf Ereignisse laufen. Bei diesen Ereignissen kann es sich z. B. um Daten handeln, die verfügbar werden (z. B. nachdem der Tagesabschluss erstellt wurde) oder um eine neue E-Mail, die eingeht. Im einfachsten Fall handelt es sich bei der geplanten Arbeit um ein einzelnes Programm, aber oft ist es noch komplexer als das.
Wie bereits erwähnt, kannst du beliebige Graphen in Dask angeben, und wenn du willst, kannst du deine Workflows auch mit Dask selbst schreiben. Du kannst Systembefehle aufrufen und ihre Ergebnisse auswerten, aber nur weil du etwas tun kannst, heißt das noch lange nicht, dass es Spaß macht oder einfach ist.
Der bekannte Name6 für die Planung von Arbeitsabläufen im Big-Data-Ökosystem ist Apache Airflow. Airflow verfügt zwar über eine wunderbare Sammlung von Operatoren, mit denen sich komplexe Aufgabentypen leicht ausdrücken lassen, ist aber bekanntermaßen schwer zu skalieren.7 Dask kann verwendet werden, um Airflow-Aufgaben auszuführen. Alternativ kann es auch als Backend für andere Zeitplanungsprogramme wie Prefect verwendet werden. Prefect zielt darauf ab, mit einer großen vordefinierten Aufgabenbibliothek Airflow-ähnliche Funktionen in Dask zu integrieren. Da Prefect von Anfang an Dask als Ausführungs-Backend verwendet hat, ist es enger integriert und hat einen geringeren Overhead als Airflow auf Dask.
Hinweis
Nur wenige Tools decken alle dieselben Bereiche ab, wobei Ray das ähnlichste Tool ist. Dask und Ray stellen beide Python-APIs zur Verfügung, die bei Bedarf erweitert werden können. Es gibt eine GitHub-Ausgabe, in der die Entwickler beider Systeme ihre Gemeinsamkeiten und Unterschiede vergleichen. Aus der Systemperspektive sind die größten Unterschiede zwischen Ray und Dask die Handhabung des Zustands, die Fehlertoleranz und die zentrale gegenüber der dezentralen Zeitplanung. Ray implementiert einen größeren Teil seiner Logik inC++, was Leistungsvorteile haben kann, aber auch schwieriger zu lesen ist. Aus Benutzersicht ist Dask eher auf Data Science ausgerichtet, während Ray den Schwerpunkt auf verteilte Zustände und die Unterstützung von Akteuren legt. Dask kann Ray als Backend für das Scheduling nutzen.8
Was Dask nicht ist
Dask ist zwar vieles, aber kein Zauberstab, mit dem du deinen Code schneller machen kannst. Es gibt Stellen, an denen Dask weitgehend kompatible Drop-in-APIs hat, aber wenn du sie missbrauchst, kann das zu einer langsameren Ausführung führen. Dask ist kein Tool zum Umschreiben von Code oder für Just-in-Time (JIT); stattdessen ermöglicht Dask die Skalierung dieser Tools für die Ausführung auf Clustern. Dask konzentriert sich auf Python und ist möglicherweise nicht das richtige Werkzeug für die Skalierung von Sprachen, die nicht eng mit Python integriert sind (wie Go). Dask hat keine eingebaute Katalogunterstützung (z. B. Hive oder Iceberg), sodass das Lesen und Schreiben von Daten aus Tabellen, die in den Katalogen gespeichert sind, eine Herausforderung darstellen kann.
Fazit
Dask ist eine der möglichen Optionen, um deinen analytischen Python-Code zu skalieren. Es bietet verschiedene Einsatzmöglichkeiten, von mehreren Kernen auf einem einzelnen Computer bis hin zu Rechenzentren. Im Vergleich zu vielen anderen Tools in ähnlichen Bereichen verfolgt Dask einen modularen Ansatz, was bedeutet, dass du dir die Zeit nehmen solltest, das Ökosystem und die Bibliotheken zu verstehen. Die richtige Wahl für die Skalierung deiner Software hängt von deinem Code und dem Ökosystem, den Datenkonsumenten und den Quellen für dein Projekt ab. Wir hoffen, dass wir dich davon überzeugen konnten, dass es sich lohnt, ein wenig mit Dask zu spielen, was du im nächsten Kapitel tust.
1 Nicht jeder Python-Code. Dask wäre zum Beispiel eine schlechte Wahl für die Skalierung eines Webservers (sehr zustandsbehaftet aufgrund der Anforderungen an Web-Sockets).
2 Mit Ausnahme von Systemen mit uneinheitlichem Speicherzugriff (NUMA).
3 Natürlich gehen die Meinungen auseinander. Siehe z.B. "Single Node Processing - Spark, Dask, Pandas, Modin, Koalas Vol. 1", "Benchmark: Koalas (PySpark) und Dask", und "Spark vs. Dask vs. Ray".
4 Celery, das oft für die Verwaltung von Hintergrundaufgaben verwendet wird, ist eine asynchrone Aufgabenwarteschlange, die die Arbeit auch aufteilen und verteilen kann. Sie ist jedoch auf einer niedrigeren Ebene als Dask angesiedelt und verfügt nicht über die gleichen Annehmlichkeiten wie Dask.
5 BlazingSQL wird nicht mehr weiterentwickelt, obwohl seine Konzepte interessant sind und vielleicht in einem anderen Projekt weitergeführt werden.
6 Angenommen, du hast einen ziemlich nerdigen Haushalt.
7 Bei eintausend Aufgaben pro Stunde ist eine umfangreiche Abstimmung und manuelle Berücksichtigung erforderlich; siehe "Skalierung des Luftstroms auf 1000 Aufgaben/Stunde".
8 Umgekehrt ist Ray in der Lage, Dask für die Bereitstellung von Data Science-Funktionen zu nutzen.
Get Skalierung von Python mit Dask now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.