本文為您介紹如何使用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:開啟云監控告警功能,具體請參見JindoDistCp使用CMS進行告警。
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 | 文件比較操作異常的文件數。 |