Copiare dati tra Data Lake Storage Gen1 e database Azure SQL usando Sqoop
Informazioni su come usare Apache Sqoop per importare ed esportare dati tra un database SQL di Azure e Azure Data Lake Storage Gen1.
Informazioni su Sqoop
Le applicazioni Big Data sono una scelta naturale per l'elaborazione di dati non strutturati e semi-strutturati, ad esempio log e file. Tuttavia, potrebbe essere necessario elaborare anche i dati strutturati archiviati nei database relazionali.
Apache Sqoop è uno strumento progettato per trasferire i dati tra database relazionali e un repository Big Data, ad esempio Data Lake Storage Gen1. È possibile usarlo per importare dati da un sistema di gestione di database relazionali (RDBMS), ad esempio un database SQL di Azure, in Data Lake Storage Gen1. È quindi possibile trasformare e analizzare i dati usando carichi di lavoro Big Data e quindi esportare nuovamente i dati in un servizio RDBMS. In questo articolo viene usato un database in Azure SQL Database come database relazionale da cui importare/esportare.
Prerequisiti
Per eseguire le procedure descritte è necessario:
- Una sottoscrizione di Azure. Vedere Ottenere una versione di prova gratuita di Azure.
- Un account Azure Data Lake Storage Gen1. Per istruzioni su come creare l'account, vedere Introduzione a Azure Data Lake Storage Gen1
- Cluster HDInsight di Azure con accesso a un account Data Lake Storage Gen1. Vedere Creare un cluster HDInsight con Data Lake Storage Gen1. Questo articolo presuppone un cluster HDInsight Linux con accesso a Data Lake Storage Gen1.
- Database SQL di Azure. Per istruzioni su come creare un database in Azure SQL Database, vedere Creare un database in Azure SQL Database
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 ed eseguire le query seguenti.
Create Table1
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
Create Table2
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 Table2 . Successivamente, si importano dati da Table1 in Data Lake Storage Gen1. Verranno quindi esportati dati 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
In un cluster HDInsight sono già disponibili i pacchetti di Sqoop. Se è stato configurato il cluster HDInsight 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 Azure SQL Database 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. Vedere Connettersi a un cluster HDInsight basato su Linux.
Analogamente, verificare se è possibile accedere all'account di 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 da un database SQL di Azure a Data Lake Storage Gen1
Passare alla directory in cui sono disponibili i pacchetti di Sqoop. In genere, questa posizione è
/usr/hdp/<version>/sqoop/bin
.Importare i dati da Table1 all'account di 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. 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/
Viene visualizzato l'output seguente.
-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 i contenuti dei file part-m-* per la verifica.
Esportare dati da Data Lake Storage Gen1 a un database SQL di Azure
Esportare i dati dall'account di Data Lake Storage Gen1 alla tabella vuota, Table2, nel database SQL di Azure. Usare la sintassi seguente.
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 per 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.