すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:Jindo DistCpを使う

最終更新日:Apr 11, 2025

このトピックでは、データコピーツールJindo DistCpの使用方法について説明します。

前提条件

3.28.0以降のバージョンのE-MapReduce (EMR) クラスターが作成されます。 クラスターの作成方法については、「クラスターの作成」をご参照ください。

Jindo DistCpを使う

  1. SSHモードでEMRクラスターのマスターノードにログインします。

    詳細については、「クラスターへのログイン」をご参照ください。

  2. 次のコマンドを実行して、ヘルプ情報を取得します。

    jindo distcp -- ヘルプ

    次の情報が返されます。

    -- help-ヘルプテキストを印刷する
         -- src=VALUE-ファイルをコピーするディレクトリ
         -- dest=VALUE-ファイルをコピーするディレクトリ
         -- parallelism=VALUE-タスクの並列処理のコピー
         -- outputManifest=VALUE-マニフェストファイルの名前
         -- previousManifest=VALUE-既存のマニフェストファイルへのパス
         -- requirePreviousManifest=VALUE-指定されている場合、前のマニフェストが存在することを要求する
         -- copyFromManifest-ディレクトリをリストする代わりにマニフェストからコピーする
         -- srcPrefixesFile=VALUE-ソースURIプレフィックスのリストを含むファイル
         -- srcPattern=VALUE-このパターンに一致するソースファイルのみを含める
         -- deleteOnSuccess-コピーが成功した後に入力ファイルを削除する
         -- outputCodec=VALUE-出力ファイルの圧縮コーデック
         -- groupBy=VALUE-入力ファイルをグループ化するパターン
         -- targetSize=VALUE-出力ファイルのターゲットサイズ
         -- enableBalancePlan-プランのコピータスクを有効にしてバランスをとる
         -- enableDynamicPlan-プランコピータスクを動的に有効にする
         -- enableTransaction-ジョブでトランザクションを明示的に有効にする
         -- diff-srcとdest filelist
    の違いを示す

-- srcと -- dest

-- srcはソースディレクトリを指定します。 -- destは、宛先ディレクトリを指定します。

デフォルトでは、Jindo DistCpは -- srcで指定されたディレクトリ内のすべてのファイルを -- destで指定されたディレクトリにコピーします。 ルートディレクトリを指定しない場合、Jindo DistCpは自動的にルートディレクトリを作成します。

たとえば、次のコマンドを実行して、HDFSの /opt/tmpディレクトリ内のファイルをOSSバケットにコピーできます。

jindo distcp -- src /opt/tmp -- dest oss://<yourBucketName>/tmp
説明

yourBucketNameは、OSSバケットの名前です。

-- 並列処理

-- parallelismは、ファイルをコピーするために実行されるmapreduceジョブのMapReduce. job.reduceパラメーターを指定します。 デフォルト値は7です。 使用可能なクラスターリソースに基づいて -- parallelismをカスタマイズできます。 これにより、並列に実行できるreduceタスクの数を決定できます。

たとえば、次のコマンドを実行して、HDFSの /opt/tmpディレクトリ内のファイルをOSSバケットにコピーできます。

jindo distcp -- src /opt/tmp -- dest oss://<yourBucketName>/tmp -- parallelism 20

-- srcPattern

-- srcPatternは、コピー操作のファイルをフィルタリングする正規表現を指定します。 正規表現はフルパスと一致する必要があります。

たとえば、/data/incoming/hourly_table/2017-02-01/03ディレクトリ内のすべてのログファイルをコピーする必要がある場合は、-- srcPatternを. *\.logに設定します。

次のコマンドを実行して、/data/incoming/hourly_table/2017-02-01/03ディレクトリのファイルを表示します。

hdfs dfs -ls /data/incoming/hourly_table/2017-02-01/03

次の情報が返されます。

6アイテムを見つけました
-rw-r ---- 2ルートhadoop 2252 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/000151.sst
-rw-r ---- 2ルートhadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/1.log
-rw-r ---- 2ルートhadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/2.log
-rw-r ---- 2ルートhadoop 4891 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/OPTIONS-000109
-rw-r ---- 2ルートhadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp01.txt
-rw-r ---- 2ルート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 -- 並列処理20

次のコマンドを実行して、宛先OSSバケット内のファイルを表示します。

hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03

次の情報が返されます。 ソースディレクトリ内のログファイルのみがコピーされます。

2商品を見つけました
-rw-rw- 1 4891 2020-04-17 20:52 oss://<yourBucketName>/hourly_table/2017-02-01/03/1.log
-rw-rw- 1 4891 2020-04-17 20:52 oss://<yourBucketName>/hourly_table/2017-02-01/03/2.log 

-- deleteOnSuccess

-- deleteOnSuccessは、コピー操作が成功した後、Jindo DistCpがソースディレクトリからコピーされたファイルを削除できるようにします。

たとえば、次のコマンドを実行して、/data/incoming/hourly_table内のファイルをOSSバケットにコピーし、コピーしたファイルをソースディレクトリから削除できます。

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- deleteOnSuccess -- 並列処理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

次の情報が返されます。 宛先ディレクトリのファイルはGZ形式で圧縮されます。

6アイテムを見つけました
-rw-rw- 1 938 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/000151 .sst.gz
-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/1.log.gz
-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/2.log.gz
-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/OPTIONS-000109.gz
-rw-rw- 1 506 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp01.txt.gz
-rw-rw- 1 506 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp06.txt.gz 

このパラメーターは、gzip、gz、lzo、lzop、snappy、none、またはkeepに設定できます。 デフォルト値: keep どれもの説明とキープ:

  • none: Jindo DistCpはコピーしたファイルを圧縮しません。 ファイルが圧縮されている場合、Jindo DistCpはそれらを解凍します。

  • keep: Jindo DistCpは、圧縮を変更せずにファイルをコピーします。

説明

オープンソースのHadoopクラスターでLZOコーデックを使用する場合は、gplcompressionのネイティブライブラリとhadoop-lzoパッケージをインストールする必要があります。

-- outputManifestおよび -- requirePreviousManifest

-- outputManifestは、Jindo DistCpによってコピーされたすべてのファイルに関する情報を含むマニフェストファイルを生成します。 情報には、宛先ファイル、ソースファイル、およびファイルサイズが含まれます。

マニフェストファイルを生成する場合は、-- requirePreviousManifestfalseに設定します。 デフォルトでは、ファイルはGZ形式で圧縮されています。 これは唯一サポートされている形式です。

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- outputManifest=manifest-2020-04-17.gz -- requirePreviousManifest=false -- 並列処理20

次のコマンドを実行して、ファイルの内容を表示します。

hadoop fs -text oss://<yourBucketName>/hourly_table/manifest-2020-04-17.gz > before.lst
. 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は、以前にコピーされたファイルのリストを含むマニフェストファイルを生成します。 これにより、操作の全履歴を再作成し、現在のジョブによってコピーされたファイルを確認できます。

たとえば、2つのファイルがソースディレクトリに追加されます。 次のコマンドを実行して、新しく追加されたファイルをコピーします。

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-並列処理20

次のコマンドを実行して、コピーしたファイルを表示します。

hadoop fs -text oss://<yourBucketName>/hourly_table/manifest-2020-04-18.gz > current.lst
. lst current.lst
の前のdiff

次の情報が返されます。

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

-- copyFromManifestを使用して、以前に -- outputManifestによって生成されたマニフェストファイルを指定し、マニフェストファイルにリストされているファイルを宛先ディレクトリにコピーできます。 例:

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は、Jindo DistCpが一度に複数のフォルダ内のファイルをコピーできるようにします。

次のコマンドを実行して、hourly_tableの下のサブフォルダーを表示します。

hdfs dfs -ls oss://<yourBucketName>/hourly_table

次の情報が返されます。

4商品を見つけました
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という名前のファイルが生成されます。 hourly_tableの下の各サブフォルダに対応するプレフィックスが含まれています。

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- srcPrefixesFileファイル: /// opt/folders.txt -- 並列処理20

次のコマンドを実行して、folders.txtファイルの内容を表示します。

猫folders.txt

次の情報が返されます。

hdfs:// emr-header-1.cluster-50466:9000 /データ /受信 /hourly_table/2017-02-01
hdfs:// emr-header-1.cluster-50466:9000 /データ /受信 /hourly_table/2017-02-02 

-- groupByおよび-targetSize

HDFSから多数の小さなファイルを読み取ると、データ処理のパフォーマンスに影響します。 そのため、Jindo DistCpを使用して、小さなファイルを指定したサイズの大きなファイルにマージすることをお勧めします。 これにより、分析パフォーマンスが最適化され、コストが削減されます。

次のコマンドを実行して、指定したフォルダ内のファイルを表示します。

hdfs dfs -ls /data/incoming/hourly_table/2017-02-01/03

次の情報が返されます。

は8アイテムを見つけました
-rw-r ---- 2ルートhadoop 2252 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/000151.sst
-rw-r ---- 2ルートhadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/1.log
-rw-r ---- 2ルートhadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/2.log
-rw-r ---- 2ルートhadoop 4891 2020-04-17 21:08 /data/incoming/hourly_table/2017-02-01/03/5.log
-rw-r ---- 2ルートhadoop 4891 2020-04-17 21:08 /data/incoming/hourly_table/2017-02-01/03/6.log
-rw-r ---- 2ルートhadoop 4891 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/OPTIONS-000109
-rw-r ---- 2ルートhadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp01.txt
-rw-r ---- 2ルートhadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp06.txt 

次のコマンドを実行して、フォルダ内のTXTファイルをそれぞれ10 MB以下のサイズのファイルにマージします。

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table-targetSize=10 -- groupBy='.*/([a-z]+).*.txt' -- 並列処理20

次のコマンドを実行して、宛先ディレクトリのファイルを表示します。 2つのTXTファイルが1つにマージされます。

hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03 /
1商品を見つけました
-rw-rw- 1 2032 2020-04-17 21:18 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp2 

-- enableBalancePlan

小さいファイルと大きいファイルの両方をコピーする場合でも、小さいファイルと大きいファイルのサイズに大きな違いがない場合は、-- enableBalancePlanを使用してジョブ割り当て計画を最適化できます。 これにより、Jindo DistCpのコピーパフォーマンスが向上します。 アプリケーションプランを指定しない場合、ファイルはランダムに割り当てられます。

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- enableBalancePlan -- 並列処理20
説明

このオプションは、-- groupByまたは -- targetSizeと同じコマンドでは使用できません。

-- enableDynamicPlan

コピーするファイルのサイズが大きく異なり、ほとんどのファイルが小さなファイルである場合は、-- enableDynamicPlanを使用してジョブ割り当て計画を最適化できます。 これにより、Jindo DistCpのコピーパフォーマンスが向上します。

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- enableDynamicPlan -- 並列処理20
説明

このオプションは、-- groupByまたは -- targetSizeと同じコマンドでは使用できません。

-- enableTransaction

-- enableTransactionは、ジョブレベルの整合性とジョブ間のトランザクションサポートを保証します。 例:

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- enableTransaction -- parallelism 20

-- diff

ファイルをコピーした後、-- diffを使用して、ソースディレクトリとターゲットディレクトリの違いを確認できます。

例:

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- diff

すべてのファイルをコピーすると、次の情報が返されます。

INFO distcp.JindoDistCp: distcpは完全に
行われました

一部のファイルがコピーされない場合、これらのファイルのリストを含むマニフェストファイルがコピー先ディレクトリに生成されます。 次に、-- copyFromManifest-- previousManifestを使用して、リスト内のファイルを宛先ディレクトリにコピーできます。 このようにして、データ量およびファイル量が検証される。 Jindo DistCpがコピープロセス中に圧縮または解凍操作を実行した場合、-- diffは正確なファイルサイズの違いを返しません。

jindo distcp -- src /data/incoming/hourly_table-dest oss://<yourBucketName>/hourly_table-dest oss://<yourBucketName>/hourly_table-previousManifest=ファイル: /// opt/manifest-2020-04-17.gz-copyFromManifest -- parallelism 20
説明

宛先ディレクトリがHDFSディレクトリの場合、-- dest/pathhdfs:// hostname:ip/path、またはhdfs:// headerIp:ip/pathの形式で指定する必要があります。 hdfs:/// pathhdfs:/pathなどの他の形式はサポートされていません。

DistCpカウンタの確認

次のコマンドを実行して、MapReduceのカウンタ情報のDistCp Countersを確認します。

Distcpカウンタ
        コピー先バイト数=11010048000
        バイトソース読み取り=11010048000
        コピーされたファイル=1001

シャッフルエラー
        BAD_ID=0
        接続=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0 
説明

Jindo DistCpがコピープロセス中に圧縮または解凍操作を実行した場合、Bytes Destination CopiedBytes Source Readの値は異なる場合があります。

AccessKeyペアを使用したOSSへのアクセス

EMR外のインスタンスからOSSにアクセスする場合、またはAccessKeyなしのアクセスがサポートされていない場合は、AccessKeyペアを使用してOSSにアクセスできます。 コマンドで -- key、-- secret、および -- endPointパラメーターを設定して、AccessKeyペアを指定します。

例:

jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- key <yourAccessKeyId> -- secret <yourAccessKeySecret> -- endPoin t oss-cn-hangzhou.aliyuncs.com -- 並列処理20

yourAccessKeyIdは、Alibaba CloudアカウントのAccessKey IDです。 yourAccessKeySecretは、Alibaba CloudアカウントのAccessKeyシークレットです。

OSS IAまたはアーカイブストレージへのデータの書き込み

DistCpタスクを使用してOSSにデータを書き込む場合、OSSアーカイブまたは低頻度アクセス (IA) ストレージにデータを書き込むことができます。

  • アーカイブストレージクラス (-- Archive) の例:

    jindo distcp -- src /data/incoming/hourly_table -- dest oss://<yourBucketName>/hourly_table -- policy archive -- parallelism 20
  • IAストレージクラス (-- 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 -- 並列処理20