使用 Sqoop 在 Data Lake Storage Gen1 和 Azure SQL Database 之間複製資料

了解如何使用 Apache Sqoop 在 Azure SQL Database 和 Azure Data Lake Storage Gen1 之間匯入及匯出資料。

什麼是 Sqoop?

巨量資料應用程式是處理非結構化和半結構化資料 (例如記錄和檔案),很自然的一個選擇。 不過,也有可能需要處理儲存在關聯式資料庫中的結構化資料。

Apache Sqoop 是一個專門設計來在關聯式資料庫和巨量資料儲存機制 (例如 Azure Data Lake Storage Gen1) 之間傳送資料的工具。 您可以使用它從像是 Azure SQL Database 這類的關聯式資料庫管理系統 (RDBMS),匯入資料至 Azure Data Lake Storage Gen1。 您可以使用巨量資料工作負載來轉換和分析資料,然後重新將資料匯出到 RDBMS。 在本文中,您會使用 Azure SQL Database 中的資料庫做為匯入/匯出的來源關聯式資料庫。

必要條件

開始之前,您必須具備下列條件:

在資料庫中建立範例資料表

  1. 若要開始,請建立兩個範例資料表。 使用 SQL Server Management Studio 或 Visual Studio 連接至資料庫,然後執行下列查詢。

    建立 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
    

    建立 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. 執行下列命令,將一些範例資料新增至 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');
    

從使用 Data Lake Storage Gen1 存取的 HDInsight Linux 叢集使用 Sqoop

HDInsight 叢集已有可用的 Sqoop 套件。 如果您已設定 HDInsight 叢集使用 Data Lake Storage Gen1 做為額外的儲存體,則可以使用 Sqoop (不需要任何設定變更) 在關聯式資料庫 (例如 Azure SQL Database) 與 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 Database 將資料匯入至 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 Database

  1. 從 Data Lake Storage Gen1 帳戶將資料匯出到 Azure SQL Database 中的空白資料表 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 Database 資料表。 使用 SQL Server Management Studio 或 Visual Studio 連接至 Azure SQL Database,然後執行下列查詢。

    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 效能部格格文章

下一步