SlideShare une entreprise Scribd logo
1  sur  52
Télécharger pour lire hors ligne
MARIUSZ RICHTSCHEID
GLIWICE, 23.02.2022
PIERWSZA WYCIECZKA NAD
JEZIORO (DANYCH)
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
O MNIE
‣ SOFTWARE ARCHITECT

W THE SOFTWARE HOUSE

‣ RICHTSCHEID@GMAIL.COM

‣ LINKEDIN.COM/IN/RICHTSCHEID

‣ GITHUB.COM/BAROGRAF
MARIUSZ RICHTSCHEID
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
AGENDA
‣ TROCHĘ TEORII

‣ PRZEGLĄD DOSTĘPNYCH SERWISÓW

‣ PRZYKŁADOWA ARCHITEKTURA

‣ OMÓWIENIE SERWISÓW PLUS PRZYKŁAD
IMPLEMENTACJI

‣ USZANOWANKO PODSUMOWANKO
CZYM JEST JEZIORO DANYCH WG
POLSKIEJ WIKIPEDII?
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
JEZIORO – NATURALNY ŚRÓDLĄDOWY ZBIORNIK WODNY,
KTÓREGO WYSTĘPOWANIE UWARUNKOWANE JEST
ISTNIENIEM ZAGŁĘBIENIA, W KTÓRYM MOGĄ GROMADZIĆ
SIĘ WODY POWIERZCHNIOWE, ORAZ ZASILANIEM
PRZEWYŻSZAJĄCYM STRATY WODY WSKUTEK
PAROWANIA LUB ODPŁYWU.
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
WG ANGIELSKIEJ WIKIPEDII
‣ SYSTEM LUB REPOZYTORIUM DANYCH PRZECHOWYWANYCH W NATURALNEJ,
NIEPRZETWORZONEJ FORMIE

‣ UJEDNOLICONE ŹRÓDŁO ZAWIERAJĄCE DANE SUROWE, JAK RÓWNIEŻ PO
TRANSFORMACJI

‣ MOŻE ZAWIERAĆ DANE USTRUKTURYZOWANE (BAZY DANYCH, PLIKI CSV) LUB
NIEUSTRUKTURYZOWANE (DOKUMENTY PDF, OBRAZKI, FILMY)
BAGNA DANYCH (ANG. DATA SWAMP)
CZY JEST MI TO POTRZEBNE?
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
KILKA DODATKOWYCH PYTAŃ
‣ CZY POTRZEBUJĘ SKŁADOWAĆ OGROMNE ILOŚCI DANYCH W CHMURZE
OBLICZENIOWEJ? (PETABAJTY)

‣ CZY POTRZEBUJĘ ŁĄCZYĆ DANE Z WIELU RÓŻNYCH ŹRÓDEŁ W CELU DOKONANIA
LEPSZYCH ANALIZ? (BAZY DANYCH, PLIKI, STRUMIENIE)

‣ CZY POTRZEBUJĘ DOKONYWAĆ NOWYCH ANALIZ NA DANYCH HISTORYCZNYCH?
PIERWSZY KROK TO ROZPOZNANIE
DOSTĘPNYCH USŁUG
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
CZEGO POTRZEBUJEMY?
‣ MIEJSCE NA PRZECHOWYWANIE OBIEKTÓW I
PLIKÓW

‣ MECHANIZM PRZENOSZĄCY I KATALOGUJĄCY DANE

‣ ZARZĄDZANIE UPRAWNIENIAMI

‣ WYKONYWANIE ZAPYTAŃ

‣ WIZUALIZACJA ZAPYTAŃ
PRZYKŁADOWA ARCHITEKTURA
WYZWALACZ
AWS S3
AWS RDS
AWS
DYNAMODB
AWS KINESIS
ŹRÓDŁA DANYCH NARZĘDZIA BI
TABLEAU
QUICKSIGHT
METABASE
DANE
METADANE
JEZIORO DANYCH / AWS LAKE FORMATION
AWS S3 AWS ATHENA
DATA CATALOG
CRAWLERS
JOBS
ZDARZENIE
AWS GLUE
GDZIE BĘDZIEMY TRZYMAĆ DANE?
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
CECHY
‣ MAGAZYN OBIEKTOWY - KLUCZ, WARTOŚĆ

‣ NIELIMITOWANE MIEJSCE, PLIKI DO 5TB

‣ TRWAŁOŚĆ DANYCH NA POZIOMIE 99.999999999%

‣ 3500 OPERACJI ZAPISU I 5500 OPERACJI ODCZYTU NA SEKUNDĘ DLA DANEGO
PREFIKSU

‣ NIELIMITOWANA LICZBA PREFIKSÓW
JAK PRZENIEŚĆ DANE?
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
CECHY
‣ SERWIS W MODELU SERVERLESS DO ODKRYWANIA, EKSTRAKCJI, TRANSFORMACJI I
ŁADOWANIA DANYCH (ETL, ELT)

‣ OFERUJE WIELE GOTOWYCH ROZWIĄZAŃ: CONNECTORS, CRAWLERS, JOBS,
TRIGGERS, WORKFLOWS, BLUEPRINTS

‣ MOŻLIWOŚĆ GENEROWANIA (GLUE STUDIO) I PISANIA SKRYPTÓW W PYTHON LUB
SCALA

‣ POD SPODEM UŻYWA APACHE SPARK
PRZYKŁAD: PRZENIESIENIE DANYCH Z
RDS DO S3
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
POTRZEBNE KROKI
‣ KONFIGURACJA GLUE CONNECTORA

‣ ZDEFINIOWANIE I URUCHOMIENIE GLUE CRAWLERA

‣ NAPISANIE I URUCHOMIENIE SKRYPTU GLUE JOB

• GLUE STUDIO

• KOD
ZACZNIJMY OD INFRASTRUKTURY
import pulumi


import pulumi_aws as aws


aws.glue.Job(


"rdsToS3GlueJob",


name=job_name,


role_arn=role.arn,


command=aws.glue.JobCommandArgs(


script_location=f"s3://{script_bucket}/{rds_to_s3_job_file_name}",


python_version="3",


),


connections=[connection.name],


glue_version="2.0",


default_arguments={


"--job-bookmark-option": "job-bookmark-enable",


"--CRAWLER": crawler_name,


"--DEST_TABLE_PREFIX": "dl_",


"--DEST": f”{data_lake_bkt}/{crawler_name}/tables",


"--REGION": region,


"--CATALOG": glue_catalog_database_name,


},


number_of_workers=10,


worker_type="G.1X",


)
import pulumi


import pulumi_aws as aws


aws.glue.Job(


"rdsToS3GlueJob",


name=job_name,


role_arn=role.arn,


command=aws.glue.JobCommandArgs(


script_location=f"s3://{script_bucket}/{rds_to_s3_job_file_name}",


python_version="3",


),


connections=[connection.name],


glue_version="2.0",


default_arguments={


"--job-bookmark-option": "job-bookmark-enable",


"--CRAWLER": crawler_name,


"--DEST_TABLE_PREFIX": "dl_",


"--DEST": f”{data_lake_bkt}/{crawler_name}/tables",


"--REGION": region,


"--CATALOG": glue_catalog_database_name,


},


number_of_workers=10,


worker_type="G.1X",


)
import pulumi


import pulumi_aws as aws


aws.glue.Job(


"rdsToS3GlueJob",


name=job_name,


role_arn=role.arn,


command=aws.glue.JobCommandArgs(


script_location=f"s3://{script_bucket}/{rds_to_s3_job_file_name}",


python_version="3",


),


connections=[connection.name],


glue_version="2.0",


default_arguments={


"--job-bookmark-option": "job-bookmark-enable",


"--CRAWLER": crawler_name,


"--DEST_TABLE_PREFIX": "dl_",


"--DEST": f”{data_lake_bkt}/{crawler_name}/tables",


"--REGION": region,


"--CATALOG": glue_catalog_database_name,


},


number_of_workers=10,


worker_type="G.1X",


)
import pulumi


import pulumi_aws as aws


aws.glue.Job(


"rdsToS3GlueJob",


name=job_name,


role_arn=role.arn,


command=aws.glue.JobCommandArgs(


script_location=f"s3://{script_bucket}/{rds_to_s3_job_file_name}",


python_version="3",


),


connections=[connection.name],


glue_version="2.0",


default_arguments={


"--job-bookmark-option": "job-bookmark-enable",


"--CRAWLER": crawler_name,


"--DEST_TABLE_PREFIX": "dl_",


"--DEST": f”{data_lake_bkt}/{crawler_name}/tables",


"--REGION": region,


"--CATALOG": glue_catalog_database_name,


},


number_of_workers=10,


worker_type="G.1X",


)
SKRYPT GLUE JOB
# various imports


args = getResolvedOptions(


sys.argv, ["JOB_NAME", "REGION", "CRAWLER", "CATALOG", "DEST", "DEST_TABLE_PREFIX"]


)


sc = SparkContext()


glueContext = GlueContext(sc)


job = Job(glueContext)


job.init(args["JOB_NAME"], args)


# operations


job.commit()
client = boto3.client("glue", region_name=args["REGION"])


paginator = client.get_paginator("get_tables")


page_iterator = paginator.paginate(DatabaseName=args["CATALOG"])


for page in page_iterator:


for table in page["TableList"]:


if not table_valid(table, args):


continue


[db, schema, tbl_name] = table["StorageDescriptor"]["Location"].split(".")


dest_path = f"{args['DEST']}/{tbl_name}"


print(f"Dumping table {tbl_name} to {dest_path}")


# dump code
client = boto3.client("glue", region_name=args["REGION"])


paginator = client.get_paginator("get_tables")


page_iterator = paginator.paginate(DatabaseName=args["CATALOG"])


for page in page_iterator:


for table in page["TableList"]:


if not table_valid(table, args):


continue


[db, schema, tbl_name] = table["StorageDescriptor"]["Location"].split(".")


dest_path = f"{args['DEST']}/{tbl_name}"


print(f"Dumping table {tbl_name} to {dest_path}")


# dump code
client = boto3.client("glue", region_name=args["REGION"])


paginator = client.get_paginator("get_tables")


page_iterator = paginator.paginate(DatabaseName=args["CATALOG"])


for page in page_iterator:


for table in page["TableList"]:


if not table_valid(table, args):


continue


[db, schema, tbl_name] = table["StorageDescriptor"]["Location"].split(".")


dest_path = f"{args['DEST']}/{tbl_name}"


print(f"Dumping table {tbl_name} to {dest_path}")


# dump code
client = boto3.client("glue", region_name=args["REGION"])


paginator = client.get_paginator("get_tables")


page_iterator = paginator.paginate(DatabaseName=args["CATALOG"])


for page in page_iterator:


for table in page["TableList"]:


if not table_valid(table, args):


continue


[db, schema, tbl_name] = table["StorageDescriptor"]["Location"].split(".")


dest_path = f"{args['DEST']}/{tbl_name}"


print(f"Dumping table {tbl_name} to {dest_path}")


# dump code
source_dynf = glueContext.create_dynamic_frame.from_catalog(


database=args["CATALOG"],


table_name=table["Name"],


transformation_ctx=f"source_dynf_{tbl_name}",


additional_options={


"jobBookmarkKeys": ["updated_at"],


"jobBookmarksKeysSortOrder": "asc",


},


)
source_df = source_dynf.toDF()


partitioned_df = source_df.withColumn(


"year", functions.year(functions.col("created_at"))


).withColumn("month", functions.month(functions.col("created_at")))


partitioned_dynf = DynamicFrame.fromDF(


partitioned_df, glueContext, f"partitioned_dynf_{tbl_name}"


)
sink = glueContext.getSink(


connection_type="s3",


path=f"s3a://{dest_path}",


enableUpdateCatalog=True,


updateBehavior="UPDATE_IN_DATABASE",


partitionKeys=["year", "month"],


)


sink.setFormat("glueparquet")


sink.setCatalogInfo(


catalogDatabase=args["CATALOG"],


catalogTableName=f"{args['DEST_TABLE_PREFIX']}{tbl_name}",


)


sink.writeFrame(partitioned_dynf)
sink = glueContext.getSink(


connection_type="s3",


path=f"s3a://{dest_path}",


enableUpdateCatalog=True,


updateBehavior="UPDATE_IN_DATABASE",


partitionKeys=["year", "month"],


)


sink.setFormat("glueparquet")


sink.setCatalogInfo(


catalogDatabase=args["CATALOG"],


catalogTableName=f"{args['DEST_TABLE_PREFIX']}{tbl_name}",


)


sink.writeFrame(partitioned_dynf)
sink = glueContext.getSink(


connection_type="s3",


path=f"s3a://{dest_path}",


enableUpdateCatalog=True,


updateBehavior="UPDATE_IN_DATABASE",


partitionKeys=["year", "month"],


)


sink.setFormat("glueparquet")


sink.setCatalogInfo(


catalogDatabase=args["CATALOG"],


catalogTableName=f"{args['DEST_TABLE_PREFIX']}{tbl_name}",


)


sink.writeFrame(partitioned_dynf)
sink = glueContext.getSink(


connection_type="s3",


path=f"s3a://{dest_path}",


enableUpdateCatalog=True,


updateBehavior="UPDATE_IN_DATABASE",


partitionKeys=["year", "month"],


)


sink.setFormat("glueparquet")


sink.setCatalogInfo(


catalogDatabase=args["CATALOG"],


catalogTableName=f"{args['DEST_TABLE_PREFIX']}{tbl_name}",


)


sink.writeFrame(partitioned_dynf)
GDZIE WYKONAMY ZAPYTANIA?
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
CECHY
‣ MODEL SERVERLESS

‣ URUCHAMIANIE I ŁĄCZENIE ZAPYTAŃ SQL NA WIELU ŹRÓDŁACH DANYCH (S3,
MONGODB, POSTGRESQL I INNE)

‣ 5$ ZA 1TB PRZESKANOWANYCH DANYCH

‣ POD SPODEM WYKORZYSTUJE PRESTO

‣ BRAK WIZUALIZACJI ZAPYTAŃ, KIEPSKI UI
GDZIE ZWIZUALIZUJEMY ZAPYTANIA?
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
CECHY
‣ NARZĘDZIE BI DO URUCHAMIANIA ANALIZ I GENEROWANIA WYKRESÓW

‣ MOŻE SŁUŻYĆ JAKO „FRONTEND” DO AWS ATHENA

‣ DOSTĘPNE PŁATNIE W CHMURZE LUB ZA DARMO ON-PREMISE (OBRAZ
DOCKEROWY)

‣ BRAK OFICJALNEJ WTYCZKI DO AWS ATHENA W WERSJI CHMUROWEJ
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
HTTPS://GITHUB.COM/DACORT/METABASE-ATHENA-DRIVER
PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
PODSUMOWANKO
‣ WARTO POZNAĆ
DOSTĘPNE USŁUGI

‣ ŁATWO ZACZĄĆ
DZIĘKI GOTOWYM
SERWISOM

‣ TRUDNO UTRZYMAĆ
W PORZĄDKU
‣ LEPIEJ ZACZĄĆ OD
MNIEJSZEJ
FUNKCJONALNOŚCI

‣ I STOPNIOWO
WPROWADZAĆ
AUTOMATYZACJĘ
DZIĘKI!
ŹRÓDŁO IKON: ICON POND - WWW.FLATICON.COM 
NEWSLETTER DLA DEVELOPERÓW I CTO
HTTPS://TSH.IO/NEWSLETTER

Contenu connexe

Similaire à Pierwsza wycieczka nad jezioro (danych)

Let your DBAs get some REST(api)
Let your DBAs get some REST(api)Let your DBAs get some REST(api)
Let your DBAs get some REST(api)Ludovico Caldara
 
[Heap con19] designing data intensive applications in serverless architecture
[Heap con19] designing data intensive applications in serverless architecture[Heap con19] designing data intensive applications in serverless architecture
[Heap con19] designing data intensive applications in serverless architectureNikolay Matvienko
 
Advanced CouchDB Rotterdam.rb July 2010
Advanced CouchDB Rotterdam.rb July 2010Advanced CouchDB Rotterdam.rb July 2010
Advanced CouchDB Rotterdam.rb July 2010Sander van de Graaf
 
CloudFork
CloudForkCloudFork
CloudForkESUG
 
CouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 HourCouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 HourPeter Friese
 
Mongodbworkshop I: get started
Mongodbworkshop I: get startedMongodbworkshop I: get started
Mongodbworkshop I: get startedVivian S. Zhang
 
IT Days - Parse huge JSON files in a streaming way.pptx
IT Days - Parse huge JSON files in a streaming way.pptxIT Days - Parse huge JSON files in a streaming way.pptx
IT Days - Parse huge JSON files in a streaming way.pptxAndrei Negruti
 
OSCON july 2011
OSCON july 2011OSCON july 2011
OSCON july 2011chelm
 
MongoDB.local Berlin: Building a GraphQL API with MongoDB, Prisma and Typescript
MongoDB.local Berlin: Building a GraphQL API with MongoDB, Prisma and TypescriptMongoDB.local Berlin: Building a GraphQL API with MongoDB, Prisma and Typescript
MongoDB.local Berlin: Building a GraphQL API with MongoDB, Prisma and TypescriptMongoDB
 
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...AWS Chicago
 
NodeJS: the good parts? A skeptic’s view (jax jax2013)
NodeJS: the good parts? A skeptic’s view (jax jax2013)NodeJS: the good parts? A skeptic’s view (jax jax2013)
NodeJS: the good parts? A skeptic’s view (jax jax2013)Chris Richardson
 
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaSolutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaGuido Schmutz
 
Serverless Architectural Patterns & Best Practices
Serverless Architectural Patterns & Best PracticesServerless Architectural Patterns & Best Practices
Serverless Architectural Patterns & Best PracticesDaniel Zivkovic
 
Handling Real-time Geostreams
Handling Real-time GeostreamsHandling Real-time Geostreams
Handling Real-time Geostreamsguest35660bc
 
Handling Real-time Geostreams
Handling Real-time GeostreamsHandling Real-time Geostreams
Handling Real-time GeostreamsRaffi Krikorian
 
Querying Data Pipeline with AWS Athena
Querying Data Pipeline with AWS AthenaQuerying Data Pipeline with AWS Athena
Querying Data Pipeline with AWS AthenaYaroslav Tkachenko
 
Where20 2008 Ruby Tutorial
Where20 2008 Ruby TutorialWhere20 2008 Ruby Tutorial
Where20 2008 Ruby TutorialShoaib Burq
 
CQRS, ReactJS, Docker in a nutshell
CQRS, ReactJS, Docker in a nutshellCQRS, ReactJS, Docker in a nutshell
CQRS, ReactJS, Docker in a nutshellAndrea Giuliano
 

Similaire à Pierwsza wycieczka nad jezioro (danych) (20)

Let your DBAs get some REST(api)
Let your DBAs get some REST(api)Let your DBAs get some REST(api)
Let your DBAs get some REST(api)
 
[Heap con19] designing data intensive applications in serverless architecture
[Heap con19] designing data intensive applications in serverless architecture[Heap con19] designing data intensive applications in serverless architecture
[Heap con19] designing data intensive applications in serverless architecture
 
Advanced CouchDB Rotterdam.rb July 2010
Advanced CouchDB Rotterdam.rb July 2010Advanced CouchDB Rotterdam.rb July 2010
Advanced CouchDB Rotterdam.rb July 2010
 
CloudFork
CloudForkCloudFork
CloudFork
 
CouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 HourCouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 Hour
 
Mongodbworkshop I: get started
Mongodbworkshop I: get startedMongodbworkshop I: get started
Mongodbworkshop I: get started
 
MongoDB Workshop
MongoDB WorkshopMongoDB Workshop
MongoDB Workshop
 
IT Days - Parse huge JSON files in a streaming way.pptx
IT Days - Parse huge JSON files in a streaming way.pptxIT Days - Parse huge JSON files in a streaming way.pptx
IT Days - Parse huge JSON files in a streaming way.pptx
 
OSCON july 2011
OSCON july 2011OSCON july 2011
OSCON july 2011
 
MongoDB.local Berlin: Building a GraphQL API with MongoDB, Prisma and Typescript
MongoDB.local Berlin: Building a GraphQL API with MongoDB, Prisma and TypescriptMongoDB.local Berlin: Building a GraphQL API with MongoDB, Prisma and Typescript
MongoDB.local Berlin: Building a GraphQL API with MongoDB, Prisma and Typescript
 
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...
 
NodeJS: the good parts? A skeptic’s view (jax jax2013)
NodeJS: the good parts? A skeptic’s view (jax jax2013)NodeJS: the good parts? A skeptic’s view (jax jax2013)
NodeJS: the good parts? A skeptic’s view (jax jax2013)
 
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaSolutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
 
Serverless Architectural Patterns & Best Practices
Serverless Architectural Patterns & Best PracticesServerless Architectural Patterns & Best Practices
Serverless Architectural Patterns & Best Practices
 
PowerDNS Webinar
PowerDNS Webinar PowerDNS Webinar
PowerDNS Webinar
 
Handling Real-time Geostreams
Handling Real-time GeostreamsHandling Real-time Geostreams
Handling Real-time Geostreams
 
Handling Real-time Geostreams
Handling Real-time GeostreamsHandling Real-time Geostreams
Handling Real-time Geostreams
 
Querying Data Pipeline with AWS Athena
Querying Data Pipeline with AWS AthenaQuerying Data Pipeline with AWS Athena
Querying Data Pipeline with AWS Athena
 
Where20 2008 Ruby Tutorial
Where20 2008 Ruby TutorialWhere20 2008 Ruby Tutorial
Where20 2008 Ruby Tutorial
 
CQRS, ReactJS, Docker in a nutshell
CQRS, ReactJS, Docker in a nutshellCQRS, ReactJS, Docker in a nutshell
CQRS, ReactJS, Docker in a nutshell
 

Plus de The Software House

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...The Software House
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?The Software House
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?The Software House
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeThe Software House
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?The Software House
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSThe Software House
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptThe Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptThe Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychThe Software House
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case studyThe Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejThe Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachThe Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsThe Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeThe Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduThe Software House
 

Plus de The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 

Dernier

Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 

Dernier (20)

Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

Pierwsza wycieczka nad jezioro (danych)

  • 1. MARIUSZ RICHTSCHEID GLIWICE, 23.02.2022 PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH)
  • 2. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) O MNIE ‣ SOFTWARE ARCHITECT
 W THE SOFTWARE HOUSE ‣ RICHTSCHEID@GMAIL.COM ‣ LINKEDIN.COM/IN/RICHTSCHEID ‣ GITHUB.COM/BAROGRAF MARIUSZ RICHTSCHEID
  • 3. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) AGENDA ‣ TROCHĘ TEORII ‣ PRZEGLĄD DOSTĘPNYCH SERWISÓW ‣ PRZYKŁADOWA ARCHITEKTURA ‣ OMÓWIENIE SERWISÓW PLUS PRZYKŁAD IMPLEMENTACJI ‣ USZANOWANKO PODSUMOWANKO
  • 4. CZYM JEST JEZIORO DANYCH WG POLSKIEJ WIKIPEDII?
  • 5. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) JEZIORO – NATURALNY ŚRÓDLĄDOWY ZBIORNIK WODNY, KTÓREGO WYSTĘPOWANIE UWARUNKOWANE JEST ISTNIENIEM ZAGŁĘBIENIA, W KTÓRYM MOGĄ GROMADZIĆ SIĘ WODY POWIERZCHNIOWE, ORAZ ZASILANIEM PRZEWYŻSZAJĄCYM STRATY WODY WSKUTEK PAROWANIA LUB ODPŁYWU.
  • 6. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) WG ANGIELSKIEJ WIKIPEDII ‣ SYSTEM LUB REPOZYTORIUM DANYCH PRZECHOWYWANYCH W NATURALNEJ, NIEPRZETWORZONEJ FORMIE ‣ UJEDNOLICONE ŹRÓDŁO ZAWIERAJĄCE DANE SUROWE, JAK RÓWNIEŻ PO TRANSFORMACJI ‣ MOŻE ZAWIERAĆ DANE USTRUKTURYZOWANE (BAZY DANYCH, PLIKI CSV) LUB NIEUSTRUKTURYZOWANE (DOKUMENTY PDF, OBRAZKI, FILMY)
  • 7. BAGNA DANYCH (ANG. DATA SWAMP)
  • 8. CZY JEST MI TO POTRZEBNE?
  • 9. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) KILKA DODATKOWYCH PYTAŃ ‣ CZY POTRZEBUJĘ SKŁADOWAĆ OGROMNE ILOŚCI DANYCH W CHMURZE OBLICZENIOWEJ? (PETABAJTY) ‣ CZY POTRZEBUJĘ ŁĄCZYĆ DANE Z WIELU RÓŻNYCH ŹRÓDEŁ W CELU DOKONANIA LEPSZYCH ANALIZ? (BAZY DANYCH, PLIKI, STRUMIENIE) ‣ CZY POTRZEBUJĘ DOKONYWAĆ NOWYCH ANALIZ NA DANYCH HISTORYCZNYCH?
  • 10. PIERWSZY KROK TO ROZPOZNANIE DOSTĘPNYCH USŁUG
  • 11. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) CZEGO POTRZEBUJEMY? ‣ MIEJSCE NA PRZECHOWYWANIE OBIEKTÓW I PLIKÓW ‣ MECHANIZM PRZENOSZĄCY I KATALOGUJĄCY DANE ‣ ZARZĄDZANIE UPRAWNIENIAMI ‣ WYKONYWANIE ZAPYTAŃ ‣ WIZUALIZACJA ZAPYTAŃ
  • 12.
  • 13.
  • 15. WYZWALACZ AWS S3 AWS RDS AWS DYNAMODB AWS KINESIS ŹRÓDŁA DANYCH NARZĘDZIA BI TABLEAU QUICKSIGHT METABASE DANE METADANE JEZIORO DANYCH / AWS LAKE FORMATION AWS S3 AWS ATHENA DATA CATALOG CRAWLERS JOBS ZDARZENIE AWS GLUE
  • 17. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) CECHY ‣ MAGAZYN OBIEKTOWY - KLUCZ, WARTOŚĆ ‣ NIELIMITOWANE MIEJSCE, PLIKI DO 5TB ‣ TRWAŁOŚĆ DANYCH NA POZIOMIE 99.999999999% ‣ 3500 OPERACJI ZAPISU I 5500 OPERACJI ODCZYTU NA SEKUNDĘ DLA DANEGO PREFIKSU ‣ NIELIMITOWANA LICZBA PREFIKSÓW
  • 18.
  • 20. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) CECHY ‣ SERWIS W MODELU SERVERLESS DO ODKRYWANIA, EKSTRAKCJI, TRANSFORMACJI I ŁADOWANIA DANYCH (ETL, ELT) ‣ OFERUJE WIELE GOTOWYCH ROZWIĄZAŃ: CONNECTORS, CRAWLERS, JOBS, TRIGGERS, WORKFLOWS, BLUEPRINTS ‣ MOŻLIWOŚĆ GENEROWANIA (GLUE STUDIO) I PISANIA SKRYPTÓW W PYTHON LUB SCALA ‣ POD SPODEM UŻYWA APACHE SPARK
  • 22. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) POTRZEBNE KROKI ‣ KONFIGURACJA GLUE CONNECTORA ‣ ZDEFINIOWANIE I URUCHOMIENIE GLUE CRAWLERA ‣ NAPISANIE I URUCHOMIENIE SKRYPTU GLUE JOB • GLUE STUDIO • KOD
  • 23.
  • 25. import pulumi import pulumi_aws as aws aws.glue.Job( "rdsToS3GlueJob", name=job_name, role_arn=role.arn, command=aws.glue.JobCommandArgs( script_location=f"s3://{script_bucket}/{rds_to_s3_job_file_name}", python_version="3", ), connections=[connection.name], glue_version="2.0", default_arguments={ "--job-bookmark-option": "job-bookmark-enable", "--CRAWLER": crawler_name, "--DEST_TABLE_PREFIX": "dl_", "--DEST": f”{data_lake_bkt}/{crawler_name}/tables", "--REGION": region, "--CATALOG": glue_catalog_database_name, }, number_of_workers=10, worker_type="G.1X", )
  • 26. import pulumi import pulumi_aws as aws aws.glue.Job( "rdsToS3GlueJob", name=job_name, role_arn=role.arn, command=aws.glue.JobCommandArgs( script_location=f"s3://{script_bucket}/{rds_to_s3_job_file_name}", python_version="3", ), connections=[connection.name], glue_version="2.0", default_arguments={ "--job-bookmark-option": "job-bookmark-enable", "--CRAWLER": crawler_name, "--DEST_TABLE_PREFIX": "dl_", "--DEST": f”{data_lake_bkt}/{crawler_name}/tables", "--REGION": region, "--CATALOG": glue_catalog_database_name, }, number_of_workers=10, worker_type="G.1X", )
  • 27. import pulumi import pulumi_aws as aws aws.glue.Job( "rdsToS3GlueJob", name=job_name, role_arn=role.arn, command=aws.glue.JobCommandArgs( script_location=f"s3://{script_bucket}/{rds_to_s3_job_file_name}", python_version="3", ), connections=[connection.name], glue_version="2.0", default_arguments={ "--job-bookmark-option": "job-bookmark-enable", "--CRAWLER": crawler_name, "--DEST_TABLE_PREFIX": "dl_", "--DEST": f”{data_lake_bkt}/{crawler_name}/tables", "--REGION": region, "--CATALOG": glue_catalog_database_name, }, number_of_workers=10, worker_type="G.1X", )
  • 28. import pulumi import pulumi_aws as aws aws.glue.Job( "rdsToS3GlueJob", name=job_name, role_arn=role.arn, command=aws.glue.JobCommandArgs( script_location=f"s3://{script_bucket}/{rds_to_s3_job_file_name}", python_version="3", ), connections=[connection.name], glue_version="2.0", default_arguments={ "--job-bookmark-option": "job-bookmark-enable", "--CRAWLER": crawler_name, "--DEST_TABLE_PREFIX": "dl_", "--DEST": f”{data_lake_bkt}/{crawler_name}/tables", "--REGION": region, "--CATALOG": glue_catalog_database_name, }, number_of_workers=10, worker_type="G.1X", )
  • 30. # various imports args = getResolvedOptions( sys.argv, ["JOB_NAME", "REGION", "CRAWLER", "CATALOG", "DEST", "DEST_TABLE_PREFIX"] ) sc = SparkContext() glueContext = GlueContext(sc) job = Job(glueContext) job.init(args["JOB_NAME"], args) # operations job.commit()
  • 31. client = boto3.client("glue", region_name=args["REGION"]) paginator = client.get_paginator("get_tables") page_iterator = paginator.paginate(DatabaseName=args["CATALOG"]) for page in page_iterator: for table in page["TableList"]: if not table_valid(table, args): continue [db, schema, tbl_name] = table["StorageDescriptor"]["Location"].split(".") dest_path = f"{args['DEST']}/{tbl_name}" print(f"Dumping table {tbl_name} to {dest_path}") # dump code
  • 32. client = boto3.client("glue", region_name=args["REGION"]) paginator = client.get_paginator("get_tables") page_iterator = paginator.paginate(DatabaseName=args["CATALOG"]) for page in page_iterator: for table in page["TableList"]: if not table_valid(table, args): continue [db, schema, tbl_name] = table["StorageDescriptor"]["Location"].split(".") dest_path = f"{args['DEST']}/{tbl_name}" print(f"Dumping table {tbl_name} to {dest_path}") # dump code
  • 33. client = boto3.client("glue", region_name=args["REGION"]) paginator = client.get_paginator("get_tables") page_iterator = paginator.paginate(DatabaseName=args["CATALOG"]) for page in page_iterator: for table in page["TableList"]: if not table_valid(table, args): continue [db, schema, tbl_name] = table["StorageDescriptor"]["Location"].split(".") dest_path = f"{args['DEST']}/{tbl_name}" print(f"Dumping table {tbl_name} to {dest_path}") # dump code
  • 34. client = boto3.client("glue", region_name=args["REGION"]) paginator = client.get_paginator("get_tables") page_iterator = paginator.paginate(DatabaseName=args["CATALOG"]) for page in page_iterator: for table in page["TableList"]: if not table_valid(table, args): continue [db, schema, tbl_name] = table["StorageDescriptor"]["Location"].split(".") dest_path = f"{args['DEST']}/{tbl_name}" print(f"Dumping table {tbl_name} to {dest_path}") # dump code
  • 36. source_df = source_dynf.toDF() partitioned_df = source_df.withColumn( "year", functions.year(functions.col("created_at")) ).withColumn("month", functions.month(functions.col("created_at"))) partitioned_dynf = DynamicFrame.fromDF( partitioned_df, glueContext, f"partitioned_dynf_{tbl_name}" )
  • 37. sink = glueContext.getSink( connection_type="s3", path=f"s3a://{dest_path}", enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE", partitionKeys=["year", "month"], ) sink.setFormat("glueparquet") sink.setCatalogInfo( catalogDatabase=args["CATALOG"], catalogTableName=f"{args['DEST_TABLE_PREFIX']}{tbl_name}", ) sink.writeFrame(partitioned_dynf)
  • 38. sink = glueContext.getSink( connection_type="s3", path=f"s3a://{dest_path}", enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE", partitionKeys=["year", "month"], ) sink.setFormat("glueparquet") sink.setCatalogInfo( catalogDatabase=args["CATALOG"], catalogTableName=f"{args['DEST_TABLE_PREFIX']}{tbl_name}", ) sink.writeFrame(partitioned_dynf)
  • 39. sink = glueContext.getSink( connection_type="s3", path=f"s3a://{dest_path}", enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE", partitionKeys=["year", "month"], ) sink.setFormat("glueparquet") sink.setCatalogInfo( catalogDatabase=args["CATALOG"], catalogTableName=f"{args['DEST_TABLE_PREFIX']}{tbl_name}", ) sink.writeFrame(partitioned_dynf)
  • 40. sink = glueContext.getSink( connection_type="s3", path=f"s3a://{dest_path}", enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE", partitionKeys=["year", "month"], ) sink.setFormat("glueparquet") sink.setCatalogInfo( catalogDatabase=args["CATALOG"], catalogTableName=f"{args['DEST_TABLE_PREFIX']}{tbl_name}", ) sink.writeFrame(partitioned_dynf)
  • 41.
  • 43. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) CECHY ‣ MODEL SERVERLESS ‣ URUCHAMIANIE I ŁĄCZENIE ZAPYTAŃ SQL NA WIELU ŹRÓDŁACH DANYCH (S3, MONGODB, POSTGRESQL I INNE) ‣ 5$ ZA 1TB PRZESKANOWANYCH DANYCH ‣ POD SPODEM WYKORZYSTUJE PRESTO ‣ BRAK WIZUALIZACJI ZAPYTAŃ, KIEPSKI UI
  • 44.
  • 46. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) CECHY ‣ NARZĘDZIE BI DO URUCHAMIANIA ANALIZ I GENEROWANIA WYKRESÓW ‣ MOŻE SŁUŻYĆ JAKO „FRONTEND” DO AWS ATHENA ‣ DOSTĘPNE PŁATNIE W CHMURZE LUB ZA DARMO ON-PREMISE (OBRAZ DOCKEROWY) ‣ BRAK OFICJALNEJ WTYCZKI DO AWS ATHENA W WERSJI CHMUROWEJ
  • 47. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) HTTPS://GITHUB.COM/DACORT/METABASE-ATHENA-DRIVER
  • 48.
  • 49.
  • 50. PIERWSZA WYCIECZKA NAD JEZIORO (DANYCH) PODSUMOWANKO ‣ WARTO POZNAĆ DOSTĘPNE USŁUGI ‣ ŁATWO ZACZĄĆ DZIĘKI GOTOWYM SERWISOM ‣ TRUDNO UTRZYMAĆ W PORZĄDKU ‣ LEPIEJ ZACZĄĆ OD MNIEJSZEJ FUNKCJONALNOŚCI ‣ I STOPNIOWO WPROWADZAĆ AUTOMATYZACJĘ
  • 51. DZIĘKI! ŹRÓDŁO IKON: ICON POND - WWW.FLATICON.COM 
  • 52. NEWSLETTER DLA DEVELOPERÓW I CTO HTTPS://TSH.IO/NEWSLETTER