全部產品
Search
文件中心

E-MapReduce:Jindo DistCp情境化使用指導

更新時間:Jul 01, 2024

本文通過情境化為您介紹如何使用Jindo DistCp。

前提條件

情境預覽

Jindo DistCp常用使用情境如下所示:

情境一:匯入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任務完成後進行如下操作:
  1. 增加一個--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.
  2. 檔案沒有傳輸完成時會產生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 20

    file:///opt/manifest-2020-04-17.gz為您當前執行命令的本地路徑。

情境四:成功匯入HDFS資料至OSS,資料不斷增量增加,在Distcp過程中可能已經產生了新檔案,該使用哪些參數處理?

  1. 未產生上一次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檔案資訊。
  2. 當前一次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 20
    hadoop 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
  3. 重複執行步驟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
    最佳化對比如下。最佳化2

情境八:如果需要使用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 10
Jindo 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>