Wie speichere ich Laufzeitdaten zwischen Pipeline-Ausführungen in Azure Data Factory?

Nov 23 2020

Ich habe das Tutorial von Microsoft zum inkrementellen / Delta-Laden von Daten aus einer SQL Server-Datenbank befolgt.

Es verwendet ein Wasserzeichen (Zeitstempel), um die seit dem letzten Mal geänderten Zeilen zu verfolgen. In diesem Lernprogramm wird das Wasserzeichen mithilfe der Aktivität "Gespeicherte Prozedur" in der Pipeline in einer Azure SQL-Datenbank gespeichert, damit es bei der nächsten Ausführung wiederverwendet werden kann.

Es scheint übertrieben, eine Azure SQL-Datenbank zu haben, um nur diese winzigen Metainformationen zu speichern (meine Quellendatenbank ist übrigens schreibgeschützt). Ich möchte das lieber irgendwo anders in Azure speichern . Vielleicht im Blob-Speicher oder was auch immer.

Kurz gesagt: Gibt es eine einfache Möglichkeit, diese Art von Daten zu verfolgen, oder beschränken wir uns darauf, dafür gespeicherte Prozesse (oder Azure Functions et al.) Zu verwenden?

Antworten

1 JasonWright Nov 24 2020 at 02:46

Ich war auf ein sehr ähnliches Szenario gestoßen, und nach meinen Erkenntnissen können Sie keine Wasserzeicheninformationen in ADF speichern - zumindest nicht auf eine Weise, auf die Sie leicht zugreifen können.

Am Ende habe ich gerade eine grundlegende Azure SQL-Datenbank erstellt, um meine Wasserzeichen- / Konfigurationsinformationen auf einem SQL Server zu speichern, den ich bereits in meinen Pipelines verwendet habe.

Das Schöne daran ist, dass ich bei der Skalierung meiner Lösung auf mehrere Geschäftsbereiche mit unterschiedlichen Datenbanken immer noch Wasserzeicheninformationen für jeden von ihnen verwalten konnte, indem ich einfach eine Spalte hinzufügte, in der nachverfolgt wurde, für welche BU diese spezifischen Wasserzeicheninformationen bestimmt waren.

Blob-Speicher ist in der Tat eine billigere Option, aber ich habe festgestellt, dass es etwas mehr Aufwand erfordert, als nur eine zusätzliche Datenbank / Tabelle in einer vorhandenen Datenbank zu verwenden.

Ich bin damit einverstanden, dass es wirklich nützlich wäre, einen kleinen Datensatz in ADF selbst für kleine Konfigurationselemente zu verwalten - wahrscheinlich ein guter Vorschlag für Microsoft!

1 SteveZhao Nov 24 2020 at 09:01

Es gibt eine Möglichkeit, dies mithilfe der Kopieraktivität zu erreichen. Es ist jedoch kompliziert, das neueste Wasserzeichen in 'LookupOldWaterMarkActivity' nur als Referenz abzurufen.

Datensatzeinstellung:

Aktivitätseinstellung kopieren:

Quell- und Senkendatensatz sind identisch. Ändern Sie den Ausdruck in zusätzlichen Spalten in@{activity('LookupNewWaterMarkActivity').output.firstRow.NewWatermarkvalue}

Dadurch können Sie Wasserzeichen als Spalte in der TXT-Datei speichern. Es ist jedoch schwierig, mit der Suchaktivität das neueste Wasserzeichen zu erhalten. Weil Ihre Ausgabe von 'LookupOldWaterMarkActivity' folgendermaßen aussehen wird:

{
    "count": 1,
    "value": [
        {
            "Prop_0": "11/24/2020 02:39:14",
            "Prop_1": "11/24/2020 08:31:42"
        }
    ]
}

Der Name des Schlüssels wird von ADF generiert. Wenn Sie "24.11.2020 08:31:42" erhalten möchten, müssen Sie die Spaltenanzahl abrufen und dann den folgenden Ausdruck verwenden:@activity('LookupOldWaterMarkActivity').output.value[0][Prop_(column count - 1)]

So erhalten Sie das neueste Wasserzeichen:

  1. Verwenden Sie die GetMetadata-Aktivität, um columnCount abzurufen

  2. Verwenden Sie diesen Ausdruck:@activity('LookupOldWaterMarkActivity').output.value[0][concat('Prop_',string(sub(activity('Get Metadata1').output.columnCount,1)))]