本文通過情境化為您介紹如何使用Jindo DistCp。
前提條件
- 已建立相應版本的叢集,詳情請參見建立叢集。
- 已安裝JDK 1.8。
- 根據您使用的Hadoop版本,下載jindo-distcp-<version>.jar。
- Hadoop 2.7及後續版本,請下載jindo-distcp-3.0.0.jar。
- Hadoop 3.x系列版本,請下載jindo-distcp-3.0.0.jar。
情境預覽
Jindo DistCp常用使用情境如下所示:
- 情境一:匯入HDFS資料至OSS,需要使用哪些參數?如果資料量很大、檔案很多(百萬千萬層級)時,該使用哪些參數最佳化?
- 情境二:使用Jindo DistCp成功導完資料後,如何驗證資料完整性?
- 情境三:匯入HDFS資料至OSS時,DistCp任務存在隨時失敗的情況,該使用哪些參數支援斷點續傳?
- 情境四:成功匯入HDFS資料至OSS,資料不斷增量增加,在Distcp過程中可能已經產生了新檔案,該使用哪些參數處理?
- 情境五:如果需要指定Jindo DistCp作業在Yarn上的隊列以及可用頻寬,該使用哪些參數?
- 情境六:當通過低頻或者歸檔形式寫入OSS,該使用哪些參數?
- 情境七:針對小檔案比例和檔案大小情況,該使用哪些參數來最佳化傳輸速度?
- 情境八:如果需要使用S3作為資料來源,該使用哪些參數?
- 情境九:如果需要寫入檔案至OSS上並壓縮(LZO和GZ格式等)時,該使用哪些參數?
- 情境十:如果需要把本次Copy中符合特定規則或者同一個父目錄下的部分子目錄作為Copy對象,該使用哪些參數?
- 情境十一:如果想合并符合一定規則的檔案,以減少檔案個數,該使用哪些參數?
- 情境十二:如果Copy完檔案,需要刪除原檔案,只保留目標檔案時,該使用哪些參數?
- 情境十三:如果不想將OSS AccessKey這種參數寫在命令列裡,該如何處理?
情境一:匯入HDFS資料至OSS,需要使用哪些參數?如果資料量很大、檔案很多(百萬千萬層級)時,該使用哪些參數最佳化?
如果您使用的不是EMR環境,當從HDFS上往OSS傳輸資料時,需要滿足以下幾點:
- 可以訪問HDFS,並有讀資料許可權。
- 需要提供OSS的AccessKey(AccessKey ID和AccessKey Secret),以及Endpoint資訊,且該AccessKey具有寫目標Bucket的許可權。
- OSS Bucket不能為歸檔類型。
- 環境可以提交MapReduce任務。
- 已下載Jindo DistCp JAR包。
本情境樣本如下。
hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --parallelism 10說明 各參數含義請參見Jindo DistCp使用說明。
當您的數量很大,檔案數量很多,例如百萬千萬層級時,您可以增大parallelism,以增加並發度,還可以開啟
--enableBatch參數來進行最佳化。最佳化命令如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --parallelism 500 --enableBatch情境二:使用Jindo DistCp成功導完資料後,如何驗證資料完整性?
您可以通過以下兩種方式驗證資料完整性:
- Jindo 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參數含義如下:- Bytes Destination Copied:表示目標端寫檔案的位元組數大小。
- Bytes Source Read:表示源端讀檔案的位元組數大小。
- Files Copied:表示成功Copy的檔案數。
- Jindo DistCp --diff
您可以使用
--diff命令,進行源端和目標端的檔案比較,該命令會對檔案名稱和檔案大小進行比較,記錄遺漏或者未成功傳輸的檔案,儲存在提交命令的目前的目錄下,產生manifest檔案。在情境一的基礎上增加--diff參數即可,樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --diff當全部檔案傳輸成功時,系統返回如下資訊。INFO distcp.JindoDistCp: distcp has been done completely
情境三:匯入HDFS資料至OSS時,DistCp任務存在隨時失敗的情況,該使用哪些參數支援斷點續傳?
在情境一的基礎上,如果您的Distcp任務因為各種原因中間失敗了,而此時您想支援斷點續傳,只Copy剩下未Copy成功的檔案,此時需要您在進行上一次Distcp任務完成後進行如下操作:
- 增加一個
--diff命令,查看所有檔案是否都傳輸完成。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --diff當所有檔案都傳輸完成,則會提示如下資訊。INFO distcp.JindoDistCp: distcp has been done completely. - 檔案沒有傳輸完成時會產生manifest檔案,您可以使用
--copyFromManifest和--previousManifest命令進行剩餘檔案的Copy。樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --dest oss://yang-hhht/hourly_table --previousManifest=file:///opt/manifest-2020-04-17.gz --copyFromManifest --parallelism 20file:///opt/manifest-2020-04-17.gz為您當前執行命令的本地路徑。
情境四:成功匯入HDFS資料至OSS,資料不斷增量增加,在Distcp過程中可能已經產生了新檔案,該使用哪些參數處理?
- 未產生上一次Copy的檔案資訊,需要指定產生manifest檔案,記錄已完成的檔案資訊。在情境一的基礎上增加
--outputManifest=manifest-2020-04-17.gz和--requirePreviousManifest=false兩個資訊,樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --outputManifest=manifest-2020-04-17.gz --requirePreviousManifest=false --parallelism 20參數含義如下:--outputManifest:指定產生的manifest檔案,檔案名稱自訂但必須以gz結尾,例如manifest-2020-04-17.gz,該檔案會存放在--dest指定的目錄下。--requirePreviousManifest:無已產生的歷史manifest檔案資訊。
- 當前一次Distcp任務結束後,來源目錄可能已經產生了新檔案,這時候需要增量同步處理新檔案。在情境一的基礎上增加
--outputManifest=manifest-2020-04-17.gz和--previousManifest=oss://yang-hhht/hourly_table/manifest-2020-04-17.gz兩個資訊,樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --outputManifest=manifest-2020-04-17.gz --requirePreviousManifest=false --parallelism 20hadoop jar jindo-distcp-2.7.3.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --outputManifest=manifest-2020-04-18.gz --previousManifest=oss://yang-hhht/hourly_table/manifest-2020-04-17.gz --parallelism 10 - 重複執行步驟2,不斷同步增量檔案。
情境五:如果需要指定Jindo DistCp作業在Yarn上的隊列以及可用頻寬,該使用哪些參數?
在情境一的基礎上需要增加兩個參數。兩個參數可以配合使用,也可以單獨使用。
--queue:指定Yarn隊列的名稱。--bandwidth:指定頻寬的大小,單位為MB。
樣本如下。
hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --queue yarnqueue --bandwidth 6 --parallelism 10情境六:當通過低頻或者歸檔形式寫入OSS,該使用哪些參數?
- 當通過歸檔形式寫入OSS時,需要在情境一的基礎上增加
--archive參數,樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --archive --parallelism 20 - 當通過低頻形式寫入OSS時,需要在情境一的基礎上增加
--ia參數,樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --ia --parallelism 20
情境七:針對小檔案比例和檔案大小情況,該使用哪些參數來最佳化傳輸速度?
- 小檔案較多,大檔案較大情況。
如果要Copy的所有檔案中小檔案的佔比較高,大檔案較少,但是單個檔案資料較大,在正常流程中是按照隨機方式來進行Copy檔案分配,此時如果不做最佳化很可能造成一個Copy進程分配到大檔案的同時也分配到很多小檔案,不能發揮最好的效能。
在情境一的基礎上增加--enableDynamicPlan開啟最佳化選項,但不能和--enableBalancePlan一起使用。樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --enableDynamicPlan --parallelism 10最佳化對比如下。
- 檔案總體均衡,大小差不多情況。如果您要Copy的資料裡檔案大小總體差不多,比較均衡,您可以使用
--enableBalancePlan最佳化。樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --enableBalancePlan --parallelism 10最佳化對比如下。
情境八:如果需要使用S3作為資料來源,該使用哪些參數?
需要在情境一的基礎上替換OSS的AccessKey和EndPoint資訊轉換成S3參數:
--s3Key:串連S3的AccessKey ID。--s3Secret:串連S3的AccessKey Secret。--s3EndPoint:串連S3的EndPoint資訊。
樣本如下。
hadoop jar jindo-distcp-<version>.jar --src s3a://yourbucket/ --dest oss://yang-hhht/hourly_table --s3Key yourkey --s3Secret yoursecret --s3EndPoint s3-us-west-1.amazonaws.com --parallelism 10情境九:如果需要寫入檔案至OSS並壓縮檔(LZO和GZ格式等)時,該使用哪些參數?
如果您想壓縮寫入的目標檔案,例如LZO和GZ等格式,以降低目標檔案的儲存空間,您可以使用--outputCodec參數來完成。
需要在情境一的基礎上增加
--outputCodec參數,樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --outputCodec=gz --parallelism 10Jindo DistCp支援轉碼器GZIP、GZ、LZO、LZOP和SNAPPY以及關鍵字none和keep(預設值)。這些關鍵字含義如下:
- none表示儲存為未壓縮的檔案。如果檔案已壓縮,則Jindo DistCp會將其解壓縮。
- keep表示不變更檔壓縮形態,按原樣複製。
說明 如您在開源Hadoop叢集環境中使用LZO壓縮功能,則您需要安裝gplcompression的native庫和hadoop-lzo包,
情境十:如果需要把本次Copy中符合特定規則或者同一個父目錄下的部分子目錄作為Copy對象,該使用哪些參數?
- 如果您需要將Copy列表中符合一定規則的檔案進行Copy,需要在情境一的基礎上增加
--srcPattern參數,樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --srcPattern .*\.log --parallelism 10--srcPattern:進行過濾的Regex,符合規則進行Copy,否則拋棄。 - 如果您需要Copy同一個父目錄下的部分子目錄,需要在情境一的基礎上增加
--srcPrefixesFile參數。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --srcPrefixesFile file:///opt/folders.txt --parallelism 20--srcPrefixesFile:儲存需要Copy的同父目錄的資料夾清單的檔案。樣本中的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
情境十一:如果想合并符合一定規則的檔案,以減少檔案個數,該使用哪些參數?
需要在情境一的基礎上增加如下參數:
--targetSize:合并檔案的最大大小,單位MB。--groupBy:合并規則,Regex。
樣本如下。
hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --targetSize=10 --groupBy='.*/([a-z]+).*.txt' --parallelism 20情境十二:如果Copy完檔案,需要刪除原檔案,只保留目標檔案時,該使用哪些參數?
需要在情境一的基礎上,增加
--deleteOnSuccess參數,樣本如下。hadoop jar jindo-distcp-<version>.jar --src /data/incoming/hourly_table --dest oss://yang-hhht/hourly_table --ossKey yourkey --ossSecret yoursecret --ossEndPoint oss-cn-hangzhou.aliyuncs.com --deleteOnSuccess --parallelism 10情境十三:如果不想將OSS AccessKey這種參數寫在命令列裡,該如何處理?
通常您需要將OSS AccessKey和endPoint資訊寫在參數裡,但是Jindo DistCp可以將OSS的AccessKey ID、AccessKey Secret和Endpoint預先寫在Hadoop的core-site.xml檔案裡 ,以避免使用時多次填寫的問題。
- 如果您需要儲存OSS的AccessKey相關資訊,您需要將以下資訊儲存在core-site.xml中。
<configuration> <property> <name>fs.jfs.cache.oss-accessKeyId</name> <value>xxx</value> </property> <property> <name>fs.jfs.cache.oss-accessKeySecret</name> <value>xxx</value> </property> <property> <name>fs.jfs.cache.oss-endpoint</name> <value>oss-cn-xxx.aliyuncs.com</value> </property> </configuration> - 如果您需要儲存S3的AccessKey相關資訊,您需要將以下資訊儲存在core-site.xml中。
<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>