5

Ho una fabbrica di dati con un'attività condotta esemplare in questo modo:dati Azure fabbrica attività copia da bagagli a SQL: si blocca a 70000 righe

{ 
    "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 
    } 
} 

I dati di input è di circa 90 MB di dimensione, circa 1,5 milioni di righe , suddiviso in ca. 20 x 4,5 MB di file BLOB di blocco in Archiviazione di Azure. Ecco un esempio dei dati (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

Il lavandino è un Azure SQL Server di tipo S2, che è valutato a 50 DTU. Ho creato una semplice tabella con i tipi di dati sensibili, e senza chiavi, indici o niente di eccezionale, solo colonne:

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 
) 

La fonte, lavandino e fabbrica i dati sono tutti nella stessa regione (Nord Europa).

Secondo Microsoft 'Copy activity performance and tuning guide', per Azure Storage Source e Azure SQL S2 sink, dovrei ottenere circa 0.4 MBps. Secondo il mio calcolo, ciò significa che 90 MB dovrebbero essere trasferiti in circa mezz'ora (giusto?).

enter image description here

per qualche motivo copie 70.000 righe molto rapidamente, quindi sembra bloccarsi. Utilizzando SQL Management Studio posso vedere il numero di righe nella tabella del database è esattamente 70.000 e non è affatto aumentato in 7 ore. Eppure il compito copia è ancora in esecuzione senza errori:

enter image description here

Tutte le idee perché questo è appeso a 70.000 righe? Non riesco a vedere nulla di insolito nella 70.001 ° riga di dati che potrebbe causare un problema. Ho provato a distruggere la fabbrica di dati e ricominciare da capo, e ho sempre lo stesso comportamento. Ho un'altra attività di copia con una tabella più piccola (8000 righe), che termina in 1 minuto.

risposta

9

Giusto per rispondere alla mia domanda in caso aiuta chiunque altro:

Il problema era con valori nulli. Il motivo per cui la mia esecuzione era sospesa a 70.000 righe era che alla riga 76560 del mio file sorgente BLOB, c'era un valore nullo in una delle colonne. Lo script HIVE che avevo usato per generare questo file blob aveva scritto il valore null come '\ N'. Inoltre, la tabella SQL del mio sink specificava 'NOT NULL' come parte della colonna e la colonna era un valore FLOAT.

così ho fatto due cambiamenti: aggiunta la seguente proprietà alla mia blob definizione del set di dati:

"nullValue": "\\N" 

e mi feci SQL colonna della tabella nullable. Ora funziona completamente e non si blocca! :)

Il problema è che il Data Factory non ha commesso errori, è rimasto bloccato - sarebbe bello se il lavoro fosse fallito con un utile messaggio di errore, e mi dicesse quale fosse la riga dei dati il ​​problema. Penso che la dimensione del batch di scrittura sia 10.000 per impostazione predefinita, questo è il motivo per cui è rimasto bloccato a 70.000 e non a 76560.

+0

questo è ottimo, ma come diavolo ci sei riuscito ?! – m1nkeh

+2

Ho dovuto eseguire manualmente la scansione dei miei file di dati dalla riga 70.000 alla ricerca di eventuali problemi! Fortunatamente il valore vuoto/nullo si è distinto: p Ho elaborato in seguito che è possibile modificare la dimensione del batch, ad es. a 100, il che significa che si bloccherà su un numero di riga che è al massimo a 100 righe dal problema –

Problemi correlati