本文為您介紹如何使用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 |
必選 | 設定來源目錄,支援的首碼有:
| 無 | 4.3.0+ | 支援 | 支援 | |
必選 | 設定目標目錄,支援的首碼有:
| 無 | 4.3.0+ | 支援 | 支援 | |
可選 | 設定單個節點的頻寬節流設定,單位:MB。 | -1 | 4.3.0+ | 支援 | 支援 | |
可選 | 設定壓縮類型,支援的轉碼器包括 gzip、gz、lzo、lzop和snapp。 | keep(不更改壓縮類型) | 4.3.0+ | 支援 | 支援 | |
可選 | 設定目標儲存策略,支援Standard、IA、Archive、ColdArchive。 | Standard | 4.3.0+ | 支援 | 不支援 | |
可選 | 設定包含過濾規則的檔案。 | 無 | 4.3.0+ | 支援 | 支援 | |
可選 | 設定包含符合規則的檔案。 | 無 | 4.3.0+ | 支援 | 支援 | |
可選 | 設定DistCp任務的並發度,對應MR任務中的 mapreduce.job.maps。 | 10 | 4.3.0+ | 支援 | 支援 | |
可選 | 設定每個distcp job處理的檔案數量。 | 10000 | 4.5.1+ | 支援 | 支援 | |
可選 | 設定每個distcp task處理的檔案數量。 | 1 | 4.3.0+ | 支援 | 支援 | |
可選 | 設定臨時目錄。 | /tmp | 4.3.0+ | 支援 | 支援 | |
可選 | 設定Configuration。 | 無 | 4.3.0+ | 支援 | 支援 | |
可選 | 設定是否關閉Checksum檢查。 | false | 4.3.0+ | 支援 | 支援 | |
可選 | 設定是否刪除源檔案,用於移動資料。 | false | 4.3.0+ | 支援 | 支援 | |
可選 | 設定是否開啟事務,以保證Job層級的原子性。 | false | 4.3.0+ | 支援 | 支援 | |
可選 | 設定是否忽略拷貝任務中拋出的異常,避免中斷任務。 | false | 4.3.0+ | 支援 | 支援 | |
可選 | 是否開啟監控警示。 | false | 4.5.1+ | 支援 | 支援 | |
可選 | 設定DistCp模式為DIF,查看src和dest的檔案差異。 | DistCpMode.COPY | 4.3.0+ | 支援 | 支援 | |
可選 | 設定DistCp模式為UPDATE,指定增量同步處理功能,跳過完全相同的檔案和目錄,直接將src中新增或發生改變的檔案和目錄同步到dest上。 | DistCpMode.COPY | 4.3.0+ | 支援 | 支援 | |
可選 | 設定是否開啟儲存中繼資料資訊。 | 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 | 檔案比較操作異常的檔案數。 |