Jindo DistCp は、E-MapReduce (EMR) 向けに構築された分散型データコピーツールです。Hadoop 分散ファイルシステム (HDFS) と OSS 間でファイルを転送でき、フィルタリング、リアルタイム圧縮、小ファイルのマージ、増分コピー、およびジョブレベルのトランザクション整合性をサポートします。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
バージョン 3.28.0 以降の EMR クラスター。詳細については、「クラスターの作成」をご参照ください。
クラスターのマスターノードへの SSH アクセス。詳細については、「クラスターへのログイン」をご参照ください。
クイックスタート
マスターノードにログインし、基本的なコピー操作を実行します。
jindo distcp --src /opt/tmp --dest oss://<yourBucketName>/tmp<yourBucketName> をご利用の OSS バケット名に置き換えてください。--src 以下にあるすべてのファイルがデフォルトでコピーされます。宛先のルートディレクトリが存在しない場合、Jindo DistCp により自動的に作成されます。
利用可能なすべてのオプションを表示するには、次のコマンドを実行します。
jindo distcp --helpオプションのリファレンス
以下の表に、サポートされているすべてのオプションを示します。このドキュメント内のすべての例では、ソースとして /data/incoming/hourly_table、宛先として oss://<yourBucketName>/hourly_table を使用しています。これらのプレースホルダーは、実際の値に置き換えてください。
| オプション | 説明 | 備考 |
|---|---|---|
--src | ファイルをコピーするソースディレクトリ | 必須 |
--dest | ファイルをコピーする宛先ディレクトリ | 必須 |
--parallelism | 並列実行する reduce タスク数。mapreduce.job.reduces を設定します。デフォルト値:7 | 利用可能なクラスターリソースに応じて調整してください |
--srcPattern | 完全なパスに基づいてソースファイルをフィルタリングする正規表現 | — |
--deleteOnSuccess | コピーが成功した後にソースファイルを削除 | --groupBy または --targetSize |
--outputCodec | コピーされたファイルの圧縮コーデック。有効な値:gzip、gz、lzo、lzop、snappy、none、keep。デフォルト値:keep | none は、既に圧縮済みのファイルを解凍します。keep は、元のフォーマットを保持します |
--outputManifest | 出力マニフェストファイルの名前(GZ 形式のみ) | --requirePreviousManifest=false と併用して新しいマニフェストを作成します |
--requirePreviousManifest | 実行前に既存のマニフェストが存在することを要求 | 最初のマニフェストを作成する場合は false に設定します |
--previousManifest | 既存のマニフェストファイルへのパス | --outputManifest と併用して増分コピーの追跡を行います |
--copyFromManifest | マニフェストファイルに記載されたファイルのみをコピー | --previousManifest と併用してマニフェストを再実行します |
--srcPrefixesFile | 1 行につき 1 つのソース URI プレフィックスを含むテキストファイルへのパス | 単一のジョブで複数のソースフォルダからコピーできるようにします |
--groupBy | 入力ファイルをマージするためにグループ化する正規表現 | --targetSize オプションとともに使用します--targetSize |
--targetSize | マージ後の出力ファイルの目標サイズ(MB 単位) | --groupBy |
--enableBalancePlan | 各階層(小ファイル/大ファイル)内のファイルサイズが比較的均一な場合に、ジョブ割り当てを最適化します | --groupBy または --targetSize |
--enableDynamicPlan | ファイルサイズが大きくばらつくワークロードに対して、コピータスクを動的に割り当てます | --groupBy または --targetSize |
--enableTransaction | ジョブレベルのトランザクション整合性を有効化 | — |
--diff | コピー後にソースと宛先のファイルリストを比較 | 差異がある場合、宛先ディレクトリにマニフェストファイルを生成します。圧縮または展開が適用された場合、正確なサイズ比較は行われません |
--cleanUpPending | 失敗したアップロードによって残された残留ファイル(uploadId で管理)を削除 | — |
--key | EMR 外部からの OSS アクセス用 AccessKey ID | AccessKey 無しアクセスが利用できない場合に使用します |
--secret | EMR 外部からの OSS アクセス用 AccessKey Secret | AccessKey 無しアクセスが利用できない場合に使用します |
--endPoint | OSS エンドポイント | AccessKey 無しアクセスが利用できない場合に使用します |
--policy | 宛先の OSS ストレージクラス。有効な値:archive、ia | — |
ファイルのコピー
--src および --dest を使用して、ソースおよび宛先のディレクトリを指定します。--src 以下にあるすべてのファイルがデフォルトでコピーされます。宛先のルートディレクトリが存在しない場合、Jindo DistCp により自動的に作成されます。
以下のコマンドは、/opt/tmp HDFS ディレクトリから OSS バケットへすべてのファイルをコピーします。
jindo distcp --src /opt/tmp --dest oss://<yourBucketName>/tmpパターンによるファイルのフィルタリング
--srcPattern を使用すると、完全なパスが正規表現に一致するファイルのみをコピーできます。
/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 ファイルのみをコピーするには、--srcPattern を .*\.log に設定します。
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 を追加します。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --deleteOnSuccess --parallelism 20コピー中のファイルの圧縮
--outputCodec を使用すると、コピー時にファイルをリアルタイムで圧縮できます。以下のコマンドは、すべてのファイルを gzip で圧縮します。
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 拡張子が付与されています。
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--outputCodec の有効な値:gzip、gz、lzo、lzop、snappy、none、keep。デフォルト値:keep。
none:既に圧縮済みのファイルを解凍します。圧縮されていないファイルはそのまま保持します。keep:元の圧縮形式を保持します。
オープンソースの Hadoop クラスターで LZO コーデックを使用するには、ネイティブ gplcompression ライブラリおよび hadoop-lzo パッケージをインストールしてください。
マニフェストファイルによるコピーの追跡
マニフェストファイルは、ジョブでコピーされたすべてのファイルの宛先パス、ソースパス、サイズを記録します。増分コピーの追跡や完了状況の検証にマニフェストファイルを使用します。
マニフェストファイルの作成
新しいマニフェストファイルを生成するには、--requirePreviousManifest=false を設定します。ファイルは常に 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マニフェストの各行は JSON レコードです。
{"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}以前のマニフェストを使用した新規ファイルのみのコピー
ソースディレクトリに新しいファイルが追加された場合、--previousManifest を使用すると、すでにコピー済みのファイルをスキップし、新規のファイルのみを転送できます。新しいマニフェスト (--outputManifest) には、以前および新たにコピーされたファイルの両方が含まれるため、完全な履歴を取得できます。
以下のコマンドは、manifest-2020-04-17.gz 以降に追加されたファイルのみをコピーします。
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 202 つのマニフェストを比較して、新規にコピーされたファイルを確認します。
hadoop fs -text oss://<yourBucketName>/hourly_table/manifest-2020-04-18.gz > current.lst
diff before.lst current.lstdiff 出力には、2 つ新たに追加されたファイルが表示されます。
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 と --previousManifest を併用すると、以前に生成されたマニフェストに記載されたファイルを正確にコピーできます。
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 は、1 行につき 1 つのソース URI プレフィックスを含むテキストファイルを受け入れるため、単一のジョブで複数のフォルダからコピーできます。
ソースフォルダの一覧を表示します。
hdfs dfs -ls oss://<yourBucketName>/hourly_tableFound 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生成された folders.txt を表示して、内容を確認します。
cat folders.txthdfs://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小ファイルのマージ
HDFS から多数の小ファイルを読み取ると、処理パフォーマンスが低下します。--groupBy と --targetSize を併用することで、小ファイルをより大きな出力ファイルにマージできます。--groupBy はファイルをグループ化する正規表現であり、--targetSize は各マージ後のファイルの最大サイズ(MB 単位)を設定します。
ソースディレクトリには 8 つの小ファイルがあります。
hdfs dfs -ls /data/incoming/hourly_table/2017-02-01/03Found 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 ファイルを、最大 10 MB の単一の出力ファイルにマージします。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --targetSize=10 --groupBy='.*/([a-z]+).*.txt' --parallelism 20結果を確認します。2 つの TXT ファイルが 1 つにマージされています。
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コピー性能の最適化
Jindo DistCp は、混合サイズのファイルをコピーする際にパフォーマンスを向上させるための 2 つのジョブ割り当て戦略を提供します。ワークロードに応じて選択し、--parallelism を調整して同時実行数を制御してください。
| 戦略 | 使用タイミング | オプション |
|---|---|---|
| バランスプラン | 小ファイルグループおよび大ファイルグループ内でのファイルサイズが比較的均一な場合 | --enableBalancePlan |
| ダイナミックプラン | ファイルサイズが著しくばらつき、ほとんどのファイルが小ファイルである場合 | --enableDynamicPlan |
いずれのオプションも指定しない場合、ファイルは reduce タスク間でランダムに割り当てられます。
--enableBalancePlanおよび--enableDynamicPlanのどちらも、--groupByまたは--targetSizeと併用できません。
バランスプラン:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableBalancePlan --parallelism 20ダイナミックプラン:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableDynamicPlan --parallelism 20--parallelism を調整して、同時実行する reduce タスク数を制御します。デフォルト値は 7 です。クラスターに利用可能なリソースがより多い場合は、この値を増やすことでコピーのスループットを向上させることができます。
トランザクション整合性の有効化
--enableTransaction を使用すると、ジョブレベルのトランザクション整合性が強制されます。ジョブ内のすべてのファイルは、すべて成功するか、すべてロールバックされます。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableTransaction --parallelism 20コピー完了の検証
コピージョブが完了した後、--diff を使用して、ソースと宛先のファイルリストを比較します。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --diffすべてのファイルが正常にコピーされた場合:
INFO distcp.JindoDistCp: distcp has been done completely宛先に不足しているファイルがある場合、Jindo DistCp はそのファイルを一覧表示するマニフェストファイルを宛先ディレクトリに生成します。--copyFromManifest および --previousManifest を使用して、それらのファイルをコピーできます。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --previousManifest=file:///opt/manifest-2020-04-17.gz --copyFromManifest --parallelism 20Jindo DistCp がコピー中にファイルの圧縮または展開を実行した場合、--diffは正確なファイルサイズ比較を返しません。宛先が HDFS ディレクトリの場合、--destを以下のいずれかの形式で指定してください:/path、hdfs://hostname:ip/path、またはhdfs://headerIp:ip/path。その他の形式(例:hdfs:///path、hdfs:/path)はサポートされておらず、diff 操作が失敗します。
DistCp カウンターの確認
ジョブが完了した後、MapReduce ジョブ出力の「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=0Jindo DistCp がコピー中にファイルの圧縮または展開を実行した場合、Bytes Destination CopiedおよびBytes Source Readの値が異なる場合があります。
AccessKey ペアによる OSS へのアクセス
デフォルトでは、EMR は OSS への AccessKey 無しアクセスを使用します。Jindo DistCp を EMR 外部から実行する場合、または AccessKey 無しアクセスが利用できない場合は、--key、--secret、および --endPoint を使用して AccessKey ペアを指定します。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --key <yourAccessKeyId> --secret <yourAccessKeySecret> --endPoint oss-cn-hangzhou.aliyuncs.com --parallelism 20<yourAccessKeyId> を Alibaba Cloud の AccessKey ID に、<yourAccessKeySecret> を AccessKey Secret に置き換えてください。
OSS アーカイブまたは低頻度アクセスストレージへの書き込み
--policy を使用すると、コピー中にデータを直接低コストの OSS ストレージクラスに書き込むことができます。
アーカイブストレージ:
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 タスクが途中で失敗した場合、宛先に部分的にアップロードされたファイルが残ることがあります。OSS はこれらのファイルを内部的に uploadId で管理しますが、ディレクトリ一覧には表示されません。--cleanUpPending を追加すると、タスク完了後に自動的にクリーンアップされます。
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --cleanUpPending --parallelism 20あるいは、OSS コンソールから残留ファイルを手動で削除することもできます。
よくある質問
圧縮後に --diff が不正確なファイルサイズを報告するのはなぜですか?
Jindo DistCp がコピー中にファイルの圧縮または展開を実行すると、ソースと宛先のファイルサイズは設計上異なります。--diff は生のファイルサイズを比較するため、不一致が報告されます。これは予期される動作であり、コピー失敗ではありません。コピーされたファイル数を確認するには、代わりに DistCp カウンターを確認してください。
`--enableBalancePlan` または `--enableDynamicPlan` を `--groupBy` と併用できますか?
いいえ。両方のプランオプションは、--groupBy および --targetSize と互換性がありません。小ファイルのマージを行う場合、ファイルの割り当てはグループ化パターンによって決定されるため、これらのプランオプションは効果を持たず、同一コマンド内で使用することはできません。
--deleteOnSuccess を --groupBy と併用できますか?
いいえ。--deleteOnSuccess は --groupBy または --targetSize と併用できません。マージ後、出力は新しいマージファイルとなるため、同一ジョブ内で元の入力ファイルを削除することはサポートされていません。
--dest の宛先 HDFS パス形式が --diff で制限されるのはなぜですか?
宛先が HDFS ディレクトリの場合、Jindo DistCp は --dest を /path、hdfs://hostname:ip/path、または hdfs://headerIp:ip/path の形式で指定することを要求します。hdfs:///path や hdfs:/path のような形式はサポートされておらず、diff 操作が失敗します。