SSIS i BLOB w Azure

Jak załadować plik(i) z serwera do chmury używając SSIS? Niby proste – wystarczy ściągnąć Azure Feature Pack klikając link na stronie z dokumentacją. Do wyboru mamy wtedy Azure Blob Upload Task i wykorzystywane przez niego Azure Storage Connection Manager. Tylko jak to poustawiać? Dokumentacja jest dosyć oszczędna i niewiele wynika np. z wpisu „Specify values for the Storage account name and Account key field” – to znaczy które elementy mam wpisać?

Zanim wszystko skonfigurujemy jedna uwaga – przy instalacji Azure Feature Pack jest mowa o posiadaniu SSIS w wersji SQL Server 2014 lub 2016 (jest też wersja dla 2012) – ale okazuje się, że działa równie dobrze na samych SQL Server Data Tools. Przynajmniej wysyłka plików do Azure Blob Storage. Testowane na:

  • Visual Studio 2015 Community + SSDT w wersji beta dla SQL Server 2016 + Azure Feature Pack dla SQL Server 2016
  • SSDT w wersji beta dla SQL Server 2016 (wersja samodzielna) + Azure Feature Pack dla SQL Server 2016 + SSIS dla SQL Server 2016 RC3 (wszystko na maszynie wirtualnej)

OK, zaczynamy. Na początek tworzymy manager połączenia do Azure. Zakładam, że projekt SSIS już istnieje, to standardowo prawym przyciskiem myszy na Connection Managers a potem New Connection Manager. Pojawiają się dwie nowe opcje: Azure StorageAzure Subscription. Wybieramy to pierwsze.

ConnectionManager

Pojawia się okno do wpisania parametrów połączenia do storage na Azure (jak to zgrabnie przetłumaczyć na język polski – konto magazynu w usłudze Azure?). Czyli pierwszy schodek. Żeby zobaczyć co trzeba wpisać logujemy się do konta Azure – przyjmijmy, że będzie to wejście przez Portal choć to samo zobaczymy z poziomu WindowsAzure. W portalu przechodzimy do swojego konta magazynu i – jeśli się automatycznie nie pokażą – wybieramy ustawienia przez przyciśnięcie Wszystkie ustawienia. Tam klikamy w sekcję Klucze lub na stronie opisującej nasz magazyn wybieramy ikonę klucza.

StoragePath

W kluczach mamy dwie informacje, które musimy użyć w managerze połączeń: Nazwa konta magazynu (czyli to, co już wiemy – ale tam od razu łatwo skopiować) oraz Podstawowy klucz dostępu.

Keys

Kopiujemy i wklejamy je odpowiednio do pól Storage account nameAccount key managera połączeń do Azure.

ConnectionManagerAzure

Zostawiam zaznaczone domyślnie HTTPS i testuję połączenie – powinno działać bez problemu (także z odznaczonym HTTPS). Jest jeszcze druga opcja – użycie lokalnego konta developera, ale tutaj to zostawimy. Ogólnie – wymagane jest Azure SDK i emulator Azure Storage.

To teraz pora na wysyłkę plików. Przeciągamy do Control Flow pakietu kontrolkę Azure Blob Upload Task i konfigurujemy.

AzureBlobUploadTask

Connection manager to naturalnie skonfigurowany przed momentem manager połączeń. Sekcja Destination to miejsce, gdzie mają trafić pliki. Nie wrzucamy ich po prostu do magazynu – do przechowywania plików służą kontenery (containers), w ramach których mogą istnieć wirtualne katalogi. W polu BlobContainer podajemy nazwę kontenera, do którego wrzucamy dane (jeśli nie istnieje, to zostanie utworzony), a do BlobDirectory nazwę wirtualnego katalogu, do którego mają trafić pliki. Katalog jest opcjonalny i także zostanie utworzony jeśli nie istnieje.

Opis pola BlobDirectory mówi o katalogu na pliki przechowywanych jako block blob. Usługa Blob w Azure oferuje trzy typy blobów: block blobs, append blobspage blobs.

BlobDirectory

Dokładny opis można rzecz jasna znaleźć w dokumentacji, i wstępie do Azure Storage – ale z grubsza chodzi o to: block blob to podstawowy sposób przechowywania danych – do wrzucania plików ot tak, append blob to zawsze dodawanie nowego bloku do końca bloba (wygodne np. dla logów), a page blob służy do prezentowania np. dysków dla maszyn wirtualnych. W dużym skrócie, uproszczeniu i tłumaczeniu po łebkach. Dla nas istotny jest fakt, że wrzucamy block blob.

W sekcji Source podajemy katalog, w którym są pliki do wrzucenia do Azure, a Source Filter to filtrowanie zawartości do wypchnięcia – po masce pliku (FileName) i dacie modyfikacji (TimeRangeFrom, TimeRangeTo).

I gotowe. I działa. Prawie.

Co jeśli nie działa (w moim przypadku nie zadziałało)? Może pojawić się taki wyjątek:

[Azure Blob Upload Task] Error: Upload task has stopped with exception: Nie można załadować pliku lub zestawu ‚Microsoft.Data.Services.Client, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ lub jednej z jego zależności. Nie można odnaleźć określonego pliku.

Nie znalazłem rozwiązania poza propozycją zarejestrowania Microsoft.Data.Services.Client w Global Assembly Cache Trenowaliśmy to przy kontrolce SSIS, to nie będzie problemu. Uruchamiamy cmd.exe jako administrator, przechodzimy do katalogu z gacutil.exe – u mnie C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools i rejestrujemy bibliotekę. Znajdziemy ją w katalogu C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Extensions\Common:

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools>gacutil /i "C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Extensions\Common\Microsoft.Data.Services.Client.dll"

Potem restart Visual Studio i ponowne uruchomienie powinno dać wyniki. Chyba, że próbowaliśmy – tak jak ja – wrzucać plik o zerowej długości. Wówczas kontener i katalog się tworzyły, ale plik nie przechodził. Nie znalazłem z czym jest to związane – na razie przyjmuję, że SSIS wrzuca tylko pliki o długości większej niż zero bajtów.

Na koniec jeszcze jak sprawdzić, czy pliki faktycznie trafiły do magazynu. Ponownie zaglądamy do informacji o koncie i naciskamy przycisk Obiekty Blob.

CheckBlob1

Otworzy się dodatkowy panel z informacją o kontenerach. Zawartość kontenera przeglądamy klikając na jego nazwę.

CheckBlob2

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s