Tworzymy pierwszy potok i przepływ w Apache Hop

Z artykułu Pierwsze kroki w Apache Hop dowiedziałe(a)ś się podstaw o Apache Hop i jak zaprojektowane jest środowisko tego ETL. W tym artykule dowiesz się jak stworzyć pierwszy potok i jak wykorzystać go w przepływie pracy.

Budujemy potok

Zbudujemy bardzo proste zadanie w ETL które otworzy plik, dokona odpowiednich zmian, zapisze zmienione dane i przekopiuje plik do docelowego katalogu. Zadanie jest trywialne ale tworząc je, będziesz mieć okazję do zapoznania się z programem. To powzwoli Ci zrozumieć na czym polega budowanie projektów w Apache Hop.

Potok to ciąg zadań. W naszym przypadku otworzy plik, zmieni dane, zapisze zmienione dane do pliku. Trzy różne zadania, nazwane w Hop transformacjami połączone przeskokami. W Hop organizujemy nasze prace w projekty a każdy z projektów ma swoje środowisko pracy. Projekt jest kontenerem wskazującym na konkretny katalog na dysku w którym będą nasze potoki i przepływy (o przepływach później).

Tworzymy projekt i środowisko projektu

Uruchamiamy GUI naszego ETL poprzez wykonanie pliku 'hop-gui.bat' w Windows lub 'hop-gui.sh' w Linux. Po otwarciu programu po prawej stronie pola z nazwą projektu masz ikonę 'p+'. Kliknij ją by utworzyć nowy projekt.

Wpisz nazwę projektu, tutaj mamy "Testowy projekt", i wskaż gdzie znajdować się będzie folder projektu. Kliknij OK. Mamy utworzony projekt. Następnym zadaniem jest utworzenie środowiska. Środowisko zawiera ustawienia które będą wykorzystywane przez nasze potoki i przepływy pracy. Np. połączenie do bazy danych. Dzięki temu zmieniając środowisko z którego korzystasz w danym przepływie czy potoku, łączysz się do różnych baz danych bez konieczności przepisywania transformacji. Używasz tego min. do łączenia się ze środowiskiem testowym lub produkcyjnym. Możesz też szybciej zbudować nowy potok bez konieczności ponownej definicji bazy danych.

Tworzymy potok - szczegóły

Jak napisane wyżej, potok to ciąg zadań. Utwórz nowy potok klikając na ikone '+' na pasku, tuż pod menu 'File'. W otwartym oknie wybierz 'Pipeline' z obszaru zaznaczonego czerwoną ramką:

W obszarze roboczym nowego przepływu pojawi się informacja 'Left click or tap anywhere to start.'. A więc kliknij lewym przyciskiem myszki gdziekolwiek w tym obszarze. Na ekranie pojawi się nowe okno zatytułowane 'Select the action to execute or transform to create'. Chcemy dodać pierwszą transformację do naszego przepływu która otworzy plik. Jak widzisz transformacje wyświetlają się domyślnie wg kategorii.

Możesz więc przewijać okno albo, prościej, wiedząc czego szukamy, wpisać nazwę lub część nazwy transformacji do okna wyszukiwania. Interesuje nas transformacja 'Text file input' z kategorii 'Input'. Klikamy na ikonę - tranformacja została dodana do naszego przepływu.

W tym momencie musimy wskazać na plik który ta transformacja otworzy. Utwórzmy prosty plik tekstowy o zawartości:

country;population;size
Poland;38000000;m
Germany;83000000;l
Hungary;8000000;s
Czechia;11000000;s
Netherlands;17000000;m
Spain;47000000;l

I zapiszmy ten plik w katalogu projektu i podkatalogu nazwanego 'in'. Dobrym pomysłem jest klasyfikacja danych wejściowych, katalog 'in', i danych wyjściowych, katalog 'out'. Mając ten plik w odpowiednim miejscu, kliknij na podpis transformacji w naszym potoku - kliknij na etykietę 'Text file input'. Otworzy się okno z ustawieniami tej transformacji:

Pod przyciskiem 'Browse...' masz wyszukiwanie pliku. Wybierz plik i, ważne, kliknij na przycisk 'Add' by dodać plik do okna 'Selected files:'. Częsty błąd początkujących użytkowników tego ETL to tylko wybranie pliku bez dodania ich do listy. Jak widzisz, link do pliku ma postać ${PROJECT_HOME}/in/countries.txt Zmienna '${PROJECT_HOME}' wskazuje na katalog w którym znajduje się Twój przepływ. W ten sposób po przeniesieniu projektu na inny komputer, nie musisz na nowo definiować linku do pliku. Zdarzyć się może ze po tak utworzonym automatycznie linku Hop nie zobaczy tego katalogu. Upewnij się że projekt został zapisany po wskazaniu na katalog projektu a jeśli nadal będą problemy, zapisz potok do pliku i uruchom ponownie Hop.

OK, po wskazaniu na plik przejdź do zakładki 'Fields' i kliknij na 'Get fields'. Hop automatycznie rozpozna etykiety nagłówków i typy danych i wstawi ich definicje. W każdym momencie możesz to zrobić ręcznie. Jeśli Twój plik ma inne separatory lub zakończenia linii, wejdź do zakładki 'Content' by dokonać odpowiednich ustawień.

Następna transformacja w naszym potoku będzie zamieniać jedno z pól - kolumnę 'size'. Jeśli jest 'l', zmień na 'large'. Jeśli 'm', zmień na 'medium'. Jeśli 's', zmień na 'small'. Dodaj transformację w ten sam sposób jak poprzednią. Będzie to transformacja 'Replace in string'. Umieść ją obok pierwszej, na prawo ekranu. Następnie połącz je przeskokiem (hop'em). Trzymając wciśnięty Shift, kliknij na pierwszej transformacji i dociągnij rysowaną linie na drugą transformację. Transformacje są ze sobą połączone. Następnie wejdź do właściwości transformacji klikając na jej nazwie i zdefiniuj co ma być zastąpione czym:

 

Zapisz swoją prace i uruchom potok klikając na strzałkę w lewym roku okna potoku, tuż pod jego nazwą. Przed finalnym uruchomieniem pojawi się okno w którym możesz wybrać parametry uruchomienia, np. określasz poziom logowania - domyślnie 'Basic'. Potwierdź uruchomienie klikając na 'Launch'.

Wynikiem uruchomienia jest log w dolnej części ekranu pokazujący min. ilość wierszy, czas trwania każdej transformacji i status wykonania. Jeśli chcesz podejrzeć wiersze w każdej z transformacji, klikasz na małą ikonę tabeli przy każdej z ikon transformacji.

 

Jak widzisz, dane w kolumnie 'size' zostały poprawnie zmienione. Ostatnią transformacją w naszym potoku jest 'Text file output'. Ta transformacja zapisze dane do nowego pliku. Plik, np. o nazwie 'rezultat.txt' zapisujemy w katalogu 'out' naszego projektu.

OK, mamy potok. Przejdźmy do zbudowania przepływu pracy.

Budujemy przepływ pracy

Przepływy pracy (Workflows) łączą wiele potoków w jedno zadanie lub są miksem potoków i akcji. My chcemy połączyć potok z akcją przenoszącą plik do innego katalogu. Klikamy na ikonę '+' i wybieramy w oknie które się pojawi 'Workflow'. W nowo-otwartej przestrzeni roboczej przepływu pracy pojawi się domyślnie pierwszy element; akcja o nazwie 'Start'.

Umieszczamy akcję 'Potok'

Klikamy, tak jak dodawaliśmy transformacje w potoku, lewym przyciskiem myszy w obszarze roboczym i z menu wybieramy 'Pipeline' (potok).

Łączymy przeskokiem element 'Start' z 'Pipeline'. By lepiej orientować się czym jest Twój potok ukrywający się pod ikoną 'Pipeline', zmień opis tej ikony. Klikamy następnie na etykietę akcji i używając przycisku 'Browse' wybieramy nasz potok z katalogu naszego projektu. Hop zaproponuje Ci zmianę opisu tej akcji.

Dodajemy akcję 'Move files'

Dodajemy kolejną akcję która nazywa się 'Move files' i łączymy ją z poprzednią która uruchamia nasz potok który stworzyliśmy wcześniej. W zakładce 'General' i oknie 'Files/Folders' wpisujemy katalog źródłowy i docelowy. Zauważ że mamy duży wpływ które pliki i katalogi możemy przesuwać - ustawiając odpowiednie filtry. Dodatkowe parametry ustawiasz w zakładce 'Destination file'.

Ostatnią akcją w przepływie pracy powinna być akcja 'Success'.

Ustawienia przeskoków

Zauważ że domyślnie przeskok między akcją wykonującą nasz potok a następną akcją przenoszącą plik do innego katalogu ma kolor zielony. Jeśli klikniesz lewym przyciskiem myszy na to połączenie, otworzy się okno gdzie możesz zadecydować czy ten przeskok ma być włączony, wyłączony a jako typ routingu czy jest to przeskok 'Failure' czy 'Success' lub 'Unconditional'.

Włączony oznacza że po wykonaniu poprzedniej akcji rozpocznie się następna. Wyłączając możesz kontrolować że wykona się tylko część akcji (przydatne np. przy testowaniu). 'Unconditional' to brak warunku; następna akcja wykona się niezależnie czy poprzednia zakończyła się sukcesem czy niepowodzeniem. 'Success' oznacza że następna akcja wykona się tylko jeśli poprzednia była sukcesem. 'Failure' jest przeciwieństwem. Dzięki temu możesz sterować przepływem danych w Twoich przepływach pracy - od jednej akcji może odchodzić wiecej niż jeden przeskok.

OK, mamy to! Dzięki temu prostemu potokowi i przepływowi pracy nauczyłe(a)ś się pracy z Apache Hop.