• Ogólne
  • Dla Architektów
  • Bezpieczeństwo

Wiosenne porządki z AWS Glue

11 maja 2018Piotr PietrzkiewiczDla Architektów

Ciężko dziś zaprzeczyć, że analiza danych stanowi podstawę w rozwoju każdej firmy. W dobie „Przemysłu 4.0”  gromadzenie danych stało się czymś bardzo powszechnym. Mogę wręcz śmiało powiedzieć, że wielu z nas popadło w masowe „zbieractwo”.

Jakie dane mam na myśli ? Każdego typu! Jeśli na chwilę się zastanowić to magazynujemy wszystko – kliknięcia, logi, dane personalne, transakcje, zapisy audio z naszej centrali telefonicznej, nagrania z video rejestratorów, metryki z taśm produkcyjnych, czy średnią prędkość naszego pojazdu. Popatrzmy bliżej naszego biurka a znajdziemy tam stosy ulubionych witryn internetowych, arkusze z wydatkami, przepisy kulinarne, listę ocenionych filmów czy playlisty muzyczne.

Zdarza się, że firmy doskonale wiedzą w jakim celu zbierają dane. To na podstawie takich danych podejmowane są decyzje, inwestycje, przesunięcia funduszy, rozpoczynają się nowe projekty, pojawiają się predykcje i sugestie. Dane mają wielką wartość, nie tylko dla tych firm ale też i na rynku poza – w handlu, reklamie i branżach produkcyjnych.

Jeśli natomiast nasza firma zbiera dane bez konkretnego celu, bo „w przyszłości może się przydać” czy bo „tak mówi prawo” zaczynamy w konsekwencji zauważać stosy plików, tabel, baz i X-bajtów które zdecydowanie nabijają nam koszty. Nie wiemy czy wszystko jest potrzebne i co z tym można zrobić. A co jeśli nasz „firmowy zbieracz”, który w głowie miał schemat  tego co jest zbierane gdzie i „po co” odejdzie z pracy? Wyobraźcie sobie terabajty nieopisanych logów, arkuszy, czy małych baz danych. Koszmar!

Dorzućmy jeszcze garść innych typowych sytuacji:

  • kończąca się przestrzeń dyskowa,
  • brak mocy obliczeniowej,
  • dane o niejednolitych schematach zapisane w różnych formatach,
  • brudne dane, które nas nie interesują a płacimy za składowanie,
  • rozproszone środowisko, które trudno zintegrować pod analitykę.

Każde z wymienionych niesie ze sobą jakieś konsekwencje o których raczej nie muszę tu się rozpisywać. Natomiast podkreślić muszę jedno, jeżeli kiedykolwiek mówimy o jakichś konsekwencjach w rozumieniu IT, rozumiemy to zwykle jako koszt.

Mając ten smutny wniosek z tyłu głowy, spójrzmy na to co mamy. Nasze dane – jest ich dużo i są różne. Nie wiemy co jest gdzie, a przeklikiwanie każdego pliku czy bazy nie jest raczej opłacalne. Nasz przełożony zdecydował, że trzeba się spiąć i poddać to wszystko analityce. Integracja tych danych, opisywanie (katalogowanie w zrozumieniu co mamy), czy też proces oczyszczania lub transformacja przed końcową analityką (Extract, Transform and Load, w skrócie ETL) jest czasochłonna, mamy pliki CSV, Parquet, 6 baz MySQL, logi Apache i bazę Oracle, brakuje miejsca, szef czeka, robi się gorąco.

Plan jest taki:

Zaczniemy od ustalenia co właściwie mamy i gdzie. Kiedy już to wiemy, warto to wszystko uporządkować, usunąć artefakty, przekształcić i wrzucić do hurtowni danych, gdzie nasz szef już wyklika sobie to co potrzebne korzystając z swojego ulubionego narzędzia BI.

Czy da się to zrobić jedną usługą, co by oszczędzić sobie nerwów i czasu?

Tak, odpowiedzią na te pytanie jak i rozwiązaniem dla części wymienionych wcześniej problemów jest zbudowana na fundamentach open source`owyh technologii Apache Spark i Hive Metastore usługa AWS Glue.

AWS Glue to usługa bezserwerowa, nie zarządzamy tutaj flotą serwerów która wykonuje operacje w imieniu tej usługi, nie ma wirtualnych maszyn do których możemy się podłączyć za pomocą SSH czy RDP. Zamiast tego konfigurujemy poszczególne elementy platformy, które wykonywać dla nas będą konkretne zadania. Kiedy zadania nie są wykonywane, nie płacimy za moc obliczeniową (moc liczona jest w jednostce PDU. 1 PDU = 4vCPU i 16GB ram) a jedynie za zmagazynowane wcześniej obiekty (bazę danych i tabele).

Co zatem potrafi AWS Glue?

By odpowiedzieć na te pytanie rozpiszę AWS Glue na dwa duże komponenty wewnątrz których mamy mniejsze elementy.

Te dwa komponenty to:

  • Data Catalog
  • ETL

W ramach Data Catalog możemy zajrzeć do struktury skatalogowanych danych (dane są katalogowane w postacie tabel), poznać schemat, SerDe, typ danych w kolumnach, dodać deskrypcję, dodać więcej metadanych czy też zmienić obecne. Data Catalog integruje się z usługami AWS tj. Amazon Athena, Amazon RedShift, RedShift Spectrum, Amazon EMR jak i Amazon RDS. Jeśli inna aplikacja czy też serwis jest kompatybilny z Apache Hive Metastore to znaczy, że może współpracować z Data Catalog.

Jednym z niezwykle istotnych elementów Data Catalog jest program zwany Crawler. Crawler jest aplikacją działającą w obrębie naszej chmury AWS  (nie jest w stanie wykonywać działań na naszych serwerach fizycznych).

Po stronie użytkownika jest skonfigurowanie połączenia (Connection) do źródła który chcielibyśmy skatalogować.

Crawler w obecnej konfiguracji może przeskanować dane w Amazon S3, albo wykorzystać bibliotekę JDBC by połączyć się z naszym źródłem.

Dzięki dobrodziejstwom sterownika JDBC możemy połączyć się z źródłami tj:

  • Amazon RedShift (także RedShift Spectrum)
  • Amazon RDS
  • Amazon Aurora
  • MariaDB
  • Microsoft SQL Server
  • MySQL
  • Oracle
  • PostgreSQL

Wyżej wymienione bazy mogą być również skatalogowane jeśli są hostowane na instancjach Amazon EC2.

Wspomniane wcześniej Connections to informacje o połączeniu JDBC, które wykorzystywane są przez Crawler by wiedzieć w jakim VPC jest cel skanowania, jakie jest JDBC URL i jakich poświadczeń ma użyć.

Kolejnym dużym komponentem jest ETL.

To tutaj tworzymy Joby napisane w Python lub Scala za pomocą których dokonamy naszych transformacji. Jeśli nie radzimy sobie z pisaniem skryptów, AWS Glue zasugeruje kod który możemy w łatwy sposób przetworzyć dla naszych potrzeb. W ramach operacji ETL możemy np. dokonać konwersji formatów, zmienić schemat tabel, przetworzyć czy usunąć dane, stworzyć nowe tabele w zupełnie innym miejscu.

Komponent ETL nie żyje jednak samym kodem. W ramach tej kategorii, możemy skonfigurować ciąg operacji (pipeline) uruchamianych jedna po drugiej poprzez zdarzenia (Eventy jak np. statusy Job`ów), zaplanować wywołania w kalendarzu za pomocą CRON, czy po prostu odpalić nasz Job na żądanie.

To nadal nie wszystko. W sekcji ETL możemy stworzyć endpoint (URL) łączący nasze środowisko AWS Glue z IDE (Zeppelin, JetBrain, AWS Cloud9, SSH Python, SSH Scala) by wywoływać czy testować kod nad którym pracowaliśmy zdalnie. Jeżeli nie mamy swojego IDE, możemy w łatwy sposób stworzyć Zeppelin Notebook, który automatycznie połączy się z naszym endpoint’em.

W tej części naszego cyklu skupimy się na Database Catalog, postaram się na przykładach pokazać jak możemy zacząć katalogowanie naszych danych by w kolejnej części cyklu poddać je operacjom ETL i końcowej analityce.

By nadać naszym operacjom trochę realniejszy kształt zasymuluje przykładową infrastrukturę złożoną z serwera MS SQL, Amazon S3, hurtowni danych Amazon RedShift i AWS Glue.

Po krótce:

  • -Amazon S3 sprosta wszystkim wymaganiom dotyczącym przestrzeni dyskowej (Data Lake).
  • AWS Glue skataloguje i przetworzy nam nasze dane tak by były gotowe do analityki a jednocześnie zapewni wymaganą moc obliczeniową.
  • Amazon RedShift dokona końcowej analityki na już przygotowanych danych (Data Warehouse i BI).

W swoim laboratorium użyłem dwóch źródeł:

  • Baza MS SQL hostowana na Amazon EC2 (przykładowa baza z danymi do pobrania)
  • Strona z przykładowymi danymi w CSV

Stworzenie Roli dla AWS Glue

Gdy wywołujemy operację w ramach którejś z usług AWS ta usługa w naszym imieniu tworzy zasoby. Np. gdy tworzymy Crawlera, ten na naszym koncie tworzy Elastic Network Interface by podłączyć się do naszych źródeł. Gdy dokonujemy konwersji formatu pliku za pomocą ETL i chcemy przetworzony plik zachować na S3 to AWS Glue w naszym imieniu wykonuje PUT do Amazon S3 bucket.

By umożliwić taką automatyzację, musimy nadać naszemu serwisowi wymagane uprawnienia. Jeżeli wymienione operacje wykonuje manualnie użytkownik, to korzysta on z IAM Account do którego przypisana jest IAM policy z uprawnieniami oraz poświadczenia. W przypadku użytkownika by dokonać operacji zwykle gdzieś trzeba wprowadzić poświadczenia (logowanie do konsoli AWS, czy poświadczanie kluczem w AWS SDK czy AWS CLI), w przypadku usługi nie ma możliwości wprowadzenia poświadczeń. W związku z tym tworzona jest IAM Rola, a usłudze nadawane są uprawnienia do utożsamiania się z daną rolą – automatycznie, bez wprowadzania poświadczeń. Nie jest tak że IAM Rola nie używa poświadczeń do uwierzytelniania, byłoby to bardzo niebezpieczne. IAM Rola używa tymczasowych poświadczeń, które zmieniają się w cyklach. Uwierzytelnianie usługi i zmiana dzieje się poza naszymi oczami.

By stworzyć IAM Rolę dla AWS Glue:

  • W konsoli AWS otwieramy usługę Identity & Access Management (IAM).
  • Z menu po lewej stronie wybieramy Policies i klikamy na Create Policy.
  • Zmieniamy okienko z „Visual Editor” na Json i wklejamy poniższy kod:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "Glue:*",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:GetBucketAcl",
                "ec2:DescribeVpcEndpoints",
                "ec2:DescribeRouteTables",
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",				
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcAttribute",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetRolePolicy"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket"
            ],
            "Resource": [
                "arn:aws:s3:::aws-glue-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"				
            ],
            "Resource": [
                "arn:aws:s3:::aws-glue-*/*",
                "arn:aws:s3:::*/*aws-glue-*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::crawler-public*",
                "arn:aws:s3:::aws-glue-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:/aws-glue/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "aws-glue-service-resource"
                    ]
                }
            },
            "Resource": [
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:instance/*"
            ]
        }
    ]
}

Polisa ta pozwala usłudze AWS Glue min. na stworzenie bucketu w Amazon S3, jak i stworzenie Elastycznych Interfejsów Sieciowych (ENI).

  • Klikamy na Review Policy i zapisujemy nasz dokument pod nazwą „AWS_Glue_Service”, klikamy na Create Policy i czekamy na zakończenie operacji. Skoro mamy już polisę, to teraz musimy utworzyć rolę usługi.
  • Z pionowego menu po lewej stronie wybieramy Roles i klikamy na Create Role.
  • Z opcji wybieramy AWS Service i poniżej Glue, klikamy w Next:Permissions.
  • Z listy polis wybieramy stworzoną wcześniej „AWS_Glue_Service”.
  • Nazywamy rolę „AWS_Glue” i potwierdzamy stworzenie roli.

Skatalogowanie danych z MS SQL

Uprawnienia są już gotowe, więc możemy otworzyć konsolę AWS Glue.

Pierwszym krokiem będzie stworzenie połączenia do naszej bazy MS SQL.

  • Z menu „Data Catalog” wybieramy Connections.
  • Klikamy na Add connection. Wprowadzamy nazwę naszego połączenia, typ połącznia (w przypadku MS SQL jest to JDBC) i opcjonalny opis.
  • W następnym okienku konfigurujemy JDBC URL, użytkownika i hasło jakie zostanie użyte by połączyć się z źródłem i wybieramy VPC w którym jest nasz zasób, po wybraniu VPC pojawi się nowe okienko w którym będziemy mogli wybrać Security Groupy jakie zostaną połączone z Elastycznym Interfejsem który zostanie stworzony w wskazanym VPC. Reguły zawarte w Security Group powinny umożliwiać komunikacje z naszym celem (w tym przypadku port 1433 TCP) i komunikacje z samym sobą (najlepiej stworzyć dedykowaną Security Group dla AWS Glue i w zasadach dodać wszystkie porty TCP z źródła Security Group ID tej grupy).
  • Klikamy Next i zamykamy wizard.
  • W tej chwili nasze połączenie powinno zostać wyświetlone na liście. Możemy je zaznaczyć i kliknąć w Test connection. By potwierdzić test, należy wskazać IAM Rolę, którą wcześniej utworzyliśmy („AWS_Glue_Service”). W VPC gdzie jest nasza baza zostanie utworzony interfejs sieciowy z którego zostanie wywołane połączenie o zdefiniowanych parametrach. Jeśli test się nie powiedzie to znaczy, że ruch sieciowy nie jest możliwy (zajrzyj do Route Table, Security Group), albo parametry połączenia JDBC są błędne. Szczegóły dotyczące problemów z połączeniem można zobaczyć w Logach AWS Glue wew. usługi Amazon Cloudwatch.

Jeśli test się powiódł, to należy teraz skonfigurować pierwszego Crawlera.

  • Z pionowego menu wybieramy Crawlers i klikamy Add Crawler.
  • Podajemy nazwę dla naszego Crawlera i ewentualnie wybieramy klasyfikatory (Classifier), które wcześniej stworzyliśmy. To na podstawie klasyfikatora dobierany jest schemat i typy danych w naszych źródłach.

AWS Glue w tej chwili dostarcza domyślnie 21 klasyfikatorów dla najpopularniejszych źródeł danych jak CSV, Paquet, MySQL, SQL, Oracle, XML, JSON itd. Prócz tego, potrafi zajrzeć do zarchiwizowanych plików w formacie: ZIP, BZIP, GZIP, LZ4, Snappy.

Klasyfikator jest sam w sobie zbiorem wyrażeń regularnych zapisanych w GROK, XML albo JSON.

  • W następnym okienku wskazujemy co ma zostać skatalogowane, jako że ja kataloguje bazę MS SQL to wybieram opcję JDBC i wskazuje połączenie („Connection”) skonfigurowane przed chwilą. W „Include path” podaje nazwę mojej bazy danych i wszystko co poniżej za pomocą znaku %.
  • W kolejnym okienku mogę zdecydować, czy chcę by ten Crawler przeszukał inne źródło. Zostawiam domyślne No.
  • Wybieramy IAM Rolę, którą będzie impersonować nasz Crawler.
  • Teraz musimy podać częstotliwość działania Crawlera:
    – na żądanie („On demand”)
    – wg Cron („Custom”)
    – w interwałach („Hourly”, „Daily”, „Weekly”, „Monthly”). Ja wybrałem On demand – co znaczy że wywołanie musimy wyklikać sami.

W następnym okienku wybieramy, gdzie chcemy zapisać zebrane metadane. Możemy wybrać już istniejąca bazę w Data Catalog, lub sworzyć nową „Add Database”.

  • Kliknij Add Database i podaj nazwę pod którą chcesz zapisać wyniki.
  • Kliknij Next i Finish.
  • Crawler którego właśnie stworzyliśmy powinien być widoczny na liścię, wybieramy go i klikamy Run Crawler.

Jeśli wszystko skonfigurowaliśmy poprawnie, to po kilku minutach powinniśmy widzieć nową w Databases.

  • Klikamy w skatalogowaną bazę by zobaczyć tabele pod spodem.

Każda z tabel zawiera swój własny zbiór metadanych.

Dla przykładu:

Z tego menu możemy również dokonać zmian metadanych (wykorzystane to zostanie w przypadku operacji ETL). Czy jest możliwość zobaczenia jakie dane są w kolumnach? Nie, AWS Glue nie replikuje faktycznych danych, cel to zbieranie informacji o danych.

Widoczna w prawym górnym rogu opcja „Version (Current Version)” pozwala nam na porównanie różnych wersji tabeli jeśli nastąpiły w niej jakieś zmiany. W przypadku gdy nasza tabela ma wiele wersji, uaktywnia się przycisk Compare versions po którego kliknięciu wyświetli nam się porównanie. Dla przykładu do tabeli sales_dbo_customer dodałem kolumnę „registration” o typie danych „Date”, następnie porównałem obie wersje tabeli:

Porównujemy wersję 0 z wersją 1 (Current version).

Jak widać, obecna wersja (Current version) zawiera dodatkową kolumnę, wraz z informacją (kolumna „Change”) jaka zmiana nastąpiła. Teraz dokonam kolejnych modyfikacji i po kliknięciu w Version (Current Version) wyświetli mi się lista wszystkich wersji tabeli jakie są zachowane w Data Catalog.

Nasz MS SQL został skatalogowany. Wiemy jaki jest schemat, znamy tabele i typy danych, wiemy jakich zmian dokonano. Czas na kolejne źródło!

Skatalogowanie danych z Amazon S3

Przy katalogowaniu danych z S3, nie potrzebujemy konfigurować połączenia („Connections”) tak jak poprzednio, AWS Glue użyje IAM Roli jako poświadczeń. Możemy od razu przejść do konfiguracji Crawlera.

  • Wybieramy opcję Crawlers i klikamy na Add crawler.
  • Podajemy nazwę:
  • Wskazujemy w jakim bucket trzymand są nasze dane. Dla porządku ja wykluczyłem folder „Outputs” ponieważ nie chcę by ten Crawler przeszukiwał mi folder w którym będę trzymał wyniki naszych operacji.
  • W kolejnych okienkach nie dodaję innego data store i wykorzystuje już istniejącą Rolę serwisu AWS Glue.
  • Operacja zostanie wykonana na żądanie (Run on demand).
  • Wyniki zapiszę w nowej bazie (Add database).
  • Po potwierdzeniu stworzenia Crawlera, odpalamy nowe zadanie z konsoli (wybieramy nowego Crawlera i klikamy w Run crawler).

Po zakończeniu programu, powinniśmy widzieć nową bazę w Data Catalog.

W związku z tym, że znaleziony plik był w formacie CSV, mamy jedną tabelę i zupełnie inny schemat.

W ten sposób skatalogowaliśmy dane zebrane na Amazon S3 w formacie CSV.

Po tych krokach powinniśmy już wiedzieć czym jest Data Catalog w AWS Glue. Nauczyliśmy się jak katalogować dane magazynowane na S3 i wykorzystywać bibliotekę JDBC by połączyć Crawler z bazami danych. Rozumiemy też jaka korzyść może płynąć z katalogowania naszych danych, umiemy zmieniać, porównywać i odkrywać co mamy w plikach i tabelach. Jest to pierwszy krok w kierunku wykonania zadania zleconego przez naszego przełożonego. Następnym krokiem będzie wykorzystanie Data Catalog i ETL by przygotować dane do analityki, ale to już w następnym artykule z cyklu „Wiosenne porządki z AWS Glue”.

: apache spark, Athena, aurora, aws glue, crawler, EC2, emr, etl, glue, hive metastore, jdbc, mariadb, microsoft sql server, mysql, oracle, pastgresql, rds, redshift, redshift spectrum
Piotr Pietrzkiewicz
Od dwóch lat pracuje w Amazon Web Services, gdzie obecnie pełni rolę architekt systemów IT na Polskę. Prawie 10 lat doświadczenia w branży. Przekonwertowany na AWS, były fanatyk chmury prywatnej. Miłośnik Calvin & Hobbes, kotów, kawy i gier platformowych z lat 90`tych.

Related Articles

Spotkanie z kuzynką Atheną, wujkiem DynamoDB (TTL) i ciotką Lambdą. Ze strony rodziny Amazon AWS

8 marca 2017Adam Smolnik

Budowanie prostego schedulera serwerów EC2

11 sierpnia 2017Tomasz Stachlewski

Wiosenne porządki z AWS Glue cz.3

4 września 2018Piotr Pietrzkiewicz

Najnowsze wpisy

  • Wiosenne porządki z AWS Glue cz.3 4 września 2018
  • Jak przyśpieszyć ładowanie zawartości stron WWW? 28 czerwca 2018
  • Wiosenne porządki z AWS Glue cz.2 22 czerwca 2018

Szkolenia AWS

  • Kursy wprowadzające
  • Dla Architektów
  • Dla Developerów
  • SysOps
  • DevOps
  • Big Data
  • Bezpieczeństwo

ACTION Centrum Edukacyjne

Znajdź nas na:

Facebook
LinkedIn
YouTube
RSS

Copyright by ACTION Centrum Edukacyjne Sp. z o.o.