全部產品
Search
文件中心

Object Storage Service:遷移HDFS資料到OSS

更新時間:Sep 17, 2025

本文以阿里雲EMR叢集為例,說明如何使用阿里雲Jindo DistCp將資料從HDFS遷移到OSS。

背景資訊

在傳統巨量資料領域,HDFS經常作為大規模資料的底層儲存。在進行資料移轉、資料拷貝的情境中,最常用的是Hadoop內建的DistCp工具。但是該工具不能很好利用Object Storage Service的特性,導致效率低下並且不能保證資料一致性。此外,該工具提供的功能選項較單一,無法很好地滿足使用者的需求。

阿里雲Jindo DistCp(分布式檔案拷貝工具)用於大規模叢集內部或叢集之間拷貝檔案。Jindo DistCp使用MapReduce實現檔案分發,錯誤處理和恢複,把檔案和目錄的列表作為MapReduce任務的輸入,每個任務會完成源列表中部分檔案的拷貝。全量支援HDFS之間、HDFS與OSS之間、以及OSS之間的資料拷貝情境,提供多種個人化拷貝參數和多種拷貝策略。

相對於Hadoop DistCp,使用阿里雲Jindo DistCp從HDFS遷移資料到OSS具有以下優勢:

  • 效率高,在測試情境中最高可達到1.59倍的加速。

  • 準系統豐富,提供多種拷貝方式和情境最佳化策略。

  • 深度結合OSS,對檔案提供歸檔、壓縮等操作。

  • 實現No-Rename拷貝,保證資料一致性。

  • 情境全面,可完全替代Hadoop DistCp,目前支援Hadoop2.7+和Hadoop3.x。

前提條件

已建立3.28.0及以上版本EMR叢集。具體步驟,請參見建立叢集

3.28.0及以上版本EMR叢集可以通過Shell命令的方式使用Jindo DistCp。更多資訊,請參見Jindo DistCp使用說明。3.28.0以下版本的EMR叢集,可能存在相容性問題,您可以通過提交工單申請處理。

如果您使用的是自建ECS叢集,需要具備Hadoop2.7+或Hadoop3.x環境以及進行MapReduce作業的能力。

步驟一:下載JAR包

  1. 登入EMR叢集。

    1. 登入EMR on ECS控制台

    2. 單擊建立的EMR叢集。

    3. 單擊節點管理頁簽,然後單擊節點群組左側的p480359.jpg

    4. 單擊ECS ID。在ECS執行個體頁面,單擊執行個體ID右側的遠端連線

    如果您希望使用SSH方式(SSH金鑰組或SSH密碼)在Windows和Linux環境中登入叢集,請參見登入叢集

  2. 下載並解壓最新版本的Jindosdk-${version}.tar.gz。下載地址,請參見JindoData下載

步驟二:配置OSS的AccessKey

您可以選擇以下任意方式配置OSS的AccessKey。

在樣本命令中配置AccessKey

hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --parallelism 10

通過設定檔預先配置AccessKey

  1. 進入Hadoop設定檔core-site.xml所在目錄。

    cd /etc/emr/hadoop-conf/

    關於EMR中熱門檔案路徑的更多資訊,請參見熱門檔案路徑

  2. 開啟core-site.xml檔案。

    vim core-site.xml
  3. 在core-site.xml檔案中添加以下配置。

    <configuration>
        <property>
            <name>fs.oss.accessKeyId</name>
            <value>LTAI****************</value>
        </property>
    
        <property>
            <name>fs.oss.accessKeySecret</name>
            <value>YourAccessKeySecret</value>
        </property>
    
        <property>
            <name>fs.oss.endpoint</name>
            <!-- 阿里雲ECS環境下推薦使用內網OSS Endpoint,即oss-cn-xxx-internal.aliyuncs.com -->
            <value>oss-cn-xxx.aliyuncs.com</value>
        </property>
    </configuration>

配置免密登入

配置免密登入,避免明文儲存AccessKey,提高安全性。具體操作,請參見使用JindoFS SDK免密功能

步驟三:遷移或拷貝資料

  1. 使用以下命令查看HDFS下的資料。

    hdfs dfs -ls /

    返回結果如下:

    Found 8 items
    drwxrwxrwx   - admin  supergroup          0 2023-10-26 10:55 /.sysinfo
    drwxrwxrwx   - hadoop supergroup          0 2023-10-26 10:55 /apps
    drwxrwxrwx   - root   supergroup          0 2022-08-03 15:54 /data
    -rw-r-----   1 root   supergroup         13 2022-08-25 11:45 /examplefile.txt
    drwxrwxrwx   - spark  supergroup          0 2023-10-26 14:49 /spark-history
    drwx-wx-wx   - hive   supergroup          0 2023-10-26 13:35 /tmp
    drwxrwxrwx   - hive   supergroup          0 2023-10-26 14:48 /user
    drwxrwxrwx   - hadoop supergroup          0 2023-10-26 14:48 /yarn
  2. 切換至jindo-distjob-tool-${version}.jar包所在目錄。

    cd /opt/apps/JINDOSDK/jindosdk-current/tools
  3. 將HDFS中的資料移轉至OSS。

    全量遷移或拷貝資料

    將HDFS指定目錄/tmp下的資料全量遷移或拷貝到OSS目標路徑oss://examplebucket,樣本命令如下:

    hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --parallelism 10

    樣本中涉及的各參數或選項說明如下:

    參數及選項

    說明

    樣本

    --src

    待遷移或拷貝的HDFS資料所在的路徑。

    /tmp/

    --dest

    OSS中存放遷移或拷貝資料的目標路徑。

    oss://examplebucket/

    --hadoopConf

    指定擁有訪問OSS許可權的AccessKey ID、AccessKey Secret以及Endpoint。

    • 關於擷取AccessKey ID以及AccessKey Secret的具體操作,請參見建立AccessKey

    • 關於OSS支援的地區(Region)和對應的訪問網域名稱(Endopoint)列表資訊,請參見訪問網域名稱和資料中心

      重要

      ECS環境下推薦使用內網 ossEndPoint,即oss-cn-xxx-internal.aliyuncs.com

    --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com

    --parallelism

    根據叢集資源調整任務並發數。

    10

    增量遷移或拷貝資料

    如果您僅希望拷貝在上一次全量遷移或拷貝後源路徑下新增的資料,此時您可以結合--update選項完成資料的增量遷移或拷貝。

    將HDFS指定目錄/tmp下的資料增量遷移或拷貝到OSS目標路徑oss://examplebucket/,樣本命令如下:

    hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --update --parallelism 10

    使用--update選項時,預設開啟校正和Checksum。開啟後,DistCp將對源路徑和目標路徑的檔案名稱、檔案大小以及檔案的Checksum進行比較。如果源路徑或目標路徑下的檔案名稱、檔案大小或者檔案的Checksum不一致時,將自動觸發增量遷移或拷貝任務。

    如果您不需要對源路徑和目標路徑的檔案的Checksum進行比較,請增加--disableChecksum選項關閉Checksum校正,樣本命令如下:

    hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --update --disableChecksum --parallelism 10

附錄一:Jindo DistCp支援的參數及選項

Jindo DistCp提供一系列的參數及選項。您可以通過以下命令擷取各參數及選項的具體用法。

hadoop jar jindo-distcp-tool-${version}.jar --help

各參數及選項的含義及其樣本如下表所示。

參數及選項

說明

樣本值

--src

指定拷貝的源路徑。

--src oss://examplebucket/sourcedir

--dest

指定拷貝的目標路徑。

--dest oss://examplebucket/destdir

--bandWidth

指定本次DistCp任務所用的單機頻寬,單位為 MB。

--bandWidth 6

--codec

指定檔案的壓縮方式。目前的版本支援轉碼器gzip、gz、lzo、lzop和snappy,以及關鍵字none和keep。關鍵字含義如下:

  • none:儲存為未壓縮的檔案。如果檔案已壓縮,則Jindo DistCp會將其解壓縮。

  • keep(預設值):不變更檔壓縮形態。

說明

如果您需要在開源Hadoop叢集環境中使用lzo的壓縮方式,請確保已安裝gplcompression的native庫和hadoop-lzo包。如果缺少相關環境,建議使用其他壓縮方式進行壓縮。

--codec gz

--policy

指定拷貝到OSS後的檔案類型。取值:

  • ia:低頻訪問

  • archive:Archive Storage

  • coldArchive:冷Archive Storage

--policy coldArchive

--filters

通過filters參數指定一個檔案路徑。在這個檔案中,每一行配置一個Regex,對應DistCp任務中不需要拷貝或比對的檔案。

--filters test.txt

--srcPrefixesFile

指定需要拷貝的檔案清單,列表裡檔案以src路徑作為首碼。

--srcPrefixesFile prefixes.txt

--parallelism

指定MR任務裡的 mapreduce.job.reduces參數。您可以根據叢集的資源情況自訂parallelism 的大小,以控制distcp任務的並發度。

說明

該參數在EMR環境中預設值為7。

--parallelism 20

--tmp

指定在使用DistCp工具的過程中,用於存放臨時檔案的目錄。

--tmp /tmp

--hadoopConf

指定擁有訪問OSS許可權的AccessKey及Endpoint。

--hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-xxx.aliyuncs.com

--disableChecksum

關閉Checksum校正。

--disableChecksum

--deleteOnSuccess

指定在拷貝任務完成後刪除源路徑下的檔案。

--deleteOnSuccess

--enableTransaction

JindoDistCp預設使用task層級完整性。如果您需要保證Job層級的完整性以及保證Job之間的事務支援,您可以使用--enableTransaction參數。

--enableTransaction

--ignore

忽略資料移轉期間發生的異常,相關報錯不會中斷任務,並最終以DistCp Counter的形式透出。如果使用了--enableCMS,也會通過指定方式進行通知。

-ignore

--diff

查看本次拷貝是否完成全部檔案拷貝,並對未完成拷貝的檔案組建檔案列表。

--diff

--update

使用增量同步處理功能,即僅同步上一次全量遷移或拷貝後源路徑下新增的資料到目標路徑。

--update

--preserveMeta

遷移資料的同時遷移包括Owner,Group,Permission,Atime,Mtime,Replication,BlockSize,XAttrs,ACL等中繼資料資訊。

--preserveMeta

--jobBatch

指定每個distcp任務處理的檔案數量,預設值為1000。

--jobBatch 1000

--taskBatch

指定每個distcp子任務處理的檔案數量,預設值為10。

--taskBatch 10

附錄二:情境樣本

情境一:使用JindoDistCp成功傳輸資料後,如何驗證資料完整性?

JindoDistCp提供了以下兩種方式用於驗證資料的完整性。

  • 方式一:DistCp Counters

    通過Distcp Counters資訊中包含的BYTES_EXPECTED、FILES_EXPECTED等參數驗證資料完整性。

    樣本
        JindoDistcpCounter
            BYTES_COPIED=10000
            BYTES_EXPECTED=10000
            FILES_COPIED=11
            FILES_EXPECTED=11
            ...
        Shuffle Errors
            BAD_ID=0
            CONNECTION=0
            IO_ERROR=0
            WRONG_LENGTH=0
            WRONG_MAP=0
            WRONG_REDUCE=0

    樣本中可能包含的Counter參數如下:

    參數

    說明

    BYTES_COPIED

    拷貝成功的位元組數。

    BYTES_EXPECTED

    預期拷貝的位元組數。

    FILES_COPIED

    拷貝成功的檔案數。

    FILES_EXPECTED

    預期拷貝的檔案數。

    FILES_SKIPPED

    增量拷貝時跳過的檔案數。

    BYTES_SKIPPED

    增量拷貝時跳過的位元組數。

    COPY_FAILED

    拷貝失敗的檔案數,不為0時觸發警示。

    BYTES_FAILED

    拷貝失敗的位元組數。

    DIFF_FILES

    源路徑與目標路徑下不相同的檔案數,不為0時觸發警示。

    DIFF_FAILED

    檔案比較操作異常的檔案數,並計入DIFF_FILE。

    SRC_MISS

    源路徑下不存在的檔案數,並計入DIFF_FILES。

    DST_MISS

    目標路徑下不存在的檔案數,並計入DIFF_FILES。

    LENGTH_DIFF

    源檔案和目標檔案大小不一致的數量,並計入DIFF_FILES。

    CHECKSUM_DIFF

    Checksum校正失敗的檔案數,並計入COPY_FAILED。

    SAME_FILES

    源路徑與目標路徑下完全相同的檔案數。

  • 方式二:通過--diff選項

    您可以在樣本中結合--diff選項對源路徑和目標路徑下檔案名稱和檔案大小進行比較。

    hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --diff

情境二:如果要以低頻訪問、歸檔或者冷歸檔的方式儲存寫入OSS的檔案,該使用哪些參數?

您可以在樣本中添加--policy選項來指定寫入OSS檔案的儲存類型。以下以指定為低頻訪問類型為例:

hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --policy ia --parallelism 10

如果需要指定為Archive Storage類型,請將--policy ia替換為--policy archive。如需指定為冷Archive Storage類型,請將--policy ia替換為--policy coldArchive。此外,目前冷Archive Storage僅支援部分地區,更多資訊,請參見冷Archive Storage(Cold Archive)

情境三:遷移或者拷貝任務完成後,希望僅保留目標路徑下的資料,且刪除源路徑下的指定資料,該使用哪些參數?

您可以結合--deleteOnSuccess選項,在遷移或者拷貝任務完成後,僅保留OSS目標路徑下的資料,並刪除HDFS源路徑下的指定資料。

hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --deleteOnSuccess --parallelism 10