使用 Sqoop 在 Data Lake Storage Gen1 和 Azure SQL 数据库之间复制数据

了解如何使用 Apache Sqoop 在 Azure SQL 数据库和 Azure Data Lake Storage Gen1 之间导入和导出数据。

什么是 Sqoop?

大数据应用程序是处理非结构化和半结构化数据(如日志和文件)的自然选择。 但是,你可能还需要处理存储在关系数据库中的结构化数据。

Apache Sqoop 是一种用于在关系数据库与大数据存储库(如 Data Lake Storage Gen1)之间传输数据的工具。 可以使用它将数据从关系数据库管理系统(RDBMS)(如 Azure SQL 数据库)导入 Data Lake Storage Gen1。 然后,可以使用大数据工作负载转换和分析数据,然后将数据导出回 RDBMS。 在本文中,您将使用 Azure SQL 数据库中的一个数据库作为关系数据库,以进行导入和导出操作。

先决条件

在开始之前,必须满足以下条件:

在数据库中创建示例表

  1. 首先,在数据库中创建两个示例表。 使用 SQL Server Management Studio 或 Visual Studio 连接到数据库,然后运行以下查询。

    创建表 1

    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
    

    创建表 2

    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. 运行以下命令,将一些示例数据添加到 Table1。 将 Table2 留空。 稍后,你将将数据从 Table1 导入 Data Lake Storage Gen1。 然后,将数据从 Data Lake Storage Gen1 导出到 Table2

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

从 HDInsight 群集使用 Sqoop 访问 Data Lake Storage Gen1

HDInsight 群集已提供 Sqoop 包。 如果已将 HDInsight 群集配置为使用 Data Lake Storage Gen1 作为附加存储,则可以使用 Sqoop(没有任何配置更改)在关系数据库(如 Azure SQL 数据库)和 Data Lake Storage Gen1 帐户之间导入/导出数据。

  1. 在本文中,我们假设你创建了 Linux 群集,因此应使用 SSH 连接到群集。 请参阅第 节,了解如何连接到基于 Linux 的 HDInsight 群集

  2. 验证是否可以从群集访问 Data Lake Storage Gen1 帐户。 从 SSH 提示符运行以下命令:

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

    此命令提供 Data Lake Storage Gen1 帐户中的文件/文件夹列表。

将数据从 Azure SQL 数据库导入 Data Lake Storage Gen1

  1. 导航到 Sqoop 包可用的目录。 通常,此位置为 /usr/hdp/<version>/sqoop/bin.

  2. 将数据从 Table1 导入 Data Lake Storage Gen1 帐户。 使用以下语法:

    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
    

    sql-database-server-name 占位符表示运行数据库的服务器的名称。 sql-database-name 占位符表示实际的数据库名称。

    例如,

    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. 验证数据是否已传输到 Data Lake Storage Gen1 帐户。 运行下面的命令:

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

    你会看到以下输出。

    -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
    

    每个 part-m-* 文件对应于源表 Table1 中的一行。 可以查看 part-m-* 文件的内容进行验证。

将数据从 Data Lake Storage Gen1 导出到 Azure SQL 数据库

  1. 将数据从 Data Lake Storage Gen1 帐户导出到 Azure SQL 数据库中的空表 Table2。 使用下列语法:

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

    例如,

    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. 验证数据是否已上传到 SQL 数据库表。 使用 SQL Server Management Studio 或 Visual Studio 连接到 Azure SQL 数据库,然后运行以下查询。

    SELECT * FROM TABLE2
    

    此命令应具有以下输出。

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

使用 Sqoop 时的性能注意事项

有关优化 Sqoop 作业以将数据复制到 Data Lake Storage Gen1 的性能的信息,请参阅 Sqoop 性能博客文章

后续步骤