5

ich mit einer Pipeline Kopie Aktivität wie diese eine Daten Fabrik:Azure Daten Fabrik Kopie Aktivität von Storage SQL: hängt bei 70000 Zeilen

{ 
    "type": "Copy", 
    "name": "Copy from storage to SQL", 
    "inputs": [ 
    { 
     "name": "storageDatasetName" 
    } 
    ], 
    "outputs": [ 
    { 
     "name": "sqlOutputDatasetName" 
    } 
    ], 
    "typeProperties": { 
    "source": { 
     "type": "BlobSource" 
    }, 
    "sink": { 
     "type": "SqlSink" 
    } 
    }, 
    "policy": { 
    "concurrency": 1, 
    "retry": 3 
    }, 
    "scheduler": { 
    "frequency": "Month", 
    "interval": 1 
    } 
} 

Der Dateneingang ist ca. 90 MB groß, etwa 1,5 Millionen Zeilen , in ca. 20 x 4,5 MB blockieren BLOB-Dateien in Azure Storage. Hier ist ein Beispiel der Daten (CSV):

A81001,1,1,1,2,600,3.0,0.47236654,141.70996,0.70854986 A81001,4,11,0,25,588,243.0,5.904582,138.87576,57.392536 A81001,7,4,1,32,1342,278.0,7.5578647,316.95795,65.65895

Das Waschbecken ist ein Azure SQL Server vom Typ S2, die bei 50 DTUs bewertet wird. Ich habe eine einfache Tabelle mit sinnvollen Datentypen erstellt, und keine Schlüssel, Indizes oder etwas Besonderes, nur Spalten:

CREATE TABLE [dbo].[Prescriptions](
    [Practice] [char](6) NOT NULL, 
    [BnfChapter] [tinyint] NOT NULL, 
    [BnfSection] [tinyint] NOT NULL, 
    [BnfParagraph] [tinyint] NOT NULL, 
    [TotalItems] [int] NOT NULL, 
    [TotalQty] [int] NOT NULL, 
    [TotalActCost] [float] NOT NULL, 
    [TotalItemsPerThousand] [float] NOT NULL, 
    [TotalQtyPerThousand] [float] NOT NULL, 
    [TotalActCostPerThousand] [float] NOT NULL 
) 

Die Quelle, Waschbecken und Daten Fabrik sind alle in der gleichen Region (Nordeuropa).

Laut Microsoft 'Copy activity performance and tuning guide', für Azure Storage Source und Azure SQL S2 sinken, sollte ich etwa 0,4 MBit/s bekommen. Nach meiner Berechnung bedeutet das, dass 90 MB in ungefähr einer halben Stunde übertragen werden sollten (ist das richtig?).

enter image description here

Für einige sehr schnell kopiert 70.000 Zeilen Grund zu hängen scheint dann. Mit SQL Management Studio kann ich sehen, dass die Anzahl der Zeilen in der Datenbanktabelle genau 70.000 ist und in 7 Stunden überhaupt nicht zugenommen hat. Doch die Kopieraufgabe läuft noch ohne Fehler:

enter image description here

Irgendwelche Ideen, warum dies bei 70.000 Zeilen hängt? Ich kann nichts Ungewöhnliches an der 70.001sten Datenzeile sehen, die ein Problem verursachen würde. Ich habe versucht, die Datenfabrik zu löschen und neu zu starten, und ich bekomme immer das gleiche Verhalten. Ich habe eine weitere Kopieraktivität mit einer kleineren Tabelle (8000 Zeilen), die in 1 Minute abgeschlossen ist.

Antwort

9

Nur meine eigene Frage in dem Fall zu beantworten, es jemand anderes hilft:

Das Problem mit Nullwerten waren. Der Grund, dass mein Lauf bei 70.000 Zeilen hängen geblieben war, war, dass in Zeile 76560 meiner Blob-Quelldatei ein Nullwert in einer der Spalten war. Das HIVE-Skript, das ich benutzt hatte, um diese Blob-Datei zu erzeugen, hatte den Null-Wert als '\ N' geschrieben. Außerdem hat meine Senke-SQL-Tabelle 'NOT NULL' als Teil der Spalte angegeben, und die Spalte war ein FLOAT-Wert.

Also machte ich zwei Änderungen: die folgende Eigenschaft meiner Blob-Datensatz Definition hinzugefügt:

"nullValue": "\\N" 

Und meine SQL Tabellenspalte nullable gemacht. Es läuft jetzt komplett und hängt nicht! :)

Das Problem ist, dass die Data Factory nicht Fehler, es ist gerade stecken geblieben - es wäre schön, wenn der Job mit einer sinnvollen Fehlermeldung fehlgeschlagen wäre, und erzählte mir, welche Zeile der Daten das Problem war. Ich denke, weil die Schreib-Batch-Größe standardmäßig 10.000 ist, ist es deshalb bei 70.000 stecken geblieben und nicht bei 76560.

+0

das ist toll, aber wie um alles in der Welt haben Sie es geschafft ?! – m1nkeh

+2

Ich musste manuell meine Datendateien von Zeile 70.000 nach irgendwelchen Problemen suchen! Zum Glück fiel der leere/Null-Wert auf: p Ich habe später ausgearbeitet, dass Sie die Batch-Größe ändern können, z. bis 100, was bedeutet, dass es an einer Zeilennummer hängt, die höchstens 100 Zeilen vom Problem entfernt ist –