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.

  • 🔘 Definition: Sqoop överför bulkdata mellan strukturerade butiker och HDFS via ett plugin-baserat kopplingslager.
  • ☑️ Architecture: Varje jobb kompileras till ett MapReduce-program som endast använder kartan, vars uppgifter drar separata skivor av tabellen parallellt.
  • ✅ Anslutningar: Paketerat drivrutinsskydd MySQL, PostgreSQL, Oracle, SQL Server och DB2, plus en generisk JDBC-reserv.
  • 🧪 kommandon: Importverktyget hämtar en tabell till HDFS, Hive eller HBase; exportverktyget skickar tillbaka bearbetade filer till en tabell.
  • 🛠️ Laddningslägen: Fullständiga laddningar kopierar en hel tabell, medan inkrementella lägen append och lastmodified bara hämtar nya rader.
  • ⚠️ Projektstatus: Sqoop gick i pension till Apache-loftet i juli 2021, så Spark JDBC och NiFi har nu nya pipelines.

Apache Sqoop-handledning som täcker arkitektur, kopplingar och import- och exportkommandon

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.

Sqoop-arkitekturdiagram som visar kopplingslagret som länkar ett RDBMS till ett Hadoop-kluster

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:

  1. 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.
  2. 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-tables kopierar varje tabell i ett schema i ett svep.
  • Stegvis belastning: append läge tracks en monotont ökande kolumn såsom en surrogatnyckel, medan lastmodified lä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.

Vanliga frågor

Sqoop 1 är den enda kommandoradsklienten som varje handledning använder. Sqoop 2 lade till en server, ett REST API och ett webbgränssnitt, men den nådde aldrig funktionsparitet och markerades aldrig som produktionsklar, så 1.4.x-raden förblev standard.

Modeller profilerar källtabeller för att härleda typer, nycklar och dela kolumner, föreslå partitionsgränser från radfördelning och flagga schemaavvikelser innan en belastning bryts. De föreslår också stegvisa kontrollkolumner genom att identifiera monotont eller tidsstämpelbeteende i exempeldata.

Copilot utarbetar argumentskelettet snabbt, men den blandar syntaxen för Sqoop 1 och Sqoop 2 och uppfinner flaggor som ingen version accepterar. Kontrollera varje argument mot Sqoop användarhandboken för den installerade versionen innan jobbet schemaläggs.

Sqoop kan inte välja en delad kolumn på egen hand och importen misslyckas. Antingen namnge en lämplig numerisk kolumn eller datumkolumn explicit som den delade kolumnen, eller tvinga fram en enskild mappningsuppgift som serialiserar överföringen.

Ett lösenord som skrivs in på kommandoraden är synligt för alla som listar processer. Lagra det i en HDFS-fil som endast är läsbar för jobbägaren och peka argumentet password-file mot det, eller använd den interaktiva prompten istället.

Avgränsad text är standardinställningen. SequenceFile, Avro och Parquet stöds också, och vart och ett väljs med sitt eget argument. Kolumnformad Parquet passar senare analytiska frågor, medan avgränsad text är den enklaste att inspektera och mata in i en export.

Fyra är standardvärdet och en rimlig början. Fler mappare innebär fler samtidiga anslutningar till databasen, så det praktiska taket är vad källservern tolererar snarare än vad Hadoop-klustret kan schemalägga.

A Java körtid, en konfigurerad Hadoop klienten som kan nå klustret, och JDBC-drivrutins-JAR-filen för måldatabasen som placeras i Sqoop-bibliotekskatalogen. Saknade drivrutins-JAR-filer är det vanligaste felet vid första körningen.

Sammanfatta detta inlägg med: