本文介紹JindoFS的資料移轉工具Jindo DistCp的使用方法。
前提條件
已建立叢集,詳情請參見建立叢集。
使用Jindo Distcp
通過SSH方式串連叢集。
詳情請參見登入叢集。
執行以下命令,擷取協助資訊。
jindo distcp --help
Jindo DistCp參數詳細資料如下:
--src和--dest
--src表示指定源檔案的路徑,--dest表示目標檔案的路徑。
Jindo DistCp預設將--src目錄下的所有檔案拷貝到指定的--dest路徑下。您可以通過指定--dest路徑來確定拷貝後的檔案目錄,如果不指定根目錄,Jindo DistCp會自動建立根目錄。
例如,您可以執行以下命令,將/opt/tmp下的檔案拷貝到OSS Bucket。
jindo distcp --src /opt/tmp --dest oss://<yourBucketName>/tmp本文樣本中的yourBucketName是您OSS Bucket的名稱。
--parallelism
--parallelism用於指定MapReduce作業裡的mapreduce.job.reduces參數。該參數預設為7,您可以根據叢集的資源情況,通過自訂--parallelism大小來控制DistCp任務的並發度。
例如,將HDFS上/opt/tmp目錄拷貝到OSS Bucket,可以執行以下命令。
jindo distcp --src /opt/tmp --dest oss://<yourBucketName>/tmp --parallelism 20--srcPattern
--srcPattern使用Regex,用於選擇或者過濾需要複製的檔案。您可以編寫自訂的Regex來完成選擇或者過濾操作,Regex必須為全路徑正則匹配。
例如,如果您需要複製/data/incoming/hourly_table/2017-02-01/03下所有log檔案,您可以通過指定--srcPattern的Regex來過濾需要複製的檔案。
執行以下命令,查看/data/incoming/hourly_table/2017-02-01/03下的檔案。
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執行以下命令,複製以log結尾的檔案。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --srcPattern .*\.log --parallelism 20執行以下命令,查看目標bucket的內容。
hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03返回資訊如下,顯示只複製了以log結尾的檔案。
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可以移動資料並從源位置刪除檔案。
例如,執行以下命令,您可以將/data/incoming/下的hourly_table檔案移動到OSS Bucket中,並刪除源位置檔案。
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目標檔案夾中的檔案已經使用gz轉碼器壓縮了。
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.gzJindo DistCp目前的版本支援轉碼器gzip、gz、lzo、lzop、snappy以及關鍵字none和keep(預設值)。關鍵字含義如下:
none表示儲存為未壓縮的檔案。如果檔案已壓縮,則Jindo DistCp會將其解壓縮。
keep表示不變更檔壓縮形態,按原樣複製。
如果您想在開源Hadoop叢集環境中使用轉碼器lzo,則需要安裝gplcompression的native庫和hadoop-lzo包。
--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查看outputManifest檔案內容。
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可以一次性完成多個檔案夾的複製。
樣本如下,查看hourly_table下檔案。
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執行以下命令,複製hourly_table下檔案到folders.txt。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --srcPrefixesFile file:///opt/folders.txt --parallelism 20查看folders.txt檔案的內容。
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執行以下命令,將如下檔案夾中的TXT檔案合并為不超過10M的檔案。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --targetSize=10 --groupBy='.*/([a-z]+).*.txt' --parallelism 20經過合并後,可以看到兩個TXT檔案被合并成了一個檔案。
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
在您要拷貝的資料大小均衡、小檔案和大檔案混合的情境下,因為DistCp預設的執行計畫是隨機進行檔案分配的,所以您可以指定--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的檔案差異。
例如,執行以下命令,查看/data/incoming/。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --diff如果全部任務完成則會提示如下資訊。
INFO distcp.JindoDistCp: distcp has been done completely如果src的檔案未能同步到dest上,則會在目前的目錄下產生manifest檔案,您可以使用--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
執行以下命令,在MapReduce的Counter資訊中尋找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如果您的DistCp操作中包含壓縮或者解壓縮檔案,則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
在您的Distcp任務寫入OSS時,您可以通過如下模式寫入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