Apache Sqoop-handledning: ArchiStruktur, kommandon och exempel
⚡ Smart sammanfattning
Apache Sqoop flyttar massdata mellan relationsdatabaser och HDFS med hjälp av en kopplingsarkitektur, vilket genererar MapReduce-jobb som importerar tabeller till Hive eller HBase och exporterar bearbetade resultat tillbaka till källsystemet.
Vad är SQOOP i Hadoop?
Apache Sqoop (SQL-to-Hadoop) är ett verktyg utformat för att stödja bulkexport och import av data till HDFS från strukturerade datalager som relationsdatabaser, företagsdatalager och NoSQL-system. Det är ett datamigreringsverktyg baserat på en kopplingsarkitektur som stöder plugins för att ge anslutning till nya externa system.
Ett exempel på användningsfall av Hadoop Sqoop är ett företag som kör en nattlig Sqoop-import för att ladda dagens data från en produktionstransaktions-RDBMS till en Bikupa datalager för vidare analys.
Nästa i denna Apache Sqoop-handledning kommer vi att lära oss om Apache Sqoop-arkitektur.
Sqoop Architecture
Alla befintliga Databashanteringssystem är designade med SQL standard i åtanke. Varje DBMS skiljer sig dock i viss mån med avseende på dialekt. Så denna skillnad innebär utmaningar när det kommer till dataöverföringar mellan systemen. Sqoop Connectors är komponenter som hjälper till att övervinna dessa utmaningar.
Dataöverföring mellan Sqoop Hadoop och externt lagringssystem möjliggörs med hjälp av Sqoops kontakter.
Sqoop har kopplingar för att arbeta med en rad populära relationsdatabaser, inklusive MySQL, PostgreSQL, Oracle, SQL Server och DB2. Var och en av dessa anslutningar vet hur man interagerar med dess associerade DBMS. Det finns också en generisk JDBC-kontakt för att ansluta till vilken databas som helst som stöder Javas JDBC-protokoll. Dessutom tillhandahåller Sqoop även optimerade MySQL och PostgreSQL anslutare som använder databasspecifika API:er för att utföra massöverföringar effektivt.
Diagrammet nedan placerar Sqoop-klienten mellan det externa datalagret och Hadoop-klustret, med kopplingslagret på ena sidan och HDFS, Hive och HBase på den andra.
Under kopplingslagret genererar Sqoop en Java klass som speglar en rad i tabellen och sedan skickar in en endast-avbildning MapReduce jobb. Varje mappningsuppgift läser sin egen del av det delade kolumnintervallet, så dataflödet skalas med antalet mappare snarare än med en enda JDBC-markör.
Utöver detta har Sqoop olika tredjepartskopplingar för datalager, allt från företagsdata datalager (inklusive Netezza, Teradata och Oracle) till NoSQL-butiker (som Couchbase). Dessa kontakter kommer dock inte med Sqoop-paketet; de måste laddas ner separat och kan enkelt läggas till i en befintlig Sqoop-installation.
Varför behöver vi Sqoop?
Analytisk bearbetning med Hadoop kräver laddning av enorma mängder data från olika källor till Hadoop-kluster. Denna process med bulkdataladdning i Hadoop, från heterogena källor och sedan bearbetning av den, kommer med en viss uppsättning utmaningar. Att upprätthålla och säkerställa datakonsistens och säkerställa ett effektivt utnyttjande av resurser är några faktorer att överväga innan du väljer rätt tillvägagångssätt för dataladdning.
Viktiga frågor:
- Datainläsning med hjälp av skript — Den traditionella metoden att använda skript för att ladda data är inte lämplig för massinläsning av data i Hadoop; denna metod är ineffektiv och mycket tidskrävande.
- Direktåtkomst till externa data via en Map-Reduce-applikation — Att ge direkt åtkomst till data som finns i externa system (utan att laddas i Hadoop) för kartreduceringsapplikationer komplicerar dessa applikationer. Därför är denna metod inte genomförbar.
Förutom att kunna arbeta med enorma datamängder kan Hadoop arbeta med data i flera olika former. Så för att ladda in sådan heterogen data i Hadoop har olika verktyg utvecklats. Sqoop och Flume är två sådana dataladdningsverktyg.
Nästa i denna Sqoop-handledning med exempel kommer vi att lära oss om skillnaden mellan Sqoop, Flume och HDFS.
Sqoop vs Flume vs HDFS i Hadoop
| Sqoop | Flume | HDFS |
|---|---|---|
| Sqoop används för att importera data från strukturerade datakällor som RDBMS. | Flume används för att flytta bulkströmningsdata till HDFS. | HDFS är ett distribuerat filsystem som används av Hadoop ekosystem för att lagra data. |
| Sqoop har en kopplingsbaserad arkitektur. Anslutningar vet hur man ansluter till respektive datakälla och hämtar data. | Flume har en agentbaserad arkitektur. Här skrivs en kod (som kallas 'agent') som tar hand om att hämta data. | HDFS har en distribuerad arkitektur där data distribueras över flera datanoder. |
| HDFS är en destination för dataimport med Sqoop. | Data strömmar till HDFS genom noll eller fler kanaler. | HDFS är en ultimat destination för datalagring. |
| Sqoop-dataladdning är inte händelsestyrd. | Rördatabelastning kan drivas av en händelse. | HDFS lagrar bara data som tillhandahålls den på något sätt. |
| För att importera data från strukturerade datakällor måste man endast använda Sqoop-kommandon, eftersom dess kopplingar vet hur man interagerar med strukturerade datakällor och hämtar data från dem. | För att ladda strömmande data såsom tweets genererade på Twitter eller loggfiler på en webbserver, bör Flume användas. Flume-agenter är byggda för att hämta strömmande data. | HDFS har sina egna inbyggda shell-kommandon för att lagra data i den. HDFS kan inte importera strömmande data. |
Viktiga funktioner i Sqoop
Jämförelsen ovan förklarar var Sqoop hör hemma. Funktionsuppsättningen nedan avgör om den passar ett specifikt inmatningsjobb.
- Full last: Ett enda kommando kopierar en hel tabell, och
import-all-tableskopierar varje tabell i ett schema i ett svep. - Stegvis belastning:
appendläge tracks en monotont ökande kolumn såsom en surrogatnyckel, medanlastmodifiedläge tracks en tidsstämpelkolumn, så endast nya eller ändrade rader reser. - Parallell överföring: Den delade kolumnen delar upp nyckelintervallet mellan kartuppgifter, och mapper-antalet anger hur många som körs samtidigt.
- Import av fritt formaterade frågor: Resultatet av ett godtyckligt SQL-uttryck kan importeras istället för en hel tabell, vilket behåller kopplingar och filter på databassidan.
- Direkt lastning in i lagret: En import kan skapa och fylla i en Bikupa tabell eller skriva direkt in i en HBase-tabell istället för att stoppaping på råa HDFS-filer.
- Komprimering och filformat: Utdata kan skrivas som avgränsad text, SequenceFile, Avro eller Parquet, med valfri komprimering på codec-nivå.
- Säkerhet: Sqoop integreras med Kerberos, och inloggningsuppgifter kan läsas från en lösenordsfil eller efterfrågas istället för att skrivas in på kommandoraden.
Sqoop import- och exportkommandon
Båda överföringsriktningarna sker via ett kommandoradsverktyg. Importverktyget flyttar rader från databasen till Hadoop, och exportverktyget flyttar filer från Hadoop tillbaka till en databastabell.
En typisk import namnger JDBC-anslutningen, källtabellen, destinationskatalogen, den delade kolumnen och mapperantalet:
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
En export vänder flödet. Den läser de avgränsade filer som redan finns i en HDFS-katalog och infogar dem i en befintlig tabell, så måltabellen måste skapas först:
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 ','
Ett nattligt jobb behöver sällan hela tabellen två gånger. En stegvis import registrerar det högsta värdet den redan har sett och börjar därifrån vid nästa körning:
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
Dessa är argumenten som förekommer i nästan alla jobb:
| Argument | Vad den kontrollerar |
|---|---|
--connect |
JDBC URL av käll- eller måldatabasen. |
--table |
Tabell som läses från vid en import eller skrivs till vid en export. |
--target-dir |
HDFS-katalogen som tar emot en import. Den får inte redan finnas. |
--export-dir |
HDFS-katalog vars filer läses av en export. |
--split-by |
Kolumn vars intervall är uppdelat över kartuppgifter. |
--num-mappers (-m) |
Antal parallella kartuppgifter. Standardvärdet är fyra. |
--incremental |
Väljer append or lastmodified byta trackung. |
--hive-import |
Skapar matchande Hive-tabell och laddar importerade data till den. |
⚠️ Se upp: En export är inte en enskild transaktion. Varje mappningsuppgift genomför sin egen batch, så ett fel halvvägs kan lämna kvar en del av informationen i måltabellen. Dirigera skrivningen genom en mellanlagringstabell när inläsningen måste vara allt-eller-inget.
Sqoop-projektets status och moderna alternativ
En versionsdetalj är viktig innan något av kommandona ovan går in i en schemaläggare.
Sqoop-utvecklarna röstade för att lägga projektet tillbaka i juni 2021, och flytten till Apache-vinden färdigställdes i juli 2021. Webbplatsen, e-postlistor, git-arkiv, problem tracker och nedladdningar är fortfarande tillgängliga, men skrivskyddade, och inga ytterligare utgåvor är planerade. Den senaste produktionsversionen är Sqoop 1.4.7 från 2017; den separata Sqoop 2-linjen (1.99.x) nådde aldrig funktionsparitet och förklarades aldrig produktionsklar.
Befintliga Sqoop-jobb körs fortfarande, och kommersiella Hadoop-distributioner fortsätter att leverera och stödja verktyget på sina egna plattformar. Nytt inmatningsarbete bygger dock vanligtvis på en av dessa istället:
| Alternativ | Bästa passform |
|---|---|
| Spark med JDBC-datakällan | Batchtabell extracts som redan sitter inuti en Spark pipeline, med partitionerade läsningar istället för mappare. |
| Apache NiFi | Flödesbaserad, visuellt konfigurerad routing mellan många heterogena system. |
| Kafka Connect med en CDC-koppling | Kontinuerlig insamling av ändringsdata istället för ett nattligt batchfönster. |
| Hanterade ETL-plattformar som Talang | Färdigbyggda kopplingar, schemaläggning och avstamning utan handskrivna jobb. |

