使用 DistCp 在 Azure 記憶體 Blob 與 Azure Data Lake Storage Gen1 之間複製數據
如果您有可存取 Azure Data Lake Storage Gen1 的 HDInsight 叢集,您可以使用 DistCp 之類的 Hadoop 生態系統工具將數據複製到 Data Lake Storage Gen1 帳戶,並將數據複製到 HDInsight 叢集記憶體或從 HDInsight 叢集記憶體 (WASB) 複製到 Data Lake Storage Gen1 帳戶。 本文說明如何使用 DistCp 工具。
先決條件
- Azure 訂用帳戶。 請參閱取得 Azure 免費試用。
- Azure Data Lake Storage Gen1 帳戶。 如需如何建立帳戶的指示,請參閱 開始使用 Azure Data Lake Storage Gen1。
- 具有 Data Lake Storage Gen1 帳戶存取權的 Azure HDInsight 叢集。 請參閱 使用 Data Lake Storage Gen1建立 HDInsight 叢集。 請確實為叢集啟用遠端桌面。
使用來自 HDInsight Linux 叢集的 DistCp
HDInsight 叢集隨附 DistCp 工具,可用來將數據從不同的來源複製到 HDInsight 叢集。 如果您已將 HDInsight 叢集設定為使用 Data Lake Storage Gen1 做為額外的記憶體,您可以使用現成的 DistCp,將數據複製到 Data Lake Storage Gen1 帳戶或從 Data Lake Storage Gen1 帳戶複製數據。 在本節中,我們將探討如何使用 DistCp 工具。
從您的桌面使用 SSH 連線到叢集。 請參閱 連線到以Linux為基礎的 HDInsight 叢集。 從 SSH 提示字元執行命令。
確認您是否可以存取 Azure 儲存體 Blob(WASB)。 執行下列命令:
hdfs dfs –ls wasb://<container_name>@<storage_account_name>.blob.core.windows.net/
輸出會提供記憶體 Blob 中的內容清單。
同樣地,請確認您是否可以從叢集存取 Data Lake Storage Gen1 帳戶。 執行下列命令:
hdfs dfs -ls adl://<data_lake_storage_gen1_account>.azuredatalakestore.net:443/
輸出會提供 Data Lake Storage Gen1 帳戶中的檔案和資料夾清單。
使用 DistCp 將數據從 WASB 複製到 Data Lake Storage Gen1 帳戶。
hadoop distcp wasb://<container_name>@<storage_account_name>.blob.core.windows.net/example/data/gutenberg adl://<data_lake_storage_gen1_account>.azuredatalakestore.net:443/myfolder
此命令會將 WASB 中 /example/data/gutenberg/ 資料夾的內容複製到 Data Lake Storage Gen1 帳戶中的 /myfolder 。
同樣地,使用 DistCp 將數據從 Data Lake Storage Gen1 帳戶複製到 WASB。
hadoop distcp adl://<data_lake_storage_gen1_account>.azuredatalakestore.net:443/myfolder wasb://<container_name>@<storage_account_name>.blob.core.windows.net/example/data/gutenberg
此命令會將 Data Lake Storage Gen1 帳戶中 /myfolder 的內容複製到 WASB 中 /example/data/gutenberg/ 資料夾。
使用 DistCp 時的效能考量
因為 DistCp 工具的最低數據粒度是單一檔案,所以設定同步複製數目上限是針對 Data Lake Storage Gen1 優化的最重要參數。 您可以在命令列上設定對應器數量參數('m'),以控制同時複製的數量。 這個參數指定用來複製資料的映射器數目上限。 預設值為 20。
範例:
hadoop distcp wasb://<container_name>@<storage_account_name>.blob.core.windows.net/example/data/gutenberg adl://<data_lake_storage_gen1_account>.azuredatalakestore.net:443/myfolder -m 100
如何判斷映射器的使用數量
以下是一些您可以使用的指引。
步驟 1:判斷 YARN 記憶體總數 - 第一個步驟是判斷可供執行 DistCp 作業之叢集使用的 YARN 記憶體。 您可以在與叢集相關聯的 Ambari 入口網站中取得這項資訊。 流覽至 YARN 並檢視 [組態] 索引標籤,以查看 YARN 記憶體。 若要取得 YARN 記憶體總數,請將每個節點的 YARN 記憶體乘以您在叢集中擁有的節點數目。
步驟 2︰計算映射器數目 - m 的值等於 YARN 記憶體總量除以 YARN 容器大小的商。 Ambari 入口網站中也提供 YARN 容器大小資訊。 流覽至 YARN 並檢視 [組態] 索引標籤。YARN 容器大小會顯示在此視窗中。 到達映射器數目的方程式(m)為:
m = (number of nodes * YARN memory for each node) / YARN container size
範例:
假設叢集中有四個 D14v2 節點,而且您想要從 10 個不同的資料夾傳輸 10 TB 的數據。 每個資料夾包含不同的資料量,且每個資料夾內的檔案大小都不同。
YARN 記憶體總計 - 從 Ambari 入口網站判斷 D14 節點的 YARN 記憶體為 96 GB。 因此,四節點叢集的 YARN 記憶體總計為︰
YARN memory = 4 * 96GB = 384GB
映射器數目 - 從 Ambari 管理入口網站判斷,D14 叢集節點的 YARN 容器記憶體大小為 3072。 因此,映射器的數量如下:
m = (4 nodes * 96GB) / 3072MB = 128 mappers
如果其他應用程式使用記憶體,您可以選擇只針對 DistCp 使用叢集 YARN 記憶體的一部分。
複製大型資料集
當要移動的數據集大小很大時(例如,> 1 TB),或如果您有許多不同的資料夾,請考慮使用多個 DistCp 作業。 可能沒有效能提升,但它會分散作業,如此一來,如果有任何作業失敗,您只需要重新啟動該特定作業,而不是整個作業。
局限性
DistCp 會嘗試建立大小相似的對應程式,以最佳化效能。 增加映射器的數目未必會提高效能。
DistCp 受限於每個檔案只有一個映射器。 因此,您使用的映射器數目不應該超過擁有的檔案數目。 因為 DistCp 只能將一個映射器指派給檔案,因此這會限制複製大型檔案時的同時執行程度。
如果您有少量的大型檔案,請將它們分割成 256 MB 的檔案區塊,以提供更多可能的並行存取。
如果您要從 Azure Blob 記憶體帳戶複製,您的複製作業可能會在 Blob 記憶體端進行節流。 這會降低複製作業的效能。 若要深入瞭解 Azure Blob 記憶體的限制,請參閱 azure 記憶體限制,Azure 訂用帳戶和服務限制。