W poprzednich artykułach omówiłem czym jest proces ETL oraz zaprezentowałem usługę Azure Data Factory, która jest narzędziem do budowania tego procesu. Dzisiaj natomiast zaprezentuję w jaki sposób można wykorzystać ADF do ładowania hurtowni danych. Dla przykładu utworzę prosty proces ETL, wykorzystując podstawowe elementy Azure Data Factory V2.
Środowisko developerskie
Do zbudowania procesu ETL niezbędna będzie oczywiście subskrypcja Azure. Druga sprawa to źródło danych – w tym przypadku wykorzystamy Azure SQL Database z domyślnie utworzoną bazą AdventureWorksLT. Miejscem docelowym ładowania danych będzie tabela w usłudze Azure SQL Data Warehouse. W przypadku kiedy byłaby konieczność przenoszenia danych między środowiskami On Premises (czyli na przykład między maszynami wirtualnymi albo maszynami w sieciach lokalnych, które nie są w infrastrukturze Azure), konieczna będzie instalacja Integration Runtime, o której pisałem ostatnio.
Azure Data Factory – ładowanie hurtowni danych
Jako że posiadamy już wiedzę teoretyczną (a jeśli nie, to zachęcam do przeczytania poprzedniego artykułu), to możemy zaczynać.
1. Pierwszą czynnością, jaką powinniśmy wykonać, jest utworzenie instancji usługi Azure Data Factory.

2. Następnie konfigurujemy usługę. Przy tym kroku należy pamiętać, że nazwa musi być globalnie unikatowa. Nie zaznaczamy też opcji Enable GIT, ponieważ w tym przykładzie nie będziemy wersjonować rozwiązania (gdybyśmy jednak chcieli to zrobić – nie ma problemu). Po podłączeniu się do repozytorium zmiany odkładają się w nim niemal niezauważalnie. Pamiętajmy, aby wybrać opcję V2 (Przypominam, że V1 nie umożliwia graficznej edycji procesu).

3. Po utworzeniu instancji możemy rozpocząć budowanie procesu transferu danych. W tym celu musimy otworzyć zasób i wybrać opcję Author & Monitor.

4.Teraz zostajemy przekierowani do usługi Azure Data Factory. Aby rozpocząć pracę należy kliknąć na opcję edycji.

5. Po przełączeniu otrzymujemy poniższy widok:

6. Kolejnym krokiem jest utworzenie Linked Service’u do bazy danych i do hurtowni. Jest to nic innego jak utworzenie połączenia do obu baz.

7. Konfigurację Linked Service’u zaprezentowałem na obrazku poniżej. To, na co należy zwrócić uwagę, to infrastruktura Integration Runtime, którą w tym kroku należy utworzyć (w rozwijanym pasku wystarczy wybrać opcję New). Druga istotna kwestia to sposób podłączenia się do bazy. Na potrzeby tego przykładu możemy bezpośrednio wpisać hasło administratora, ale nie jest to dobra praktyka. W normalnej sytuacji powinniśmy skorzystać z usługi KeyValut.

8. Kiedy mamy już do dyspozycji dwa połączenia, powinniśmy utworzyć Datasety, czyli swego rodzaju podłączenie do tabeli źródła i destynacji.

9. Konfiguracja przykładowego Datasetu wygląda następująco:
- W zakładce General należy wpisać nazwę – w tym przypadku będzie to nazwa tabeli źródłowej.

- Zakładka Connection – w niej należy wybrać tabelę, z której zostaną pobrane/załadowane dane.

- Schema – tu konfigurowany jest schemat tabeli. Po kliknięciu na opcję Import schema, schemat (łącznie z typami danych) zostaje zaimportowany.

- Parameters – ta zakładka nie będzie wykorzystywana w przykładzie.
10. Kolejnym krokiem jest utworzenie Pipeline’u, czyli procesu transferującego dane z bazy do hurtowni. Do tego wykorzystamy aktywność Copy Activity.


11. Teraz musimy wskazać źródło – w tym przykładzie jest to tabela SalesOrderDetail. Źródłem może być także zapytanie lub procedura składowana.

12. Następnie wskazujemy destynację (Sink). Zaznaczenie opcji Polybase jest możliwe w przypadku, gdy posiadamy konto magazynu (Storage Account), które jest niezbędne do wykonania tej operacji. Warto dodać, że opcja ta może znacznie przyspieszyć ładowanie danych.

13. W kolejnym kroku powinniśmy sprawdzić mapowanie – głównie chodzi tu o typy danych. W przypadku kiedy są niezgodne – otrzymamy błąd.

14. Następnie konfigurujemy opcje wydajności – w tym przykładzie wykorzystamy ustawienia domyślne. Aby Polybase zadziałała prawidłowo należy włączyć opcję Stage i wskazać konto magazynu.

15. Teraz uruchamiamy proces w trybie debugowania.

W trakcie dostajemy informacje o postępie procesu:

A także o jego zakończeniu:

Status Succeeded informuje nas o tym, że dane zostały pomyślnie załadowane! Gdyby zaistniała potrzeba uruchamiania procesu o określonej godzinie, konieczne będzie utworzenie wyzwalacza – taki proces opisywałem w poprzednim artykule – dodać link.
Dla zainteresowanych
Tak wygląda przykładowy plik JSON pipeline’u:
"name": "pipeline1",
"properties": {
"activities": [
{
"name": "Copy Data1",
"type": "Copy",
"policy": {
"timeout": "7.00:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": false
},
"typeProperties": {
"source": {
"type": "SqlSource"
},
"sink": {
"type": "SqlSink",
"writeBatchSize": 10000
},
"enableStaging": false,
"translator": {
"type": "TabularTranslator",
"columnMappings": {
"AddressID": "AddressID",
"AddressLine1": "AddressLine1",
"AddressLine2": "AddressLine2",
"City": "City",
"StateProvince": "StateProvince",
"CountryRegion": "CountryRegion",
"PostalCode": "PostalCode",
"rowguid": "rowguid",
"ModifiedDate": "ModifiedDate"
}
}
},
"inputs": [
{
"referenceName": "AzureSqlTable1",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "AzureSqlTable2",
"type": "DatasetReference"
}
]
}
]
}
}
Słowo na zakończenie
Jak widać – transfer danych między dwoma źródłami jest dosyć prostym zadaniem. Oczywiście sprawa komplikuje się w przypadku, gdy dochodzą jakieś wymagania biznesowe. Niemniej, chciałem zainteresować tematyką Data Factory i zachęcić do stosowania tej usługi w projektach. Mam nadzieję, że ten artykuł zachęci do korzystania z tego narzędzia w przypadku nowych projektów opartych o Azure.