本文介紹JindoFS的資料移轉工具Jindo DistCp的使用方法。
前提條件
- 本地安裝了Java JDK 8。
- 已建立叢集,詳情請參見建立叢集。
使用Jindo Distcp
- 通過SSH方式串連叢集。
詳情請參見登入叢集。
- 執行以下命令,擷取協助資訊。
jindo distcp --help
返回資訊如下。--help - Print help text --src=VALUE - Directory to copy files from --dest=VALUE - Directory to copy files to --parallelism=VALUE - Copy task parallelism --outputManifest=VALUE - The name of the manifest file --previousManifest=VALUE - The path to an existing manifest file --requirePreviousManifest=VALUE - Require that a previous manifest is present if specified --copyFromManifest - Copy from a manifest instead of listing a directory --srcPrefixesFile=VALUE - File containing a list of source URI prefixes --srcPattern=VALUE - Include only source files matching this pattern --deleteOnSuccess - Delete input files after a successful copy --outputCodec=VALUE - Compression codec for output files --groupBy=VALUE - Pattern to group input files by --targetSize=VALUE - Target size for output files --enableBalancePlan - Enable plan copy task to make balance --enableDynamicPlan - Enable plan copy task dynamically --enableTransaction - Enable transation on Job explicitly --diff - show the difference between src and dest filelist --ossKey=VALUE - Specify your oss key if needed --ossSecret=VALUE - Specify your oss secret if needed --ossEndPoint=VALUE - Specify your oss endPoint if needed --policy=VALUE - Specify your oss storage policy --cleanUpPending - clean up the incomplete upload when distcp job finish --queue=VALUE - Specify yarn queuename if needed --bandwidth=VALUE - Specify bandwidth per map/reduce in MB if needed --s3Key=VALUE - Specify your s3 key --s3Secret=VALUE - Specify your s3 Sercet --s3EndPoint=VALUE - Specify your s3 EndPoint --enableCMS - Enable CMS --update - Update target, copying only missing files or directories --filters=VALUE - Specify a path of file containing patterns to exlude source files
--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
使用Regex,用於選擇或者過濾需要複製的檔案。您可以編寫自訂的Regex來完成選擇或者過濾操作,Regex必須為全路徑正則匹配。
例如,如果您需要複製/data/incoming/hourly_table/2017-02-01/03下所有log檔案,您可以通過指定--srcPattern
的Regex來過濾需要複製的檔案。
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: Jindo DistCp job exit with 0
--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和其他自訂寫法。hadoop jar jindo-distcp-3.5.0.jar --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --update --parallelism 20
--queue
您可以使用--queue來指定本次DistCp任務所在Yarn隊列的名稱。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --queue yarnqueue
--bandwidth
您可以使用--bandwidth來指定本次DistCp任務單個節點所用的頻寬(以MB為單位),避免佔用過大頻寬。
--update
使用--update參數可以一鍵執行累加式更新,跳過完全相同的檔案和目錄,直接將src中新增或發生改變的檔案和目錄同步到dest上。
hadoop jar jindo-distcp-3.5.0.jar --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --update --parallelism 20
--filters
使用--filters參數可以指定一個檔案路徑,在這個檔案中,一行配置一個Regex,對應distcp任務中需要跳過的檔案,即用Regex過濾不希望參與copy和diff的檔案。
hadoop jar jindo-distcp-3.5.0.jar --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table -filters /path/to/filterfile.txt --parallelism 20
.*\.tmp.
.*\.staging.*
使用上述樣本檔案,會匹配hdfs://data/incoming/hourly_tabl下任何帶有.tmp和.staging字串的檔案路徑,在copy或diff時排除這些匹配到的路徑不做後續操作。
使用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
--policy
來指定以冷歸檔、歸檔和低頻的模式寫入OSS,進行資料存放區。- 使用冷歸檔(
--policy coldArchive
)樣本命令如下。hadoop jar jindo-distcp-3.5.0.jar --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --policy coldArchive --parallelism 20
說明 冷Archive Storage類型目前只支援部分地區,詳情請參見儲存類型概述。 - 使用歸檔(
--policy archive
)樣本命令如下。jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --policy archive --parallelism 20
- 使用低頻(
--policy ia
)樣本命令如下。jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --policy ia --parallelism 20
使用CloudMonitor(CloudMonitor)服務監控警示
CloudMonitor(CloudMonitor)可以用於收集阿里雲資源的監控指標或使用者自訂的監控指標、探測服務可用性、以及針對指標設定警報。使您全面瞭解阿里雲資源的使用方式和業務健全狀態,並及時對故障資源進行處理,保證業務正常運行。
您可以指定本次Jindo DistCp任務結束後是否需要開啟對接CloudMonitor(CloudMonitor),上報任務失敗資訊,並使用CloudMonitor(CloudMonitor)控制台來配置警示功能。
- 建立警示連絡人或警示聯絡組,詳情請參見建立警示連絡人或警示連絡人群組。
- 擷取警示Token。
- 在左側導覽列,選擇 。
- 在警示連絡人頁面,單擊警示聯絡組頁簽。
- 單擊警示聯絡組所在行的接入外部警示。
在警示聯絡組對話方塊中,您可以擷取到警示的Token。
- 在警示聯絡組面板,單擊自訂測試命令配置環境變數。
參數 描述 cmsAccessKeyId 阿里雲帳號的AccessKey ID。 cmsAccessSecret 阿里雲帳號的AccessKey Secret。 cmsRegion EMR叢集所在地區,例如cn-hangzhou。 cmsToken 步驟2中擷取到的Token。 cmsLevel 警示層級,支援如下層級: - INFO:郵件+DingTalk機器人
- WARN:簡訊+郵件+DingTalk機器人
- CRITICAL:電話+簡訊+郵件+DingTalk機器人
樣本命令如下:export cmsAccessKeyId=<your_key_id> export cmsAccessSecret=<your_key_secret> export cmsRegion=cn-hangzhou export cmsToken=<your_cms_token> export cmsLevel=WARN hadoop jar jindo-distcp-3.5.0.jar \ --src /data/incoming/hourly_table \ --dest oss://yang-hhht/hourly_table \ --enableCMS
清理殘留檔案
在您的DistCp任務過程中,由於某種原因在您的目標目錄下,產生未正確上傳的檔案,這部分檔案通過uploadId的方式由OSS管理,並且對使用者不可見時,您可以通過指定--cleanUpPending選項,指定任務結束時清理殘留檔案,或者您也可以通過OSS控制台進行清理。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --cleanUpPending --parallelism 20
使用s3作為資料來源
您可以在命令中使用--s3Key、--s3Secret、--s3EndPoint選項來指定串連s3的相關資訊。
jindo distcp jindo-distcp-2.7.3.jar --src s3a://yourbucket/ --dest oss://<your_bucket>/hourly_table --s3Key yourkey --s3Secret yoursecret --s3EndPoint s3-us-west-1.amazonaws.com
<configuration>
<property>
<name>fs.s3a.access.key</name>
<value>xxx</value>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>xxx</value>
</property>
<property>
<name>fs.s3.endpoint</name>
<value>s3-us-west-1.amazonaws.com</value>
</property>
</configuration>
程式碼範例如下。jindo distcp /tmp/jindo-distcp-2.7.3.jar --src s3://smartdata1/ --dest s3://smartdata1/tmp --s3EndPoint s3-us-west-1.amazonaws.com
查看Distcp Counters
JindoDistcpCounter
BYTES_EXPECTED=10000
BYTES_SKIPPED=10000
FILES_EXPECTED=11
FILES_SKIPPED=11
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
任務計數器 | 說明 |
COPY_FAILED | Copy失敗的檔案數,不為0時警示。 |
CHECKSUM_DIFF | Checksum校正失敗的檔案數,並計入COPY_FAILED。 |
FILES_EXPECTED | 預期的Copy檔案數量。 |
FILES_COPIED | Copy成功的檔案數。 |
FILES_SKIPPED | update累加式更新時跳過的檔案數。 |
BYTES_SKIPPED | update累加式更新時跳過的位元組數。 |
DIFF_FILES | diff比較出的不相同的檔案數,不為0時警示。 |
SAME_FILES | 經diff校正完全相同的檔案數。 |
DST_MISS | 目標路徑不存在的檔案數,並計入DIFF_FILES。 |
LENGTH_DIFF | 源檔案和目標檔案大小不一致的數量,並計入DIFF_FILES。 |
CHECKSUM_DIFF | Checksum校正失敗的檔案數,並計入DIFF_FILES。 |
DIFF_FAILED | diff操作異常的檔案數,具體報錯參見日誌資訊。 |