Copiare dati tra Data Lake Storage Gen1 e il database SQL di Azure usando Sqoop
Informazioni su come usare Apache Sqoop per importare ed esportare dati tra il database SQL di Azure e Azure Data Lake Storage Gen1.
Che cos'è Sqoop?
Le applicazioni Big Data sono una scelta naturale per l'elaborazione di dati non strutturati e semistrutturati, ad esempio log e file. Tuttavia, potrebbe anche essere necessario elaborare dati strutturati archiviati in database relazionali.
Apache Sqoop è uno strumento progettato per trasferire dati tra database relazionali e un repository big data, ad esempio Data Lake Storage Gen1. È possibile usarli per importare dati da un sistema di gestione di database relazionale (RDBMS), ad esempio il database SQL di Azure in Data Lake Storage Gen1. È quindi possibile trasformare e analizzare i dati usando carichi di lavoro di Big Data e quindi esportare nuovamente i dati in rdbms. In questo articolo si usa un database nel database SQL di Azure come database relazionale da cui importare/esportare.
Prerequisiti
Prima di iniziare, devi avere il seguente:
- Un abbonamento di Azure. Vedere Ottenere una versione di prova gratuita di Azure.
- Un account di Azure Data Lake Storage Gen1. Per istruzioni su come creare l'account, vedere Introduzione ad Azure Data Lake Storage Gen1
- cluster Azure HDInsight con accesso a un account di Data Lake Storage Gen1. Consulta Creare un cluster HDInsight con Data Lake Storage Gen1. Questo articolo presuppone che si disponga di un cluster HDInsight Linux con accesso a Data Lake Storage Gen1.
- Database SQL di Azure. Per istruzioni su come creare un database nel database SQL di Azure, vedere Creare un database nel database SQL di Azure
Creare tabelle di esempio nel database
Per iniziare, creare due tabelle di esempio nel database. Usare SQL Server Management Studio o Visual Studio per connettersi al database e quindi eseguire le query seguenti.
Crea tabella1
CREATE TABLE [dbo].[Table1]( [ID] [int] NOT NULL, [FName] [nvarchar](50) NOT NULL, [LName] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [ID] ASC ) ) ON [PRIMARY] GO
Crea tabella2
CREATE TABLE [dbo].[Table2]( [ID] [int] NOT NULL, [FName] [nvarchar](50) NOT NULL, [LName] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Table_2] PRIMARY KEY CLUSTERED ( [ID] ASC ) ) ON [PRIMARY] GO
Eseguire il comando seguente per aggiungere alcuni dati di esempio a Table1. Lasciare vuota la tabella 2 . Successivamente, si importeranno i dati da Table1 in Data Lake Storage Gen1. I dati verranno quindi esportati da Data Lake Storage Gen1 in Table2.
INSERT INTO [dbo].[Table1] VALUES (1,'Neal','Kell'), (2,'Lila','Fulton'), (3, 'Erna','Myers'), (4,'Annette','Simpson');
Usare Sqoop da un cluster HDInsight con accesso a "Data Lake Storage Gen1"
Un cluster HDInsight include già i pacchetti Sqoop disponibili. Se il cluster HDInsight è stato configurato per l'uso di Data Lake Storage Gen1 come risorsa di archiviazione aggiuntiva, è possibile usare Sqoop (senza modifiche di configurazione) per importare/esportare dati tra un database relazionale, ad esempio il database SQL di Azure e un account Data Lake Storage Gen1.
Per questo articolo si presuppone che sia stato creato un cluster Linux in modo da usare SSH per connettersi al cluster. Consulta Connettersi a un cluster HDInsight basato su Linux.
Verificare se è possibile accedere all'account Data Lake Storage Gen1 dal cluster. Eseguire il comando seguente dal prompt SSH:
hdfs dfs -ls adl://<data_lake_storage_gen1_account>.azuredatalakestore.net/
Questo comando fornisce un elenco di file/cartelle nell'account Data Lake Storage Gen1.
Importare dati dal database SQL di Azure in Data Lake Storage Gen1
Passare alla directory in cui sono disponibili i pacchetti Sqoop. In genere, questa posizione è
/usr/hdp/<version>/sqoop/bin
.Importare i dati da Table1 nell'account Data Lake Storage Gen1. Usare la sintassi seguente:
sqoop-import --connect "jdbc:sqlserver://<sql-database-server-name>.database.windows.net:1433;username=<username>@<sql-database-server-name>;password=<password>;database=<sql-database-name>" --table Table1 --target-dir adl://<data-lake-storage-gen1-name>.azuredatalakestore.net/Sqoop/SqoopImportTable1
Il segnaposto sql-database-server-name rappresenta il nome del server in cui è in esecuzione il database. il segnaposto sql-database-name rappresenta il nome effettivo del database.
Ad esempio:
sqoop-import --connect "jdbc:sqlserver://mysqoopserver.database.windows.net:1433;username=user1@mysqoopserver;password=<password>;database=mysqoopdatabase" --table Table1 --target-dir adl://myadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1
Verificare che i dati siano stati trasferiti all'account Data Lake Storage Gen1. Eseguire il comando seguente:
hdfs dfs -ls adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/
Dovresti vedere il seguente output.
-rwxrwxrwx 0 sshuser hdfs 0 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/_SUCCESS -rwxrwxrwx 0 sshuser hdfs 12 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/part-m-00000 -rwxrwxrwx 0 sshuser hdfs 14 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/part-m-00001 -rwxrwxrwx 0 sshuser hdfs 13 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/part-m-00002 -rwxrwxrwx 0 sshuser hdfs 18 2016-02-26 21:09 adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/part-m-00003
Ogni file part-m-* corrisponde a una riga nella tabella di origine Table1. È possibile visualizzare il contenuto dei file part-m-* da verificare.
Esportare dati da Data Lake Storage Gen1 nel database SQL di Azure
Esportare i dati dall'account Data Lake Storage Gen1 alla tabella vuota Table2 nel database SQL di Azure. Utilizzare la seguente sintassi.
sqoop-export --connect "jdbc:sqlserver://<sql-database-server-name>.database.windows.net:1433;username=<username>@<sql-database-server-name>;password=<password>;database=<sql-database-name>" --table Table2 --export-dir adl://<data-lake-storage-gen1-name>.azuredatalakestore.net/Sqoop/SqoopImportTable1 --input-fields-terminated-by ","
Ad esempio:
sqoop-export --connect "jdbc:sqlserver://mysqoopserver.database.windows.net:1433;username=user1@mysqoopserver;password=<password>;database=mysqoopdatabase" --table Table2 --export-dir adl://myadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1 --input-fields-terminated-by ","
Verificare che i dati siano stati caricati nella tabella del database SQL. Usare SQL Server Management Studio o Visual Studio per connettersi al database SQL di Azure e quindi eseguire la query seguente.
SELECT * FROM TABLE2
Questo comando deve avere l'output seguente.
ID FName LName ------------------- 1 Neal Kell 2 Lila Fulton 3 Erna Myers 4 Annette Simpson
Considerazioni sulle prestazioni durante l'uso di Sqoop
Per informazioni sull'ottimizzazione delle prestazioni del processo Sqoop per copiare i dati in Data Lake Storage Gen1, vedere il post di blog sulle prestazioni di Sqoop.