全部產品
Search
文件中心

E-MapReduce:JindoDistCp使用說明

更新時間:Jul 01, 2024

本文為您介紹如何使用JindoDistCp。

什麼是JindoDistCp

JindoDistCp是阿里雲資料湖儲存團隊開發的大規模叢集內部和叢集之間分布式檔案拷貝的工具。其使用MapReduce實現檔案分發、錯誤處理和恢複,把檔案和目錄的列表作為MapReduce任務的輸入,每個任務會完成源列表中部分檔案的拷貝。目前全量支援HDFS、OSS-HDFS、OSS和S3之間的資料拷貝情境,提供多種個人化拷貝參數和多種拷貝策略。重點最佳化HDFS到OSS-HDFS的資料拷貝,通過定製化CopyCommitter,實現No-Rename拷貝,並保證資料拷貝落地的一致性。功能全量對齊S3 DistCp和HDFS DistCp,效能較HDFS DistCp有較大提升,致力於提供高效、穩定、安全的資料拷貝工具。

環境要求

  • JDK 1.8.0及以上。

  • Hadoop 2.3+版本,請下載最新版的jindo-distcp-tool-x.x.x.jar,該JAR包含在jindosdk-${version}.tar.gz內,解壓縮後可在tools/目錄下找到,單擊進入JindoData下載

    說明

    EMR-5.6.0及以上版本、EMR-3.40.0及以上版本的叢集已部署JindoDistCp,可在/opt/apps/JINDOSDK/jindosdk-current/tools目錄下找到jindo-distcp-tool-x.x.x.jar。

參數說明

JindoDistCp提供JAR包形式使用,您可以使用hadoop jar命令配合一系列參數來完成遷移操作。

參數

參數類型

說明

預設值

版本

OSS

OSS-HDFS

--src

必選

設定來源目錄,支援的首碼有:

  • hdfs://

  • oss://

  • s3://

  • cos://

  • obs://

4.3.0+

支援

支援

--dest

必選

設定目標目錄,支援的首碼有:

  • hdfs://

  • oss://

  • s3://

  • cos://

  • obs://

4.3.0+

支援

支援

--bandWidth

可選

設定單個節點的頻寬節流設定,單位:MB。

-1

4.3.0+

支援

支援

--codec

可選

設定壓縮類型,支援的轉碼器包括 gzip、gz、lzo、lzop和snapp。

keep(不更改壓縮類型)

4.3.0+

支援

支援

--policy

可選

設定目標儲存策略,支援Standard、IA、Archive、ColdArchive。

Standard

4.3.0+

支援

不支援

--filters

可選

設定包含過濾規則的檔案。

4.3.0+

支援

支援

--srcPrefixesFile

可選

設定包含符合規則的檔案。

4.3.0+

支援

支援

--parallelism

可選

設定DistCp任務的並發度,對應MR任務中的 mapreduce.job.maps。

10

4.3.0+

支援

支援

--jobBatch

可選

設定每個distcp job處理的檔案數量。

10000

4.5.1+

支援

支援

--taskBatch

可選

設定每個distcp task處理的檔案數量。

1

4.3.0+

支援

支援

--tmp

可選

設定臨時目錄。

/tmp

4.3.0+

支援

支援

--hadoopConf <key=value>

可選

設定Configuration。

4.3.0+

支援

支援

--disableChecksum

可選

設定是否關閉Checksum檢查。

false

4.3.0+

支援

支援

--deleteOnSuccess

可選

設定是否刪除源檔案,用於移動資料。

false

4.3.0+

支援

支援

--enableTransaction

可選

設定是否開啟事務,以保證Job層級的原子性。

false

4.3.0+

支援

支援

--ignore

可選

設定是否忽略拷貝任務中拋出的異常,避免中斷任務。

false

4.3.0+

支援

支援

--enableCMS

可選

是否開啟監控警示。

false

4.5.1+

支援

支援

--diff

可選

設定DistCp模式為DIF,查看src和dest的檔案差異。

DistCpMode.COPY

4.3.0+

支援

支援

--update

可選

設定DistCp模式為UPDATE,指定增量同步處理功能,跳過完全相同的檔案和目錄,直接將src中新增或發生改變的檔案和目錄同步到dest上。

DistCpMode.COPY

4.3.0+

支援

支援

--preserveMeta

可選

設定是否開啟儲存中繼資料資訊。

false

4.4.0+

不支援

支援

--src和--dest(必選)

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

  • --src:表示指定源檔案的路徑。

  • --dest:表示目標檔案的路徑。

樣本命令如下:

hadoop jar jindo-distcp-tool-${version}.jar --src /data/hourly_table  --dest oss://example-oss-bucket/hourly_table

您可以通過指定dest路徑來確定拷貝後的檔案目錄。如果您需要將/data/hourly_table下的檔案拷貝到example-oss-bucket這個bucket下的hourly_table目錄下,則可以使用上述語句來完成。此處和Hadoop的DistCp行為有所不同,JindoDistCp會預設將src目錄下的所有檔案拷貝到您指定dest路徑下,並不包括當前的根目錄名稱。您可以在dest中指定拷貝路徑的根目錄,如果不存在會自動建立。

如果您需要拷貝單個檔案,dest需指定為目錄。

hadoop jar jindo-distcp-tool-${version}.jar --src /test.txt --dest oss://example-oss-bucket/tmp

使用--bandWidth

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--bandWidth:表示本次distcp任務所用的單機頻寬(單位:MB),避免單機佔用過大頻寬。

樣本命令如下:

jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --bandWidth 6

使用--codec

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

原始檔案通常以未壓縮的文字格式設定進入OSS或OSS-HDFS。無論是儲存成本還是對該資料進行分析,此格式都不太理想。JindoDistCp可以使用--codec選項協助您線上高效地儲存資料和壓縮檔。

--codec用來指定檔案壓縮轉碼器,支援gzip、gz、lzo、lzop和snappy編碼器以及關鍵字none和keep(預設值)。關鍵字含義如下:

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

  • keep(預設值):不變更檔壓縮形態,按原樣複製。

樣本命令如下:

jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --codec gz

命令執行後,檢查目標檔案夾中的檔案。可以看到這些檔案現在已經使用gz轉碼器壓縮了。

[root@emr-header-1 opt]# hdfs dfs -ls oss://example-oss-bucket/hourly_table/2017-02-01/03
Found 6 items
-rw-rw-rw-   1        938 2020-04-17 20:58 oss://example-oss-bucket/hourly_table/2017-02-01/03/000151.sst.gz
-rw-rw-rw-   1       1956 2020-04-17 20:58 oss://example-oss-bucket/hourly_table/2017-02-01/03/1.log.gz
-rw-rw-rw-   1       1956 2020-04-17 20:58 oss://example-oss-bucket/hourly_table/2017-02-01/03/2.log.gz
-rw-rw-rw-   1       1956 2020-04-17 20:58 oss://example-oss-bucket/hourly_table/2017-02-01/03/OPTIONS-000109.gz
-rw-rw-rw-   1        506 2020-04-17 20:58 oss://example-oss-bucket/hourly_table/2017-02-01/03/emp01.txt.gz
-rw-rw-rw-   1        506 2020-04-17 20:58 oss://example-oss-bucket/hourly_table/2017-02-01/03/emp06.txt.gz
說明

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

使用--filters

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--filters:指定有過濾規則的檔案。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --filters filter.txt

假設filter.txt的內容如下為.*test.*,則不會將路徑中帶有test字元的檔案拷貝到OSS。

使用--srcPrefixesFile

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--srcPrefixesFile:指定有符合規則的檔案。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --srcPrefixesFile prefixes.txt

假設prefixes.txt的內容為.*test.*,則只有路徑中帶有test字元的檔案才會拷貝到OSS。

使用--parallelism

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--parallelism:指定MapReduce任務裡的mapreduce.job.maps參數,該參數在E-MapReduce環境中預設為10,您可以根據叢集的資源情況自訂parallelism的大小來控制distcp任務的並發度。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /opt/tmp --dest oss://example-oss-bucket/tmp --parallelism 20

使用--taskBatch

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--taskBatch:指定每個distcp task處理的檔案數量,預設為1。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --taskBatch 1

使用--tmp

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--tmp:指定一個臨時目錄在hdfs上傳存放臨時資料,預設值為/tmp,即hdfs:///tmp/。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table  --tmp /tmp

配置訪問OSS/OSS-HDFS的AccessKey

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--hadoopConf:在E-MapReduce外或免密服務出現問題的情況下,您可以通過指定AccessKey來獲得訪問OSS/OSS-HDFS服務的許可權。您可以在命令中使用--hadoopConf選項來指定AccessKey。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --hadoopConf fs.oss.accessKeyId=yourkey --hadoopConf fs.oss.accessKeySecret=yoursecret

您也可以將OSS/OSS-HDFS服務的AccessKey ID和AccessKey Secret預先配置在Hadoop的core-site.xml檔案裡 ,避免每次使用時臨時填寫AccessKey。您可以在EMR控制台Hadoop-Common服務的core-site.xml頁面添加如下配置。

<configuration>
    <property>
        <name>fs.oss.accessKeyId</name>
        <value>xxx</value>
    </property>

    <property>
        <name>fs.oss.accessKeySecret</name>
        <value>xxx</value>
    </property>
</configuration>

使用--disableChecksum

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--disableChecksum:關閉檢查檔案checksum。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --disableChecksum

使用--deleteOnSuccess

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--deleteOnSuccess:指定移動資料而不是複製資料。此選項類似於mv操作,首先複製檔案,然後從源位置刪除檔案。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --deleteOnSuccess

使用--enableTransaction

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

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

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --enableTransaction

使用--ignore

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--ignore:指定有符合規則的檔案。忽略資料移轉期間發生的異常,相關報錯不會中斷任務,並最終以JindoCounter的形式透出(如果開啟CMS,也會以指定方式進行通知)。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --ignore

使用--diff

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--diff:查看src和dest的檔案差異。如果src的檔案未能同步到dest上,則會在目前的目錄下產生一個包含檔案內容差異的檔案。如果您的JindoDistCp任務包含壓縮或者解壓縮,則--diff不能顯示正確的檔案差異,因為壓縮或者解壓縮會改變檔案的大小。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --diff

如果檔案有差異,則會在目前的目錄下產生一個包含檔案內容差異的檔案,並會提示如下資訊:

JindoCounter
DIFF_FILES=1

如果您的--dest為HDFS路徑,現支援/path、hdfs://hostname:ip/path、hdfs://headerIp:ip/path的寫法,暫不支援hdfs:///path、hdfs:/path和其他自訂寫法。

如果您想查看檔案中繼資料的差異,您可以使用--diff --preserveMeta命令:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --diff --preserveMeta

使用--update

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

支援

--update:指定增量同步處理功能,跳過完全相同的檔案和目錄,直接將src中新增或發生改變的檔案和目錄同步到dest上。

如果JindoDistCp任務因為各種原因中間失敗了,而此時您想進行斷點續傳,只複製剩下未複製成功的檔案,或者源端檔案新增了部分檔案,此時需要您在上一次JindoDistCp任務完成後指定該參數。

樣本命令如下:

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --update

使用冷歸檔/歸檔/低頻寫入OSS

版本

OSS

OSS-HDFS

4.3.0及以上版本

支援

不支援

--policy:指定以冷歸檔、歸檔和低頻的模式寫入OSS,進行資料存放區。如果不指定,則預設以standard標準模式寫入,不進行冷歸檔、歸檔和低頻操作。

  • 使用冷歸檔寫入OSS(coldArchive)

    目前只在部分地區可用,具體請參見OSS儲存類型介紹。使用樣本命令如下:

     jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-bucket/hourly_table --policy coldArchive --parallelism 20
  • 使用歸檔寫入OSS(archive)

     jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-bucket/hourly_table --policy archive --parallelism 20
  • 使用低頻寫入OSS(ia)

     jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-bucket/hourly_table --policy ia --parallelism 20

使用--preserveMeta

版本

OSS

OSS-HDFS

4.4.0及以上版本

不支援

支援

--preserveMeta:指定遷移資料的同時遷移包括Owner、Group、Permission、Atime、Mtime、Replication、BlockSize、XAttrs和ACL在內的中繼資料資訊。

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --preserveMeta

使用--jobBatch

版本

OSS

OSS-HDFS

4.5.1及以上版本

支援

支援

--jobBatch:在您的distcp任務寫入OSS時,您可以通過--jobBatch來指定每個distcp job處理的檔案數量,預設為10000。

 jindo-distcp-tool-${version}.jar --src /data/hourly_table --dest oss://example-oss-bucket/hourly_table --jobBatch 50000

使用--enableCMS

版本

OSS

OSS-HDFS

4.5.1及以上版本

支援

支援

--enableCMS:開啟CloudMonitor警示功能。

JindoDistCp Counters

JindoDistCp Counters資訊匯總了JindoDistCp執行的結果。資訊內容如下表所示。

參數

說明

COPY_FAILED

拷貝失敗的檔案數。

CHECKSUM_DIFF

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

FILES_EXPECTED

預期的拷貝的檔案數。

BYTES_EXPECTED

預期的拷貝的位元組數。

FILES_COPIED

拷貝成功的檔案數。

BYTES_COPIED

拷貝成功的位元組數。

FILES_SKIPPED

累加式更新時跳過的檔案數。

BYTES_SKIPPED

累加式更新時跳過的位元組數。

DIFF_FILES

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

SAME_FILES

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

DST_MISS

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

LENGTH_DIFF

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

CHECKSUM_DIFF

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

DIFF_FAILED

檔案比較操作異常的檔案數。