使用 Curl 在 HDInsight 中執行 Apache Sqoop 作業
了解如何使用 Curl 在 HDInsight 中的 Apache Hadoop 叢集上執行 Apache Sqoop 作業。 本文示範如何使用 Curl 從 Azure 儲存體匯出資料,並將其匯入至 SQL Server 資料庫。 本文是搭配使用 Apache Sqoop 與 HDInsight 中的 Hadoop的接續內容。
本文件使用 Curl 示範如何使用未經處理的 HTTP 要求來與 HDInsight 互動,以便執行、監視和擷取 Sqoop 作業的結果。 要想執行這些作業,就要使用 HDInsight 叢集所提供的 WebHCat REST API (先前稱為 Templeton)。
必要條件
要查詢 Azure SQL Database 的用戶端。 請考慮使用 SQL Server Management Studio 或 Visual Studio Code。
Curl。 Curl 是將資料傳送至 HDInsight 叢集或從 HDInsight 叢集傳送資料的工具。
jq。 jq 公用程式用來處理從 REST 要求傳回的 JSON 資料。
熟悉 Sqoop。 如需詳細資訊,請參閱 Sqoop 使用者指南。
使用 Curl 提交 Apache Sqoop 作業
使用 Curl,搭配 Apache Sqoop 作業將資料從 Azure 儲存體匯出至 SQL Server。
注意
在使用 Curl 或與 WebHCat 進行任何其他 REST 通訊時,您必須提供 HDInsight 叢集系統管理員的使用者名稱和密碼來驗證要求。 您也必須在用來將要求傳送至伺服器的統一資源識別項 (URI) 中使用叢集名稱。
針對本節中的命令,請將 USERNAME
取代為要向叢集驗證的使用者,並將 PASSWORD
取代為使用者帳戶的密碼。 將 CLUSTERNAME
取代為您的叢集名稱。
透過 基本驗證來保護 REST API 的安全。 您應該一律使用安全 HTTP (HTTPS) 提出要求,確保認證安全地傳送至伺服器。
為了方便使用,請設定下列變數。 此範例是以 Windows 環境為基礎,請根據您的環境需求進行修改。
set CLUSTERNAME= set USERNAME=admin set PASSWORD= set SQLDATABASESERVERNAME= set SQLDATABASENAME= set SQLPASSWORD= set SQLUSER=sqluser
從命令列中,使用下列命令來確認您可以連線到 HDInsight 叢集:
curl -u %USERNAME%:%PASSWORD% -G https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/status
您應該會收到如下所示的回應:
{"status":"ok","version":"v1"}
使用以下命令提交 Sqoop 作業:
curl -u %USERNAME%:%PASSWORD% -d user.name=%USERNAME% -d command="export --connect jdbc:sqlserver://%SQLDATABASESERVERNAME%.database.windows.net;user=%SQLUSER%@%SQLDATABASESERVERNAME%;password=%PASSWORD%;database=%SQLDATABASENAME% --table log4jlogs --export-dir /example/data/sample.log --input-fields-terminated-by \0x20 -m 1" -d statusdir="wasb:///example/data/sqoop/curl" https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/sqoop
此命令中使用的參數如下:
-d - 因為未使用
-G
,所以要求預設為使用 POST 方法。-d
可指定與要求一起傳送的資料值。user.name - 執行命令的使用者。
命令 - 要執行的 Sqoop 命令。
statusdir - 要寫入此工作狀態的目錄。
此命令將會傳回可用來檢查工作狀態的工作識別碼。
{"id":"job_1415651640909_0026"}
若要檢查工作的狀態,請使用下列命令。 將
JOBID
取代為上一個步驟中所傳回的值。 例如,如果傳回值為{"id":"job_1415651640909_0026"}
,則JOBID
將是job_1415651640909_0026
。 視需要修改jq
的位置。set JOBID=job_1415651640909_0026 curl -G -u %USERNAME%:%PASSWORD% -d user.name=%USERNAME% https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/jobs/%JOBID% | C:\HDI\jq-win64.exe .status.state
如果工作已完成,則狀態會是 [ 成功]。
注意
此 Curl 要求會傳回含有工作資訊的 JavaScript Object Notation (JSON) 文件;jq 可用來僅擷取狀態值。
工作狀態變更為 [成功] 之後,即可從 Azure Blob 儲存體擷取工作結果。 與查詢一起傳遞的
statusdir
參數包含輸出檔案的位置;在此案例中為wasb:///example/data/sqoop/curl
。 此位址會將作業輸出儲存在 HDInsight 叢集所使用預設儲存體容器的example/data/sqoop/curl
目錄中。您可以使用 Azure 入口網站存取 stderr 和 stdout Blob。
若要確認是否已匯出資料,請從 SQL 用戶端使用下列查詢,以檢視匯出的資料:
SELECT COUNT(*) FROM [dbo].[log4jlogs] WITH (NOLOCK); SELECT TOP(25) * FROM [dbo].[log4jlogs] WITH (NOLOCK);
限制
- 大量匯出 - 使用 Linux 型 HDInsight,用來將資料匯出至 Microsoft SQL Server 或 Azure SQL Database 的 Sqoop 連接器目前不支援大量插入。
- 批次處理 - 使用 Linux 型 HDInsight,執行插入時若使用
-batch
參數,Sqoop 將會執行多個插入,而不是批次處理插入作業。
摘要
如這份文件所示,您可以使用原始 HTTP 要求來執行、監視和檢視 HDInsight 叢集上的 Sqoop 作業結果。
如需本文中使用的 REST 介面的詳細資訊,請參閱 Apache Sqoop REST API 指南。
下一步
在 HDInsight 將 Apache Sqoop 與 Apache Hadoop 搭配使用
如需涉及 curl 的其他 HDInsight 文章: