使用 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 中的資料庫做為匯入/匯出的來源關聯式資料庫。
必要條件
開始之前,您必須具備下列條件:
- Azure 訂用帳戶。 請參閱取得 Azure 免費試用。
- Azure Data Lake Storage Gen1 帳戶。 如需有關如何建立帳戶的指示,請參閱開始使用 Azure Data Lake Storage Gen1
- 可存取 Data Lake Storage Gen1 帳戶的 Azure HDInsight 叢集。 請參閱建立搭配 Data Lake Storage Gen1 的 HDInsight 叢集。 本文假設您已使用 Azure Data Lake Storage Gen1 存取 HDInsight Linux 叢集。
- Azure SQL Database。 如需有關如何在 Azure SQL Database 中建立資料庫的指示,請參閱在 Azure SQL Database 中建立資料庫
在資料庫中建立範例資料表
若要開始,請建立兩個範例資料表。 使用 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
執行下列命令,將一些範例資料新增至 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 帳戶之間匯入/匯出資料。
在本文中,我們假設您已經建立 Linux 叢集,因此您應該使用 SSH 來連線至叢集。 請參閱 連線至以 Linux 為基礎的 HDInsight 叢集。
請確認您是否可從叢集存取 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
瀏覽至提供 Sqoop 封裝的目錄。 通常此位置是
/usr/hdp/<version>/sqoop/bin
。從 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
請確認資料已被傳輸至 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
從 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 ","
確認資料已上傳至 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 效能部格格文章。