Copiar dados entre Data Lake Storage Gen1 e a Base de Dados SQL do Azure com o Sqoop

Saiba como utilizar o Apache Sqoop para importar e exportar dados entre a Base de Dados do SQL do Azure e o Azure Data Lake Storage Gen1.

O que é o Sqoop?

As aplicações de macrodados são uma opção natural para processar dados não estruturados e semiestruturados, como registos e ficheiros. No entanto, também poderá ter a necessidade de processar dados estruturados armazenados em bases de dados relacionais.

O Apache Sqoop é uma ferramenta concebida para transferir dados entre bases de dados relacionais e um repositório de macrodados, como Data Lake Storage Gen1. Pode utilizá-la para importar dados de um sistema de gestão de bases de dados relacionais (RDBMS), como SQL do Azure Database para Data Lake Storage Gen1. Em seguida, pode transformar e analisar os dados com cargas de trabalho de macrodados e, em seguida, exportar os dados de volta para um RDBMS. Neste artigo, vai utilizar uma base de dados na Base de Dados SQL do Azure como base de dados relacional para importar/exportar.

Pré-requisitos

Antes de começar, tem de ter o seguinte:

Criar tabelas de exemplo na base de dados

  1. Para começar, crie duas tabelas de exemplo na base de dados. Utilize SQL Server Management Studio ou Visual Studio para ligar à base de dados e, em seguida, execute as seguintes consultas.

    Criar Tabela1

    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
    

    Criar Tabela2

    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. Execute o seguinte comando para adicionar alguns dados de exemplo à Tabela1. Deixe a Tabela2 vazia. Mais tarde, irá importar dados da Tabela1 para Data Lake Storage Gen1. Em seguida, irá exportar dados de Data Lake Storage Gen1 para a Tabela2.

    INSERT INTO [dbo].[Table1] VALUES (1,'Neal','Kell'), (2,'Lila','Fulton'), (3, 'Erna','Myers'), (4,'Annette','Simpson');
    

Utilizar o Sqoop a partir de um cluster do HDInsight com acesso a Data Lake Storage Gen1

Um cluster do HDInsight já tem os pacotes sqoop disponíveis. Se tiver configurado o cluster do HDInsight para utilizar Data Lake Storage Gen1 como armazenamento adicional, pode utilizar o Sqoop (sem alterações de configuração) para importar/exportar dados entre uma base de dados relacional, como a Base de Dados SQL do Azure e uma conta de Data Lake Storage Gen1.

  1. Neste artigo, partimos do princípio de que criou um cluster do Linux, pelo que deve utilizar o SSH para ligar ao cluster. Veja Ligar a um cluster do HDInsight baseado em Linux.

  2. Verifique se consegue aceder à conta Data Lake Storage Gen1 a partir do cluster. Execute o seguinte comando a partir da linha de comandos SSH:

    hdfs dfs -ls adl://<data_lake_storage_gen1_account>.azuredatalakestore.net/
    

    Este comando fornece uma lista de ficheiros/pastas na conta Data Lake Storage Gen1.

Importar dados da Base de Dados do SQL do Azure para Data Lake Storage Gen1

  1. Navegue para o diretório onde os pacotes do Sqoop estão disponíveis. Normalmente, esta localização é /usr/hdp/<version>/sqoop/bin.

  2. Importe os dados da Tabela1 para a conta Data Lake Storage Gen1. Utilize a seguinte sintaxe:

    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
    

    O marcador de posição sql-database-server-name representa o nome do servidor onde a base de dados está em execução. o marcador de posição sql-database-name representa o nome real da base de dados.

    Por exemplo,

    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. Verifique se os dados foram transferidos para a conta Data Lake Storage Gen1. Execute o seguinte comando:

    hdfs dfs -ls adl://hdiadlsg1store.azuredatalakestore.net/Sqoop/SqoopImportTable1/
    

    Deverá ver o seguinte resultado.

    -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
    

    Cada ficheiro part-m-* corresponde a uma linha na tabela de origem, Table1. Pode ver o conteúdo dos ficheiros part-m-* a verificar.

Exportar dados de Data Lake Storage Gen1 para a Base de Dados do SQL do Azure

  1. Exporte os dados da conta Data Lake Storage Gen1 para a tabela vazia, Table2, na Base de Dados do SQL do Azure. Utilize a seguinte sintaxe.

    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 ","
    

    Por exemplo,

    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. Verifique se os dados foram carregados para a tabela Base de Dados SQL. Utilize SQL Server Management Studio ou Visual Studio para ligar à Base de Dados do SQL do Azure e, em seguida, execute a seguinte consulta.

    SELECT * FROM TABLE2
    

    Este comando deve ter o seguinte resultado.

     ID  FName    LName
    -------------------
    1    Neal     Kell
    2    Lila     Fulton
    3    Erna     Myers
    4    Annette  Simpson
    

Considerações de desempenho ao utilizar o Sqoop

Para obter informações sobre a otimização do desempenho da tarefa do Sqoop para copiar dados para Data Lake Storage Gen1, veja a mensagem do blogue de desempenho do Sqoop.

Passos seguintes