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:

Creare tabelle di esempio nel database

  1. 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
    
  2. 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.

  1. 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.

  2. 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

  1. Passare alla directory in cui sono disponibili i pacchetti di Sqoop. In genere, questa posizione è /usr/hdp/<version>/sqoop/bin.

  2. 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
    
  3. 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

  1. 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 ","
    
  2. 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.

Passaggi successivi