共用方式為


從內部部署的 HDFS 存放區遷移至具有 Azure 資料箱的 Azure 儲存體

您可以使用數據箱裝置,將數據從 Hadoop 叢集的內部部署 HDFS 存放區移轉至 Azure 儲存體 (Blob 記憶體或 Data Lake Storage)。 您可選擇資料箱磁碟、80 TB 的資料箱或 770 TB 的 Data Box Heavy。

本文可協助您完成下列工作:

  • 準備遷移您的資料
  • 將您的資料複製到資料箱磁碟、資料箱或 Data Box Heavy 裝置
  • 將裝置寄回給 Microsoft
  • 將存取權限套用至檔案和目錄(僅限 Data Lake Storage)

必要條件

您需要這些專案才能完成移轉。

準備好後就可以開始進行。

將您的資料複製到資料箱裝置

如果您的資料能放入單一資料箱裝置,請將資料複製到資料箱裝置。

如果您的資料大小超過資料箱裝置的容量,請使用選擇性程式將資料分割到多個資料箱裝置,然後執行此步驟。

若要將資料從內部部署 HDFS 存放區複製到資料箱裝置,您需要進行一些設定,然後使用 DistCp 工具。

請遵循下列步驟,透過 Blob/物件儲存體的 REST API 將資料複製到您的資料箱裝置。 REST API 介面會讓裝置顯示為叢集的 HDFS 存放區。

  1. 透過 REST 複製資料之前,請先找出安全性和連線基本型別,以連接到資料箱上的 REST 介面或 Data Box Heavy。 登入資料箱的本機 web UI,然後移至連線並複製頁面。 針對您裝置的 Azure 儲存體帳戶,在存取設定下找出並選取 [REST]

    [連線並複製] 頁面

  2. 從 [存取儲存體帳戶並上傳資料] 對話方塊中,複製 [Blob 服務端點] 和 [儲存體帳戶金鑰]。 從 Blob 服務端點,省略 https:// 和結尾的斜線。

    在此情況下,端點為:https://mystorageaccount.blob.mydataboxno.microsoftdatabox.com/。 您使用的 URI 主機部分是:mystorageaccount.blob.mydataboxno.microsoftdatabox.com。 如需範例,請參閱如何透過 HTTP 連線 REST

    [存取記憶體帳戶並上傳數據] 對話框

  3. 在每個節點上,將端點和資料箱或 Data Box Heavy 節點 IP 位址新增至 /etc/hosts

    10.128.5.42  mystorageaccount.blob.mydataboxno.microsoftdatabox.com
    

    如果您使用 DNS 的其他機制,您應確認該機制可以解析資料箱端點。

  4. 將殼層變數 azjars 設定為 hadoop-azureazure-storage jar 檔案的位置。 您可以在 Hadoop 安裝目錄下找到這些檔案。

    若要判斷這些檔案是否存在,請使用下列命令:ls -l $<hadoop_install_dir>/share/hadoop/tools/lib/ | grep azure。 將 <hadoop_install_dir> 預留位置取代為您已安裝 Hadoop 的目錄路徑。 請務必使用完整路徑。

    範例:

    azjars=$hadoop_install_dir/share/hadoop/tools/lib/hadoop-azure-2.6.0-cdh5.14.0.jar azjars=$azjars,$hadoop_install_dir/share/hadoop/tools/lib/microsoft-windowsazure-storage-sdk-0.6.0.jar

  5. 建立您想要用於資料複製的儲存體容器。 您也應該將目的地目錄指定為此命令的一部分。 這可能是虛擬目的地目錄。

    hadoop fs -libjars $azjars \
    -D fs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \
    -D fs.azure.account.key.<blob_service_endpoint>=<account_key> \
    -mkdir -p  wasb://<container_name>@<blob_service_endpoint>/<destination_directory>
    
    • <blob_service_endpoint> 預留位置取代為您 Blob 服務端點的名稱。

    • <account_key> 預留位置取代為您帳戶的存取金鑰。

    • <container-name> 預留位置取代為您的容器名稱。

    • <destination_directory> 預留位置取代為您想要將資料複製到其中的目錄名稱。

  6. 執行清單命令,以確保您的容器和目錄已建立。

    hadoop fs -libjars $azjars \
    -D fs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \
    -D fs.azure.account.key.<blob_service_endpoint>=<account_key> \
    -ls -R  wasb://<container_name>@<blob_service_endpoint>/
    
    • <blob_service_endpoint> 預留位置取代為您 Blob 服務端點的名稱。

    • <account_key> 預留位置取代為您帳戶的存取金鑰。

    • <container-name> 預留位置取代為您的容器名稱。

  7. 將資料從 Hadoop HDFS 複製到資料箱 Blob 儲存體,然後複製到您稍早建立的容器。 如果找不到您要複製的目錄,此命令會自動建立該目錄。

    hadoop distcp \
    -libjars $azjars \
    -D fs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \
    -D fs.azure.account.key.<blob_service_endpoint<>=<account_key> \
    -filters <exclusion_filelist_file> \
    [-f filelist_file | /<source_directory> \
           wasb://<container_name>@<blob_service_endpoint>/<destination_directory>
    
    • <blob_service_endpoint> 預留位置取代為您 Blob 服務端點的名稱。

    • <account_key> 預留位置取代為您帳戶的存取金鑰。

    • <container-name> 預留位置取代為您的容器名稱。

    • <exclusion_filelist_file> 預留位置取代為包含您檔案排除清單的檔案名。

    • <source_directory> 預留位置取代為包含您要複製資料的目錄名稱。

    • <destination_directory> 預留位置取代為您想要將資料複製到其中的目錄名稱。

    -libjars 選項可用來讓 hadoop-azure*.jar 和相依 azure-storage*.jar 檔案可供 distcp 使用。 某些叢集可能已經發生此情況。

    下列範例顯示如何使用 distcp 命令來複製資料。

     hadoop distcp \
    -libjars $azjars \
    -D fs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \
    -D fs.azure.account.key.mystorageaccount.blob.mydataboxno.microsoftdatabox.com=myaccountkey \
    -filter ./exclusions.lst -f /tmp/copylist1 -m 4 \
    /data/testfiles \
    wasb://hdfscontainer@mystorageaccount.blob.mydataboxno.microsoftdatabox.com/data
    

    若要改善複製速度:

    • 請嘗試變更對應程式數目。 (對應工具的預設數目為 20。上述範例使用 m = 4 對應工具。)

    • 嘗試 -D fs.azure.concurrentRequestCount.out=<thread_number>。 將 <thread_number> 取代為每個對應程式的執行緒數目。 對應工具數目和每個對應工具的執行緒數目 m*<thread_number> 不應超過 32。

    • 請嘗試以平行方式執行多個 distcp

    • 請記住,大型檔案的執行效能優於小型檔案。

    • 如果您有大於 200 GB 的檔案,建議您使用下列參數將區塊大小變更為 100MB:

    hadoop distcp \ 
    -libjars $azjars \ 
    -Dfs.azure.write.request.size= 104857600 \ 
    -Dfs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \ 
    -Dfs.azure.account.key.<blob_service_endpoint<>=<account_key> \ 
    -strategy dynamic \ 
    -Dmapreduce.map.memory.mb=16384 \ 
    -Dfs.azure.concurrentRequestCount.out=8 \ 
    -Dmapreduce.map.java.opts=-Xmx8196m \ 
    -m 4 \ 
    -update \ 
    /data/bigfile wasb://hadoop@mystorageaccount.blob.core.windows.net/bigfile
    

將資料箱寄送給 Microsoft

遵循下列步驟來準備資料箱裝置並寄送至 Microsoft。

  1. 首先,準備寄送您的資料箱或 Data Box Heavy

  2. 裝置準備完成後,下載 BOM 檔案。 您稍後將會使用這些 BOM 或資訊清單檔來確認已上傳至 Azure 的資料。

  3. 關閉裝置電源並移除纜線。

  4. 與 UPS 排定取貨時間。

  5. Microsoft 收到您的裝置之後,便會連線到資料中心網路,並將資料上傳至您在下單時指定的儲存體帳戶。 針對您已將所有資料上傳至 Azure 的 BOM 檔案進行驗證。

將存取權限套用至檔案和目錄(僅限 Data Lake Storage)

您在 Azure 儲存體帳戶中已有資料。 現在請將存取權限套用至檔案和目錄。

注意

只有在您使用 Azure Data Lake Storage 作為數據存放區時,才需要此步驟。 如果您只使用沒有階層命名空間的 Blob 儲存體帳戶作為資料存放區,則可以略過本節。

為已啟用 Azure Data Lake Storage 的帳戶建立服務主體

若要建立服務主體,請參閱操作說明:使用入口網站來建立可存取資源的 Microsoft Entra 應用程式和服務主體 (部分機器翻譯)。

  • 在執行該文章的將應用程式指派給角色一節中的步驟時,請確實將 [儲存體 Blob 資料參與者] 角色指派給服務主體。

  • 在執行該文章的取得值以便登入一節中的步驟時,請將應用程式識別碼和用戶端密碼值儲存在文字檔中。 您稍後會需要這些資料。

產生複製檔案及其權限的清單

從內部部署 Hadoop 叢集執行此命令:


sudo -u hdfs ./copy-acls.sh -s /{hdfs_path} > ./filelist.json

此命令會產生複製檔案及其權限的清單。

注意

視 HDFS 中的檔案數目而定,此命令可能需要很長的時間才能執行。

產生身分識別清單,並將其對應至 Microsoft Entra 身分識別

  1. 下載 copy-acls.py 指令碼。 請參閱本文的下載協助程式指令碼,並設定您的邊緣節點來執行這些指令碼一節。

  2. 執行此命令以產生唯一身分識別的清單。

    
    ./copy-acls.py -s ./filelist.json -i ./id_map.json -g
    

    此指令碼會產生名為 id_map.json 的檔案,其中包含您需要對應至 ADD 型身分識別的身分識別。

  3. 在文字編輯器中開啟 id_map.json 檔案。

  4. 針對出現在檔案中的每個 JSON 物件,使用適當的對應身分識別,更新 Microsoft Entra 使用者主體名稱 (UPN) 或 ObjectId (OID) 的 target 屬性。 完成之後,請儲存檔案。 您會在下一個步驟中使用此檔案。

將權限套用至複製的檔案並套用身分識別對應

執行此指令,將權限套用至您複製到已啟用 Data Lake Storage 帳戶的資料:

./copy-acls.py -s ./filelist.json -i ./id_map.json  -A <storage-account-name> -C <container-name> --dest-spn-id <application-id>  --dest-spn-secret <client-secret>
  • 使用您的儲存體帳戶名稱取代 <storage-account-name> 預留位置。

  • <container-name> 預留位置取代為您的容器名稱。

  • 以您在建立服務主體時所收集的應用程式識別碼和用戶端密碼取代 <application-id><client-secret> 預留位置。

附錄:跨多個資料箱裝置分割資料

將資料移到資料箱裝置之前,您必須先下載一些協助程式指令碼,確定您的資料已經過整理可放入資料箱裝置,並排除任何不必要的檔案。

下載協助程式指令碼,並設定您的邊緣節點加以執行

  1. 從您內部部署 Hadoop 叢集的邊緣或前端節點,執行此命令:

    
    git clone https://github.com/jamesbak/databox-adls-loader.git
    cd databox-adls-loader
    

    此命令會複製包含協助程式指令碼的 GitHub 存放庫。

  2. 請確定您的本機電腦上已安裝 jq 封裝。

    
    sudo apt-get install jq
    
  3. 安裝要求 Python 套件。

    
    pip install requests
    
  4. 設定必要指令碼的 execute 權限。

    
    chmod +x *.py *.sh
    
    

確定您的資料組織符合資料箱裝置

如果您的資料大小超過單一資料箱裝置的大小,則可以將檔案分割成多個群組,以便儲存至多個資料箱裝置。

如果您的資料未超過單一資料箱裝置的大小,則可以繼續進行下一節。

  1. 使用更高的權限,依照上一節中指導方針執行您下載的 generate-file-list 指令碼。

    以下是命令參數的說明:

    sudo -u hdfs ./generate-file-list.py [-h] [-s DATABOX_SIZE] [-b FILELIST_BASENAME]
                     [-f LOG_CONFIG] [-l LOG_FILE]
                     [-v {DEBUG,INFO,WARNING,ERROR}]
                     path
    
    where:
    positional arguments:
    path                  The base HDFS path to process.
    
    optional arguments:
    -h, --help            show this help message and exit
    -s DATABOX_SIZE, --databox-size DATABOX_SIZE
                         The size of each Data Box in bytes.
    -b FILELIST_BASENAME, --filelist-basename FILELIST_BASENAME
                         The base name for the output filelists. Lists will be
                         named basename1, basename2, ... .
    -f LOG_CONFIG, --log-config LOG_CONFIG
                         The name of a configuration file for logging.
    -l LOG_FILE, --log-file LOG_FILE
                         Name of file to have log output written to (default is
                         stdout/stderr)
    -v {DEBUG,INFO,WARNING,ERROR}, --log-level {DEBUG,INFO,WARNING,ERROR}
                         Level of log information to output. Default is 'INFO'.
    
  2. 將產生的檔案清單複製到 HDFS,提供 DistCp 作業存取。

    hadoop fs -copyFromLocal {filelist_pattern} /[hdfs directory]
    

排除不必要的檔案

您必須從 DisCp 作業中排除部分目錄。 例如,排除包含狀態資訊的目錄,讓叢集保持執行狀態。

在您打算起始 DistCp 作業的內部部署 Hadoop 叢集上,建立指定您要排除的目錄清單的檔案。

以下是範例:

.*ranger/audit.*
.*/hbase/data/WALs.*

下一步

瞭解 Data Lake Storage 如何與 HDInsight 叢集搭配運作。 如需詳細資訊,請參閱 搭配 Azure HDInsight 叢集使用 Azure Data Lake Storage。