Tutorial su Apache Sqoop: Archistruttura, comandi ed esempi
⚡ Riepilogo intelligente
Apache Sqoop trasferisce grandi quantità di dati tra database relazionali e HDFS utilizzando un'architettura a connettori, generando processi MapReduce che importano tabelle in Hive o HBase ed esportano i risultati elaborati nel sistema di origine.
Cos'è SQOOP in Hadoop?
Apache Sqop (SQL-to-Hadoop) è uno strumento progettato per supportare l'esportazione e l'importazione di dati in blocco in HDFS Da archivi di dati strutturati come database relazionali, data warehouse aziendali e sistemi NoSQL. Si tratta di uno strumento di migrazione dati basato su un'architettura a connettori che supporta i plugin per fornire connettività a nuovi sistemi esterni.
Un esempio di caso d'uso di Hadoop Sqoop è un'azienda che esegue un'importazione Sqoop notturna per caricare i dati giornalieri da un RDBMS transazionale di produzione in un Alveare data warehouse per ulteriori analisi.
Nel prossimo tutorial su Apache Sqoop impareremo l'architettura di Apache Sqoop.
Sqop Architectura
Tutto l'esistente Sistemi di gestione di database sono progettati con SQL norma in mente. Tuttavia, ogni DBMS differisce in una certa misura rispetto al dialetto. Pertanto, questa differenza pone sfide quando si tratta di trasferimenti di dati tra i sistemi. I connettori Sqoop sono componenti che aiutano a superare queste sfide.
Il trasferimento dei dati tra Sqoop Hadoop e il sistema di archiviazione esterno è reso possibile con l'aiuto dei connettori Sqoop.
Sqoop dispone di connettori per lavorare con una gamma di database relazionali popolari, tra cui MySQL, PostgreSQL, Oracle, SQL Server e DB2. Ciascuno di questi connettori sa come interagire con il DBMS associato. Esiste anche un connettore JDBC generico per la connessione a qualsiasi database che supporti Javaprotocollo JDBC. Inoltre, Sqoop fornisce anche ottimizzato MySQL and PostgreSQL connettori che utilizzano API specifiche del database per eseguire trasferimenti in blocco in modo efficiente.
Il diagramma seguente posiziona il client Sqoop tra l'archivio dati esterno e il cluster Hadoop, con il livello di connessione da un lato e HDFS, Hive e HBase dall'altro.
Sotto il livello del connettore, Sqoop genera un Java classe che rispecchia una riga della tabella e poi invia solo la mappa MapReduce lavoro. Ogni attività di mappatura legge la propria porzione dell'intervallo di colonne suddivise, quindi la velocità di elaborazione aumenta con il numero di mapper anziché con un singolo cursore JDBC.
Oltre a ciò, Sqoop dispone di vari connettori di terze parti per archivi dati, che vanno da quelli aziendali data warehouse (inclusi Netezza, Teradata e Oracle) agli archivi NoSQL (come Couchbase). Tuttavia, questi connettori non vengono forniti con il bundle Sqoop; quelli devono essere scaricati separatamente e possono essere aggiunti facilmente a un'installazione Sqoop esistente.
Perché abbiamo bisogno di Sqoop?
L'elaborazione analitica tramite Hadoop richiede il caricamento di enormi quantità di dati da diverse fonti in cluster Hadoop. Questo processo di caricamento di dati in blocco in Hadoop, da fonti eterogenee e successiva elaborazione, comporta una serie di sfide. Mantenere e garantire la coerenza dei dati e garantire un utilizzo efficiente delle risorse sono alcuni fattori da considerare prima di selezionare l'approccio giusto per il caricamento dei dati.
Problemi maggiori:
- Caricamento dei dati tramite script — L'approccio tradizionale che prevede l'utilizzo di script per caricare i dati non è adatto al caricamento di grandi quantità di dati in Hadoop; questo approccio è inefficiente e richiede molto tempo.
- Accesso diretto a dati esterni tramite un'applicazione Map-Reduce — Fornire accesso diretto ai dati residenti in sistemi esterni (senza caricarli in Hadoop) per le applicazioni MapReduce complica queste applicazioni. Pertanto, questo approccio non è fattibile.
Oltre alla capacità di gestire enormi quantità di dati, Hadoop è in grado di elaborare dati in diversi formati. Pertanto, per caricare dati eterogenei in Hadoop, sono stati sviluppati diversi strumenti. Sqop and Canale artificiale sono due di questi strumenti di caricamento dati.
Successivamente in questo tutorial Sqoop con esempi, impareremo la differenza tra Sqoop, Flume e HDFS.
Sqoop vs Flume vs HDFS in Hadoop
| Sqop | Canale artificiale | HDFS |
|---|---|---|
| Sqoop viene utilizzato per importare dati da origini dati strutturate come RDBMS. | Flume viene utilizzato per spostare i dati di streaming in blocco in HDFS. | HDFS è un file system distribuito utilizzato dall'ecosistema Hadoop per archiviare i dati. |
| Sqoop ha un'architettura basata sui connettori. I connettori sanno come connettersi alla rispettiva fonte di dati e recuperare i dati. | Flume ha un'architettura basata su agenti. Qui, viene scritto un codice (chiamato 'agente') che si occupa di recuperare i dati. | HDFS ha un'architettura distribuita in cui i dati sono distribuiti su più nodi dati. |
| HDFS è una destinazione per l'importazione di dati utilizzando Sqoop. | I dati fluiscono verso HDFS attraverso zero o più canali. | HDFS è la destinazione definitiva per l'archiviazione dei dati. |
| Il caricamento dei dati Sqoop non è guidato dagli eventi. | Il caricamento dei dati del canale può essere guidato da un evento. | HDFS memorizza semplicemente i dati forniti con qualsiasi mezzo. |
| Per importare dati da origini dati strutturate, è necessario utilizzare solo i comandi Sqoop, perché i suoi connettori sanno come interagire con origini dati strutturate e recuperare dati da esse. | Per caricare dati in streaming come tweet generati su Twitter o file di registro di un server web, è necessario utilizzare Flume. Gli agenti dei flussi sono progettati per recuperare dati in streaming. | HDFS dispone di comandi shell integrati per memorizzare i dati al suo interno. HDFS non è in grado di importare dati in streaming. |
Caratteristiche principali di Sqoop
Il confronto di cui sopra spiega dove si colloca Sqoop. L'insieme di funzionalità riportato di seguito determina se è adatto a uno specifico lavoro di acquisizione dati.
- Pieno carico: Un singolo comando copia un'intera tabella e
import-all-tablesCopia tutte le tabelle di uno schema in un'unica operazione. - Carico incrementale:
appendmodo tracks una colonna che aumenta monotonicamente come una chiave surrogata, mentrelastmodifiedmodo tracSi tratta di una colonna timestamp, quindi vengono trasferite solo le righe nuove o modificate. - Trasferimento parallelo: La colonna di suddivisione divide l'intervallo di chiavi tra le attività di mappatura e il conteggio dei mapper determina quante ne vengono eseguite contemporaneamente.
- Importazione query a formato libero: È possibile importare il risultato di un'istruzione SQL arbitraria anziché un'intera tabella, mantenendo così join e filtri sul lato database.
- Carico diretto nel magazzino: Un'importazione può creare e popolare un Alveare tabella o scrivere direttamente in una tabella HBase invece di fermarsiping nei file HDFS non elaborati.
- Compressione e formati di file: L'output può essere scritto come testo delimitato, SequenceFile, Avro o Parquet, con compressione opzionale a livello di codec.
- Sicurezza: Sqoop si integra con Kerberos e le credenziali possono essere lette da un file di password oppure richieste anziché essere digitate sulla riga di comando.
Comandi di importazione ed esportazione di Sqoop
Entrambe le direzioni del trasferimento avvengono tramite un'unica utility da riga di comando. Lo strumento di importazione sposta le righe dal database ad Hadoop, mentre lo strumento di esportazione sposta i file da Hadoop a una tabella del database.
Un'importazione tipica specifica la connessione JDBC, la tabella di origine, la directory di destinazione, la colonna di suddivisione e il numero di mapper:
sqoop import \ --connect jdbc:mysql://localhost:3306/employees \ --username hadoop \ --password-file /user/hadoop/.mysql.password \ --table employees \ --target-dir /user/hadoop/warehouse/employees \ --split-by emp_no \ --num-mappers 4
Un'esportazione inverte il flusso. Legge i file delimitati già presenti in una directory HDFS e li inserisce in una tabella esistente, quindi la tabella di destinazione deve essere creata prima:
sqoop export \ --connect jdbc:mysql://localhost:3306/employees \ --username hadoop \ --password-file /user/hadoop/.mysql.password \ --table employee_summary \ --export-dir /user/hadoop/warehouse/employee_summary \ --input-fields-terminated-by ','
Un'operazione notturna raramente necessita di elaborare l'intera tabella due volte. Un'importazione incrementale registra il valore più alto già rilevato e riparte da lì nella successiva esecuzione:
sqoop import \ --connect jdbc:mysql://localhost:3306/sales \ --table orders \ --incremental append \ --check-column order_id \ --last-value 15000 \ --target-dir /user/hadoop/warehouse/orders
Questi sono gli argomenti che si presentano in quasi tutti i lavori:
| Argomento | Cosa controlla |
|---|---|
--connect |
JDBC URL del database di origine o di destinazione. |
--table |
Tabella da cui si legge durante un'importazione o su cui si scrive durante un'esportazione. |
--target-dir |
Directory HDFS che riceve l'importazione. Non deve già esistere. |
--export-dir |
Directory HDFS i cui file vengono letti da un'esportazione. |
--split-by |
Colonna il cui intervallo è suddiviso tra le attività di mappatura. |
--num-mappers (-m) |
Numero di attività di mappatura parallele. Il valore predefinito è quattro. |
--incremental |
Seleziona append or lastmodified il cambiamento tracre. |
--hive-import |
Crea la tabella Hive corrispondente e vi carica i dati importati. |
⚠️ Attenzione: Un'esportazione non è una singola transazione. Ogni attività di mappatura esegue il commit del proprio batch, quindi un errore a metà del processo può lasciare parte dei dati nella tabella di destinazione. Instradare la scrittura attraverso una tabella di staging quando il caricamento deve essere completo o nullo.
Stato attuale del progetto Sqoop e alternative moderne
Un dettaglio relativo alla versione è importante prima che uno qualsiasi dei comandi sopra riportati venga inserito nello scheduler.
Gli sviluppatori di Sqoop hanno votato per ritirare il progetto nel giugno 2021 e il passaggio al Soffitta Apache completato nel luglio 2021. Il sito web, le mailing list, il repository git, il problema tracIl kernel e i download rimangono tutti disponibili, ma in sola lettura, e non sono previste ulteriori release. L'ultima release di produzione è Sqoop 1.4.7 del 2017; la linea separata Sqoop 2 (1.99.x) non ha mai raggiunto la parità di funzionalità e non è mai stata dichiarata pronta per la produzione.
I job Sqoop esistenti continuano a funzionare e le distribuzioni commerciali di Hadoop continuano a includere e supportare lo strumento all'interno delle proprie piattaforme. I nuovi progetti di acquisizione dati, tuttavia, vengono solitamente sviluppati su una di queste alternative:
| Alternative | miglior vestibilità |
|---|---|
| Spark con l'origine dati JDBC | Tabella batch extracts che si trovano già all'interno di un Spark pipeline, con letture partizionate invece di mapper. |
| ApacheNiFi | Instradamento basato sul flusso e configurato visivamente tra numerosi sistemi eterogenei. |
| Kafka Connect con un connettore CDC | Acquisizione continua dei dati di modifica in sostituzione di una finestra di elaborazione batch notturna. |
| Piattaforme ETL gestite come Talend | Connettori predefiniti, pianificazione e tracciabilità senza necessità di scrivere manualmente i job. |

