Optimieren von Transformationen

Wenden Sie die folgenden Strategien an, um die Leistung von Transformationen in Zuordnungsdatenflüssen in Azure Data Factory- und Azure Synapse Analytics-Pipelines zu optimieren.

Optimieren von Joins, Exists-Transformationen und Suchvorgängen

Übertragung

Wenn bei Joins, Suchvorgängen und Exists-Transformationen der Arbeitsspeicher des Workerknotens groß genug für einen oder beide Datenströme ist, können Sie die Leistung optimieren, indem Sie die Übertragung aktivieren. Bei einer Übertragung senden Sie kleine Datenrahmen an alle Knoten im Cluster. Dies ermöglicht für die Spark-Engine die Durchführung eines Joinvorgangs, ohne dass die Daten im großen Datenstrom neu angeordnet werden. Standardmäßig entscheidet die Spark-Engine automatisch, ob eine Seite eines Joins übertragen werden soll. Wenn Sie mit Ihren eingehenden Daten vertraut sind und wissen, dass ein Datenstrom kleiner als der andere ist, können Sie für die Übertragung die Option Feststehend auswählen. Bei der feststehenden Übertragung wird Spark gezwungen, den ausgewählten Datenstrom zu übertragen.

Wenn die Größe der übertragenen Daten für den Spark-Knoten zu hoch ist, tritt ggf. ein Fehler vom Typ „Nicht genügend Arbeitsspeicher“ auf. Verwenden Sie Cluster vom Typ Arbeitsspeicheroptimiert, um Fehler vom Typ „Nicht genügend Arbeitsspeicher“ zu vermeiden. Wenn bei den Datenflussausführungen Übertragungstimeouts auftreten, können Sie die Broadcastoptimierung deaktivieren. Dies führt jedoch zu Datenflüssen mit geringerer Leistung.

Für die Arbeit mit Datenquellen, die mehr Zeit für Abfragen erfordern (z. B. große Datenbankabfragen), wird empfohlen, die Übertragung für Joins zu deaktivieren. Quellen mit langen Abfragezeiten können zu Spark-Timeouts führen, wenn der Cluster versucht, Daten an Computeknoten zu übertragen. Das Deaktivieren der Übertragung ist außerdem eine gute Entscheidung, wenn Sie über einen Datenstrom in Ihrem Datenfluss verfügen, der Werte zur späteren Verwendung in einer Suchtransformation aggregiert. Dieses Muster kann den Spark-Optimierer verwirren und zu Timeouts führen.

Join Transformation optimize

Kreuzprodukte

Wenn Sie Literalwerte in Ihren Verknüpfungsbedingungen verwenden oder auf beiden Seiten eines Joins über mehrere Übereinstimmungen verfügen, führt Spark den Joinvorgang als „Kreuzprodukt“ aus. Ein Kreuzprodukt ist ein vollständiges kartesisches Produkt, mit dem dann die verknüpften Werte herausgefiltert werden. Dieser Vorgang ist langsamer als andere Jointypen. Stellen Sie sicher, dass Sie auf beiden Seiten Ihrer Verknüpfungsbedingungen über Spaltenverweise verfügen, um eine Beeinträchtigung der Leistung zu vermeiden.

Sortieren vor Joinvorgängen

Im Gegensatz zu „Merge Join“ in Tools wie SSIS ist die Join-Transformation kein obligatorischer Vorgang vom Typ „Merge Join“. Für die Joinschlüssel ist vor der Transformation kein Sortiervorgang erforderlich. Die Verwendung von „Transformationen sortieren“ wird in Zuordnungsdatenflüssen nicht empfohlen.

Leistung der Fenstertransformation

Die Fenstertransformation im Zuordnungsdatenfluss partitioniert die Daten nach dem Wert in Spalten, die Sie als Teil der over()-Klausel in den Transformationseinstellungen auswählen. Es gibt zahlreiche gängige Aggregat- und Analysefunktionen, die in der Fenstertransformation bereitgestellt werden. Wenn Ihr Anwendungsfall aber darin besteht, ein Fenster für das gesamte Dataset für die Rangfolge rank() oder die Zeilennummer rowNumber() zu generieren, empfiehlt es sich, stattdessen die Rangtransformation und die Transformation für Ersatzschlüssel zu verwenden. Diese Transformationen bieten bei Verwendung dieser Funktionen eine bessere Leistung bei Vorgängen für das gesamte Dataset.

Erneutes Partitionieren bei Datenschiefe

Bei bestimmten Transformationen, z. B. Joins und Aggregatvorgängen, werden Ihre Datenpartitionen neu angeordnet und können gelegentlich zu Datenschiefe führen. Datenschiefe bedeutet, dass Daten nicht gleichmäßig auf die Partitionen verteilt werden. Bei hoher Datenschiefe kann es zu einer Verlangsamung von nachgeschalteten Transformationen und Senkenschreibvorgängen kommen. Sie können die Datenschiefe bei Ihnen während einer Datenflussausführung jederzeit überprüfen, indem Sie in der Überwachungsanzeige auf die Transformation klicken.

Skewness and kurtosis

In der Überwachungsanzeige wird angegeben, wie die Daten auf die einzelnen Partitionen verteilt sind, und die beiden Metriken für „Schiefe“ und „Wölbung“ werden angezeigt. Die Schiefe ist ein Maß dafür, wie asymmetrisch die Daten sind. Der Wert kann „Positiv“, „Null“, „Negativ“ oder „Nicht definiert“ lauten. Bei einer negativen Datenschiefe ist der linke Ausläufer länger als der rechte Ausläufer. Die Wölbung ist das Maß dafür, ob die Daten eine Verteilung mit schweren oder leichten Rändern aufweisen. Hohe Wölbungswerte sind nicht wünschenswert. Ideale Bereiche für die Datenschiefe liegen zwischen -3 und 3, und bei der Wölbung werden Werte angestrebt, die unter 10 liegen. Eine einfache Möglichkeit zur Interpretation dieser Zahlen besteht darin, im Partitionsdiagramm zu überprüfen, ob ein Balken größer als die anderen ist.

Falls Ihre Daten nach einer Transformation nicht gleichmäßig partitioniert sind, können Sie die Registerkarte „Optimieren“ verwenden, um sie neu zu partitionieren. Die Neuanordnung von Daten nimmt Zeit in Anspruch und führt ggf. nicht zu einer Verbesserung der Datenflussleistung.

Tipp

Wenn Sie Ihre Daten neu partitionieren, aber die Daten bei Ihnen von nachgeschalteten Transformationen dann neu angeordnet werden, sollten Sie die Hashpartitionierung für eine Spalte verwenden, die als Joinschlüssel genutzt wird.

Hinweis

Transformationen innerhalb des Datenflusses (mit Ausnahme der Sinktransformation) ändern die Datei- und Ordnerpartitionierung von ruhende Daten nicht. Durch die Partitionierung in jeder Transformation werden die Daten innerhalb der Datenframes des temporären serverlosen Spark-Clusters, den ADF für jede Ihrer Datenflussausführungen verwaltet, neu partitioniert.

Lesen Sie die folgenden Artikel zu Datenflüssen in Bezug auf die Leistung: