Ingegneria dei dati moderna

La moderna ingegneria dei dati

Strumenti specifici per la piattaforma e tecniche avanzate

Foto di Christopher Burns su Unsplash

L’ecosistema moderno dei dati continua a evolversi e nuovi strumenti dati emergono di tanto in tanto. In questo articolo, voglio parlare di cose cruciali che influenzano gli ingegneri dati. Discuteremo come utilizzare questa conoscenza per alimentare pipeline analitiche avanzate ed eccellenza operativa.

Vorrei discutere alcune domande popolari sull’engineering dei dati:

  • Moderno engineering dei dati (DE). Cos’è?
  • Il tuo DE funziona abbastanza bene da alimentare pipeline di dati avanzate e Business intelligence (BI)?
  • Le tue pipeline dati sono efficienti?
  • Cosa è richiesto dal punto di vista tecnologico per abilitare l’eccellenza operativa?

A ottobre, ho scritto dell’ascesa dell’ingegnere dei dati, il ruolo, le sfide, le responsabilità, la routine quotidiana e come avere successo in questo campo. Il panorama dell’engineering dei dati sta cambiando costantemente, ma le principali tendenze sembrano rimanere le stesse.

Come diventare un ingegnere dei dati

Una scorciatoia per i principianti nel 2024

towardsdatascience.com

Come ingegnere dei dati, ho il compito di progettare processi dati efficienti quasi ogni giorno. Ecco quindi alcune cose da considerare che possono aiutarci a rispondere a queste domande.

Tendenze moderne dell’engineering dei dati

  • ETL vs ELT
  • Connettore dati semplificato e integrazioni API
  • Esplosione dei framework ETL
  • Infrastruttura dati come codice
  • Data Mesh e gestione dati decentralizzata
  • Democratizzazione delle pipeline di Business intelligence utilizzando l’IA
  • Focus sulla lettura dei dati

ELT vs ETL

Popolari strumenti di trasformazione dei dati SQL come Dataform e DBT hanno dato un contributo significativo alla popolarizzazione dell’approccio ELT [1]. Ha semplicemente senso eseguire le trasformazioni dei dati richieste, come pulizia, arricchimento ed estrazione nel luogo in cui i dati vengono memorizzati. Spesso si tratta di una soluzione di data warehouse (DWH) nella parte centrale della nostra infrastruttura. I leader delle piattaforme cloud hanno reso la gestione delle infrastrutture DWH (Snowflake, BigQuery, Redshift, Firebolt) davvero semplice e in molti scenari superano un team di gestione delle infrastrutture dedicate in termini di efficacia dei costi e velocità.

Esempio di data warehouse. Immagine dell'autore

Potrebbe anche essere un datalake al centro e dipende dal tipo di piattaforma dati e dagli strumenti che utilizziamo. In questo caso, SQL smette di essere un’opzione in molti casi, rendendo difficile interrogare i dati per gli utenti che non sono familiari con la programmazione. Strumenti come Databricks, Tabular e Galaxy cercano di risolvere questo problema e sembrano davvero il futuro. Infatti, i datalake possono memorizzare tutti i tipi di dati, compresi quelli non strutturati, e abbiamo comunque bisogno di essere in grado di analizzare questi dataset.

Esempio di datalake. Immagine dell'autore.

Immagina solo tabelle di datalake coerenti transazionalmente con isolamento dei punti nel tempo.

Ne ho parlato in precedenza in una delle mie storie sul formato di tabella Apache Iceberg [2].

Introduzione alle tabelle Apache Iceberg

Alcune ragioni compelling per scegliere Apache Iceberg per i Data Lake

towardsdatascience.com

Integrazioni dati semplificate

Le soluzioni gestite come Fivetran e Stitch sono state create per gestire facilmente le integrazioni di API di terze parti. Al giorno d’oggi molte aziende scelgono questo approccio per semplificare le interazioni con le fonti dati esterne. Questa potrebbe essere la giusta strada da seguire per i team di analisti dati che non sono familiari con la codifica.

In effetti, perché dovremmo costruire un connettore dati da zero se esiste già ed è gestito nel cloud?

Lo svantaggio di questo approccio è il suo modello di prezzo.

Spesso si basa sul numero di righe e potrebbe diventare piuttosto costoso a livello aziendale per l’acquisizione di dati, cioè per i grandi flussi di dati. Ecco dove entrano in gioco le alternative open-source. Framework come Airbyte e Meltano potrebbero essere una soluzione facile e veloce per implementare un microservizio di integrazione di origine dati.

Se non hai tempo per imparare un nuovo framework ETL, puoi creare tu stesso un connettore dati semplice. Se sai un po’ di Python, sarà un compito banale. In uno dei miei articoli precedenti ho scritto quanto sia facile creare un microservizio che recupera dati dall’API della NASA [3]:

Python per Data Engineers

Tecniche ETL avanzate per principianti

towardsdatascience.com

Considera questa porzione di codice per app.py

import requestssession = requests.Session()url="https://api.nasa.gov/neo/rest/v1/feed"apiKey="your_api_key"requestParams = {    'api_key': apiKey,    'start_date': '2023-04-20',    'end_date': '2023-04-21'}response = session.get(url, params = requestParams, stream=True)print(response.status_code)

Può essere implementato su qualsiasi piattaforma di fornitore cloud e pianificato per essere eseguito con la frequenza richiesta. È sempre una buona pratica utilizzare qualcosa come Terraform per implementare le nostre applicazioni di flusso dati.

Esplosione di framework ETL

Possiamo assistere a una “esplosione cambriana” di vari framework ETL per l’estrazione e la trasformazione dei dati. Non è una sorpresa che molti di essi siano open-source e basati su Python.

Luigi [8] è uno di loro e aiuta a creare flussi di lavoro ETL. È stato creato da Spotify per gestire carichi di lavoro di elaborazione dati massivi. Ha un’interfaccia a riga di comando e ottime funzionalità di visualizzazione. Tuttavia, anche i flussi di lavoro ETL di base richiedono un certo livello di competenze di programmazione Python. Dalla mia esperienza, posso dire che è ottimo per flussi di lavoro rigorosi e diretti. Trovo particolarmente difficile implementare logiche di ramificazione complesse usando Luigi, ma funziona bene in molte situazioni.

Python ETL (PETL) [9] è uno dei framework ETL open-source più utilizzati per trasformazioni di dati dirette. È inestimabile per lavorare con tabelle, estrarre dati da fonti dati esterne e eseguire ETL di base sui dati. In molti modi, è simile a Pandas, ma quest’ultimo ha più capacità analitiche al suo interno. PETL è ottimo per l’aggregazione e l’ETL a livello di riga.

Bonobo [10] è un’altra leggera libreria open-source per l’elaborazione dati che è ottima per lo sviluppo rapido, l’automazione e l’esecuzione parallela di flussi di lavoro di elaborazione dati in batch. Quello che mi piace di Bonobo è che rende molto facile lavorare con vari formati di file dati, ad esempio SQL, XML, XLS, CSV e JSON. Sarà un ottimo strumento per coloro che hanno conoscenze minime di Python. Tra gli altri vantaggi, mi piace che funzioni bene con schemi di dati semi-complessi. È ideale per ETL semplici e può essere eseguito in contenitori Docker (ha un’estensione Docker).

Pandas è un mostro assoluto nel mondo dei dati e non c’è bisogno di coprire le sue capacità in questa storia. Vale la pena menzionare che le sue trasformazioni del frame dei dati sono state incluse in uno dei metodi di base di caricamento dei dati per molti moderni data warehouse. Considera questo esempio di caricamento dati nel data warehouse BigQuery:

from google.cloud import bigqueryfrom google.oauth2 import service_account...# Autenticare il client BigQuery:service_acount_str = config.get('BigQuery') # Utilizzare configcredentials = service_account.Credentials.from_service_account_info(service_acount_str)client = bigquery.Client(credentials=credentials, project=credentials.project_id)...def load_table_from_dataframe(table_schema, table_name, dataset_id):    #! Il formato del file di origine deve essere JSON a matrice esterna:    """    [    {"id":"1"},    {"id":"2"}    ]    """    blob = """            [    {"id":"1","first_name":"John","last_name":"Doe","dob":"1968-01-22","addresses":[{"status":"current","address":"123 First Avenue","city":"Seattle","state":"WA","zip":"11111","numberOfYears":"1"},{"status":"previous","address":"456 Main Street","city":"Portland","state":"OR","zip":"22222","numberOfYears":"5"}]},    {"id":"2","first_name":"John","last_name":"Doe","dob":"1968-01-22","addresses":[{"status":"current","address":"123 First Avenue","city":"Seattle","state":"WA","zip":"11111","numberOfYears":"1"},{"status":"previous","address":"456 Main Street","city":"Portland","state":"OR","zip":"22222","numberOfYears":"5"}]}    ]    """    body = json.loads(blob)    print(pandas.__version__)    table_id = client.dataset(dataset_id).table(table_name)    job_config = bigquery.LoadJobConfig()    schema = create_schema_from_yaml(table_schema)     job_config.schema = schema    df = pandas.DataFrame(    body,    # Nella tabella caricata, l\'ordine delle colonne riflette l\'ordine delle    # colonne nel DataFrame.    columns=["id", "first_name","last_name","dob","addresses"],    )    df['addresses'] = df.addresses.astype(str)    df = df[['id','first_name','last_name','dob','addresses']]    print(df)    load_job = client.load_table_from_dataframe(        df,        table_id,        job_config=job_config,    )    load_job.result()    print("Lavoro terminato.")

Apache Airflow, ad esempio, non è un vero e proprio strumento di ETL, ma aiuta ad organizzare le nostre pipeline di ETL in una bella visualizzazione di grafi di dipendenza (DAG) per descrivere le relazioni tra le attività. L’architettura tipica di Airflow include uno scheduler basato sui metadati, executor, worker e task.

Ad esempio, possiamo eseguire l’operazione di formazione del motore ML dopo aver esportato i dati nella storage cloud (operazione bq_export_op) e far sì che questo flusso di lavoro venga eseguito giornalmente o settimanalmente.

ML model training using Airflow. Image by author.

Considera il seguente esempio.

Crea un semplice grafo di pipeline dei dati per esportare i dati in un bucket di storage cloud e quindi addestrare il modello ML utilizzando MLEngineTrainingOperator.

"""Definizione del DAG per l'addestramento del modello recommendation_bespoke."""import airflowfrom airflow import DAGfrom airflow.contrib.operators.bigquery_operator import BigQueryOperatorfrom airflow.contrib.operators.bigquery_to_gcs import BigQueryToCloudStorageOperatorfrom airflow.hooks.base_hook import BaseHookfrom airflow.operators.app_engine_admin_plugin import AppEngineVersionOperatorfrom airflow.operators.ml_engine_plugin import MLEngineTrainingOperatorimport datetimedef _get_project_id():  """Ottieni l'ID del progetto dalla connessione GCP predefinita."""  extras = BaseHook.get_connection('google_cloud_default').extra_dejson  key = 'extra__google_cloud_platform__project'  if key in extras:    project_id = extras[key]  else:    raise ('Devi configurare project_id nella connessione google_cloud_default '           'dall'\'interfaccia di Airflow')  return project_idPROJECT_ID = _get_project_id()# Costanti set di dati, utilizzate nelle attività di BigQuery.  Puoi modificare queste# in conformità ai tuoi dati.DATASET = 'staging' #'analytics'TABLE_NAME = 'recommendation_bespoke'# Nomi dei bucket GCS e regione, possono anche essere modificati.BUCKET = 'gs://rec_wals_eu'REGION = 'us-central1' #'europe-west2' #'us-east1'JOB_DIR = BUCKET + '/jobs'default_args = {    'owner': 'airflow',    'depends_on_past': False,    'start_date': airflow.utils.dates.days_ago(2),    'email': ['[email protected]'],    'email_on_failure': True,    'email_on_retry': False,    'retries': 5,    'retry_delay': datetime.timedelta(minutes=5)}# Intervallo di pianificazione predefinito utilizzando la sintassi del cronjob, può essere personalizzato qui# o nella console di Airflow.schedule_interval = '00 21 * * *'dag = DAG('recommendations_training_v6', default_args=default_args,          schedule_interval=schedule_interval)dag.doc_md = __doc__### Definizione delle attività### Esportazione dei dati di addestramento di BigQuery in GCStraining_file = BUCKET + '/data/recommendations_small.csv' # solo alcuni record per stagingt1 = BigQueryToCloudStorageOperator(    task_id='bq_export_op',    source_project_dataset_table='%s.recommendation_bespoke' % DATASET,    destination_cloud_storage_uris=[training_file],    export_format='CSV',    dag=dag)# Lavoro di addestramento ML Enginetraining_file = BUCKET + '/data/recommendations_small.csv'job_id = 'recserve_{0}'.format(datetime.datetime.now().strftime('%Y%m%d%H%M'))job_dir = BUCKET + '/jobs/' + job_idoutput_dir = BUCKETdelimiter=','data_type='user_groups'master_image_uri='gcr.io/my-project/recommendation_bespoke_container:tf_rec_latest'training_args = ['--job-dir', job_dir,                 '--train-file', training_file,                 '--output-dir', output_dir,                 '--data-type', data_type]master_config = {"imageUri": master_image_uri,}t3 = MLEngineTrainingOperator(    task_id='ml_engine_training_op',    project_id=PROJECT_ID,    job_id=job_id,    training_args=training_args,    region=REGION,    scale_tier='CUSTOM',    master_type='complex_model_m_gpu',    master_config=master_config,    dag=dag)t3.set_upstream(t1)

Bubbles [11] è un altro strumento open-source per l’ETL nel mondo di Python. È ottimo per lo sviluppo rapido e mi piace come funziona con i metadati per descrivere i flussi di dati. Gli autori di Bubbles lo definiscono un “framework astratto” e dicono che può essere utilizzato da molti altri linguaggi di programmazione, non solo da Python.

Ci sono molti altri strumenti con applicazioni più specifiche, ad esempio l’estrazione di dati da pagine web (PyQuery, BeautifulSoup, ecc.) e l’elaborazione parallela dei dati. Potrebbe essere argomento per un altro articolo ma ho parlato di alcuni di essi in precedenza, ad esempio la libreria joblib [12]

Infrastruttura dati come codice

Infrastruttura come codice (IaC) è un approccio popolare e molto funzionale per la gestione delle risorse della piattaforma dati. Anche per i dati, è praticamente uno standard al giorno d’oggi, e sicuramente fa una bella figura nel tuo CV dicendo ai potenziali datori di lavoro che sei familiare con gli standard DevOps. Utilizzando strumenti come Terraform (agnostiche alla piattaforma) e CloudFormation possiamo integrare facilmente il nostro lavoro di sviluppo e le distribuzioni (operazioni).

In generale, vorremmo avere ambienti dati di staging e produzione per i nostri flussi di dati. Aiuta a testare i nostri flussi di dati e facilita la collaborazione tra i team.

Considera questo diagramma qui sotto. Spiega come funzionano gli ambienti dati.

Ambienti dati. Immagine dell'autore.

Spesso potremmo aver bisogno di un sandbox aggiuntivo per scopi di test o per eseguire test unitari di trasformazione dei dati quando i nostri servizi di ETL innescano flussi di lavoro CI/CD. Ne ho parlato in precedenza qui:

Infrastruttura come Codice per Principianti

Deploy dei Flussi di Dati come un professionista con questi template

levelup.gitconnected.com

Utilizzando file di template AWS CloudFormation possiamo descrivere le risorse necessarie e le loro dipendenze in modo da poterle lanciare e configurare insieme come un singolo stack.

Se sei un professionista dei dati, questo approccio ti aiuterà sicuramente a lavorare con diversi ambienti dati e a replicare più rapidamente e in modo più coerente le risorse della piattaforma dati senza errori.

Il problema è che molti professionisti dei dati non sono familiari con IaC e ciò crea molti errori durante il processo di sviluppo.

Data Mesh e gestione dei dati decentralizzata

Lo spazio dei dati è significativamente evoluto nell’ultimo decennio e ora abbiamo molti strumenti e framework per i dati. Data Mesh definisce lo stato in cui abbiamo diversi domini dei dati (dipartimenti aziendali) con i loro team e risorse dati condivise. Ogni team ha i propri obiettivi, KPI, ruoli e responsabilità dei dati.

Per un lungo periodo di tempo, la burocrazia dei dati è stata un vero problema per molte aziende.

Questo tipo di piattaforma dati [4] potrebbe sembrare un po’ caotico, ma è stato pensato per diventare una scelta di successo ed efficiente per le aziende dove la decentralizzazione consente ai diversi team di accedere ai dataset cross-domain e di eseguire analisi o attività di ETL da soli.

Infatti, Snowflake potrebbe essere la tua soluzione di data warehouse preferita se sei un analista dati e non sei familiare con Spark. Tuttavia, spesso è un problema banale quando potresti voler leggere dati di datalake senza l’aiuto dell’ingegneria dei dati. In questo scenario, un gruppo di record di metadati sui dataset potrebbe essere estremamente utile ed è per questo che Data Mesh ha tanto successo.

Consente agli utenti di avere conoscenza sui dati, le loro origini e come gli altri team possono sfruttare al meglio quei dataset di cui non erano precedentemente a conoscenza.

A volte i dataset e le connessioni delle fonti dati diventano molto intricate ed è sempre una buona pratica avere un unico repository o silo di dati di fonte certa con metadati e descrizioni dei dataset.

In una delle mie storie precedenti [5] ho parlato del ruolo di SQL come linguaggio unificato di interrogazione per i team e i dati. Infatti, è analitico, auto-descrittivo e può essere anche dinamico, il che lo rende uno strumento perfetto per tutti gli utenti dei dati.

Spesso tutto diventa un grosso pasticcio

Questo fa sì che i motori di templating basati su SQL come DBT, Jinja e Dataform siano molto popolari. Immagina solo di avere una piattaforma simile a SQL in cui tutti i dataset e le loro trasformazioni sono descritti e definiti in modo dettagliato [6].

Grafo delle dipendenze e dei metadati di Dataform. Immagine dell'autore.

Potrebbe essere una grande sfida capire come i team di dati si relazionino alle fonti di dati e agli schemi. Molto spesso è tutto intrecciato in una confusione di dipendenze tra i dati e trasformazioni ETL. L’ingegneria dei dati svolge un ruolo critico nel mentoring, migliorando la alfabetizzazione dei dati e dotando il resto dell’azienda delle tecniche di elaborazione dei dati e delle migliori pratiche all’avanguardia.

Democratizzazione delle pipeline di business intelligence mediante l’utilizzo di intelligenza artificiale

Migliorare l’accessibilità dei dati è sempre stato un argomento popolare nel settore dei dati, ma è interessante vedere come il processo di progettazione dell’intera pipeline dei dati stia diventando sempre più accessibile ai team che prima non erano familiari con i dati. Ora quasi ogni dipartimento può utilizzare le capacità di intelligenza artificiale integrate per creare complesse trasformazioni di business intelligence sui dati.

Tutto ciò di cui hanno bisogno è descrivere ciò che desiderano in termini di business intelligence con le loro stesse parole

Ad esempio, strumenti di business intelligence come Thoughtspot utilizzano l’intelligenza artificiale con un intuitivo “interfaccia di ricerca simile a Google” [7] per ottenere informazioni dai dati memorizzati in qualsiasi moderna soluzione DWH come Google Big Query, Redshift, Snowflake o Databricks.

La Modern Data Stack include strumenti di business intelligence che aiutano nella modellazione e visualizzazione dei dati. Molti di essi hanno già queste capacità di intelligenza artificiale integrate per ottenere informazioni sui dati più velocemente in base al comportamento dell’utente.

Credo che sia un compito piuttosto semplice integrare GPT e BI. Nei prossimi anni vedremo molti nuovi prodotti che utilizzeranno questa tecnologia.

GPT può pre-processare i dati testuali per generare una query SQL che comprende la tua intenzione e risponde alla tua domanda.

Conclusioni

In questo articolo ho cercato di dare una panoramica molto generale delle principali tendenze dei dati che influiscono sul ruolo dell’ingegnere dei dati in questi giorni. Data Mesh e SQL in base a modelli con grafi di dipendenze facilitano l’apprendimento dei dati e democratizzano l’intero processo di analisi. Le pipeline dei dati avanzate con tecniche di ETL intricate possono essere accessibili a tutti nell’organizzazione ora. Le pipeline dei dati diventano sempre più accessibili ad altre squadre e non è necessario conoscere la programmazione per apprendere e comprendere la complessità dell’ETL. Data Mesh e i metadati aiutano a risolvere questo problema. Dalla mia esperienza, posso dire che continuo a vedere sempre più persone che imparano SQL per contribuire al livello di trasformazione. Le aziende nate durante l’era dell'”analisi avanzata dei dati” hanno il lusso di avere un facile accesso ai prodotti dei fornitori di cloud e ai loro servizi gestiti. Aiuta sicuramente ad acquisire le competenze necessarie nel campo dei dati e a migliorarle per ottenere un vantaggio competitivo.

[1] https://medium.com/towards-data-science/data-pipeline-design-patterns-100afa4b93e3

[2] https://towardsdatascience.com/introduction-to-apache-iceberg-tables-a791f1758009

[3] https://towardsdatascience.com/python-for-data-engineers-f3d5db59b6dd

[4] https://medium.com/towards-data-science/data-platform-architecture-types-f255ac6e0b7

[5] https://medium.com/towards-data-science/advanced-sql-techniques-for-beginners-211851a28488

[6] https://medium.com/towards-data-science/easy-way-to-create-live-and-staging-environments-for-your-data-e4f03eb73365

[7] https://docs.thoughtspot.com/cloud/latest/search-sage

[8] https://github.com/spotify/luigi

[9] https://petl.readthedocs.io/en/stable/

[10] https://www.bonobo-project.org

[11] http://bubbles.databrewery.org/

[12] https://medium.com/towards-data-science/how-to-become-a-data-engineer-c0319cb226c2