本文介紹JindoFS的數據遷移工具Jindo DistCp的使用方法。
前提條件
使用Jindo Distcp
- 通過SSH方式連接集群。
詳情請參見使用SSH連接主節點。
- 執行以下命令,獲取幫助信息。
jindo distcp --help
- --src和--dest
- --parallelism
- --srcPattern
- --deleteOnSuccess
- --outputCodec
- --outputManifest和--requirePreviousManifest
- --outputManifest和--previousManifest
- --copyFromManifest
- --srcPrefixesFile
- --groupBy和-targetSize
- --enableBalancePlan
- --enableDynamicPlan
- --enableTransaction
- --diff
- 查看Distcp Counters
- 使用OSS AccessKey
- 使用歸檔或低頻寫入OSS
- 清理殘留文件
--src和--dest
--src
表示指定源文件的路徑,--dest
表示目標文件的路徑。
Jindo DistCp默認將--src
目錄下的所有文件拷貝到指定的--dest
路徑下。您可以通過指定--dest
路徑來確定拷貝后的文件目錄,如果不指定根目錄,Jindo DistCp會自動創建根目錄。
jindo distcp --src /opt/tmp --dest oss://<yourBucketName>/tmp
--parallelism
--parallelism
用于指定MapReduce作業里的mapreduce.job.reduces參數。該參數默認為7,您可以根據集群的資源情況,通過自定義--parallelism
大小來控制DistCp任務的并發度。
jindo distcp --src /opt/tmp --dest oss://<yourBucketName>/tmp --parallelism 20
--srcPattern
--srcPattern
使用正則表達式,用于選擇或者過濾需要復制的文件。您可以編寫自定義的正則表達式來完成選擇或者過濾操作,正則表達式必須為全路徑正則匹配。
例如,如果您需要復制/data/incoming/hourly_table/2017-02-01/03下所有log文件,您可以通過指定--srcPattern
的正則表達式來過濾需要復制的文件。
hdfs dfs -ls /data/incoming/hourly_table/2017-02-01/03
Found 6 items
-rw-r----- 2 root hadoop 2252 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/000151.sst
-rw-r----- 2 root hadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/1.log
-rw-r----- 2 root hadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/2.log
-rw-r----- 2 root hadoop 4891 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/OPTIONS-000109
-rw-r----- 2 root hadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp01.txt
-rw-r----- 2 root hadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp06.txt
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --srcPattern .*\.log --parallelism 20
hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03
Found 2 items
-rw-rw-rw- 1 4891 2020-04-17 20:52 oss://<yourBucketName>/hourly_table/2017-02-01/03/1.log
-rw-rw-rw- 1 4891 2020-04-17 20:52 oss://<yourBucketName>/hourly_table/2017-02-01/03/2.log
--deleteOnSuccess
--deleteOnSuccess
可以移動數據并從源位置刪除文件。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --deleteOnSuccess --parallelism 20
--outputCodec
--outputCodec
可以在線高效地存儲數據和壓縮文件。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --outputCodec=gz --parallelism 20
hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03
Found 6 items
-rw-rw-rw- 1 938 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/000151.sst.gz
-rw-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/1.log.gz
-rw-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/2.log.gz
-rw-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/OPTIONS-000109.gz
-rw-rw-rw- 1 506 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp01.txt.gz
-rw-rw-rw- 1 506 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp06.txt.gz
- none表示保存為未壓縮的文件。如果文件已壓縮,則Jindo DistCp會將其解壓縮。
- keep表示不更改文件壓縮形態,按原樣復制。
--outputManifest和--requirePreviousManifest
--outputManifest
可以指定生成DistCp的清單文件,用來記錄copy過程中的目標文件、源文件和數據量大小等信息。
--requirePreviousManifest
為false
。當前outputManifest文件默認且必須為gz類型壓縮文件。 jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --outputManifest=manifest-2020-04-17.gz --requirePreviousManifest=false --parallelism 20
hadoop fs -text oss://<yourBucketName>/hourly_table/manifest-2020-04-17.gz > before.lst
cat before.lst
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/000151.sst","baseName":"2017-02-01/03/000151.sst","srcDir":"oss://<yourBucketName>/hourly_table","size":2252}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/1.log","baseName":"2017-02-01/03/1.log","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/2.log","baseName":"2017-02-01/03/2.log","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/OPTIONS-000109","baseName":"2017-02-01/03/OPTIONS-000109","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/emp01.txt","baseName":"2017-02-01/03/emp01.txt","srcDir":"oss://<yourBucketName>/hourly_table","size":1016}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/emp06.txt","baseName":"2017-02-01/03/emp06.txt","srcDir":"oss://<yourBucketName>/hourly_table","size":1016}
--outputManifest和--previousManifest
--outputManifest
表示包含所有已復制文件(舊文件和新文件)的列表,--previousManifest
表示只包含之前復制文件的列表。您可以使用--outputManifest
和--previousManifest
重新創建完整的操作歷史記錄,查看運行期間復制的文件。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --outputManifest=manifest-2020-04-18.gz --previousManifest=oss://<yourBucketName>/hourly_table/manifest-2020-04-17.gz --parallelism 20
hadoop fs -text oss://<yourBucketName>/hourly_table/manifest-2020-04-18.gz > current.lst
diff before.lst current.lst
3a4,5
> {"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/5.log","baseName":"2017-02-01/03/5.log","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
> {"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/6.log","baseName":"2017-02-01/03/6.log","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
--copyFromManifest
--outputManifest
生成清單文件后,您可以使用--copyFromManifest
指定--outputManifest
生成的清單文件,并將dest目錄生成的清單文件中包含的文件信息拷貝到新的目錄下。 jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --previousManifest=oss://<yourBucketName>/hourly_table/manifest-2020-04-17.gz --copyFromManifest --parallelism 20
--srcPrefixesFile
--srcPrefixesFile
可以一次性完成多個文件夾的復制。
hdfs dfs -ls oss://<yourBucketName>/hourly_table
Found 4 items
drwxrwxrwx - 0 1970-01-01 08:00 oss://<yourBucketName>/hourly_table/2017-02-01
drwxrwxrwx - 0 1970-01-01 08:00 oss://<yourBucketName>/hourly_table/2017-02-02
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --srcPrefixesFile file:///opt/folders.txt --parallelism 20
cat folders.txt
hdfs://emr-header-1.cluster-50466:9000/data/incoming/hourly_table/2017-02-01
hdfs://emr-header-1.cluster-50466:9000/data/incoming/hourly_table/2017-02-02
--groupBy和-targetSize
因為Hadoop可以從HDFS中讀取少量的大文件,而不再讀取大量的小文件,所以在大量小文件的場景下,您可以使用Jindo DistCp將小文件聚合為指定大小的大文件,以便于優化分析性能和降低成本。
hdfs dfs -ls /data/incoming/hourly_table/2017-02-01/03
Found 8 items
-rw-r----- 2 root hadoop 2252 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/000151.sst
-rw-r----- 2 root hadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/1.log
-rw-r----- 2 root hadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/2.log
-rw-r----- 2 root hadoop 4891 2020-04-17 21:08 /data/incoming/hourly_table/2017-02-01/03/5.log
-rw-r----- 2 root hadoop 4891 2020-04-17 21:08 /data/incoming/hourly_table/2017-02-01/03/6.log
-rw-r----- 2 root hadoop 4891 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/OPTIONS-000109
-rw-r----- 2 root hadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp01.txt
-rw-r----- 2 root hadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp06.txt
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --targetSize=10 --groupBy='.*/([a-z]+).*.txt' --parallelism 20
hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03/
Found 1 items
-rw-rw-rw- 1 2032 2020-04-17 21:18 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp2
--enableBalancePlan
--enableBalancePlan
來更改Jindo DistCp的作業分配計劃,以達到更好的DistCp性能。 jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableBalancePlan --parallelism 20
--groupby
或--targetSize
同時使用。
--enableDynamicPlan
--enableDynamicPlan
來更改Jindo DistCp的作業分配計劃,以達到更好的DistCp性能。 jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableDynamicPlan --parallelism 20
--groupby
或--targetSize
參數一起使用。
--enableTransaction
--enableTransaction
可以保證Job級別的完整性以及保證Job之間的事務支持。示例如下。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableTransaction --parallelism 20
--diff
DistCp任務完成后,您可以使用--diff
查看當前DistCp的文件差異。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --diff
INFO distcp.JindoDistCp: distcp has been done completely
--copyFromManifest
和--previousManifest
拷貝剩余文件,從而完成數據大小和文件個數的校驗。如果您的DistCp任務包含壓縮或者解壓縮,則--diff
不能顯示正確的文件差異,因為壓縮或者解壓縮會改變文件的大小。 jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --dest oss://<yourBucketName>/hourly_table --previousManifest=file:///opt/manifest-2020-04-17.gz --copyFromManifest --parallelism 20
--dest
為HDFS路徑,目前僅支持/path、hdfs://hostname:ip/path和hdfs://headerIp:ip/path的寫法,暫不支持hdfs:///path、hdfs:/path和其他自定義寫法。
查看Distcp Counters
Distcp Counters
Bytes Destination Copied=11010048000
Bytes Source Read=11010048000
Files Copied=1001
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
Bytes Destination Copied
和Bytes Source Read
的大小可能不相等。
使用OSS AccessKey
在E-MapReduce外或者免密服務出現問題的情況下,您可以通過指定AccessKey來獲得訪問OSS的權限。您可以在命令中使用--ossKey、--ossSecret、--ossEndPoint選項來指定AccessKey。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --ossKey <yourAccessKeyId> --ossSecret <yourAccessKeySecret> --ossEndPoint oss-cn-hangzhou.aliyuncs.com --parallelism 20
本文示例中的yourAccessKeyId是您阿里云賬號的AccessKey ID,yourAccessKeySecret是您阿里云賬號的AccessKey Secret。
使用歸檔或低頻寫入OSS
- 使用歸檔(
--archive
)示例命令如下。jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --policy archive --parallelism 20
- 使用低頻(
--ia
)示例命令如下。jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --policy ia --parallelism 20
清理殘留文件
在您的DistCp任務過程中,由于某種原因在您的目標目錄下,產生未正確上傳的文件,這部分文件通過uploadId的方式由OSS管理,并且對用戶不可見時,您可以通過指定--cleanUpPending選項,指定任務結束時清理殘留文件,或者您也可以通過OSS控制臺進行清理。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --cleanUpPending --parallelism 20