S3DistCp (s3-dist-cp) - Amazon EMR

S3DistCp (s3-dist-cp)

Apache DistCp は、大量のデータをコピーするときに使用できるオープンソースツールです。S3DistCp は DistCp に似ていますが、特に Amazon S3 の AWS で動作するように最適化されています。Amazon EMR バージョン 4.0 以降での S3DistCp のコマンドは s3-dist-cp で、これをクラスターのステップまたはコマンドラインに追加します。S3DistCp を使用すると、Amazon S3 の大量のデータを HDFS に効率的にコピーできます。ここにコピーされたデータは、Amazon EMR クラスターの以降のステップで処理できます。また、S3DistCp を使用して、Amazon S3 バケット間で、または HDFS から Amazon S3 にデータをコピーすることもできます。S3DistCp は、複数のバケットおよび複数の AWS アカウントでたくさんのオブジェクトを並行コピーすると、よりスケーラブルで効率的です。

実際のシナリオで S3DistCP Sの柔軟性を示す特定のコマンドについては、AWS Big Data ブログの「Seven tips for using S3DistCp」を参照してください。

DistCp と同様に、S3DistCp は MapReduce を使用して、分散された方法でコピーを実行します。複数のサーバー全体でのコピー、エラー処理、復旧、および報告のタスクが共有されます。Apache DistCp オープンソースプロジェクトの詳細については、Apache Hadoop ドキュメントの「DistCp ガイド」を参照してください。

指定したファイルの一部またはすべてを S3DistCp がコピーできない場合、クラスターステップは失敗し、ゼロ以外のエラーコードを返します。この場合、S3DistCp では、コピーされたファイルの一部がクリーンアップされません。

重要

S3DistCp では、アンダースコア文字を含む Amazon S3 バケット名はサポートされません。

S3DistCp は、Parquet 形式ファイルの連結をサポートしていません。代わりに PySpark を使用します。詳細については、「Amazon EMR での Parquet ファイルの連結」を参照してください。

S3DistCP を使用して (ディレクトリではなく) 1 つのファイルを S3 から HDFS にコピーするときにコピーエラーを回避するには、Amazon EMR バージョン 5.33.0 以降、または Amazon EMR 6.3.0 以降を使用してください。

S3DistCp のオプション

S3DistCp は DistCp と似ていますが、データのコピーと圧縮の方法を変更するためのさまざまな一連のオプションをサポートしています。

S3DistCp を呼び出す際に、次の表で示されているオプションを指定できます。オプションは、引数リストを使用してステップに追加されます。S3DistCp の引数の例を次の表に示します。

オプション 説明 必須
‑‑src=LOCATION

コピーするデータのロケーション。HDFS または Amazon S3 ロケーションのいずれかを指定できます。

例: ‑‑src=s3://DOC-EXAMPLE-BUCKET1/logs/j-3GYXXXXXX9IOJ/node

重要

S3DistCp では、アンダースコア文字を含む Amazon S3 バケット名はサポートされません。

Yes
‑‑dest=LOCATION

データのコピー先。HDFS または Amazon S3 ロケーションのいずれかを指定できます。

例: ‑‑dest=hdfs:///output

重要

S3DistCp では、アンダースコア文字を含む Amazon S3 バケット名はサポートされません。

Yes
‑‑srcPattern=PATTERN

‑‑src でのデータのサブセットへのコピー操作をフィルタリングする正規表現‑‑srcPattern‑‑groupBy がどちらも指定されていない場合は、‑‑src のすべてのデータが ‑‑dest にコピーされます。

正規表現の引数にアスタリスク(*)などの特殊文字が含まれる場合は、正規表現または ‑‑args 文字列全体のいずれかを引用符(')で囲む必要があります。

例: ‑‑srcPattern=.*daemons.*-hadoop-.*

No
‑‑groupBy=PATTERN

複数のファイルを統合する正規表現。この表現に一致するファイルが S3DistCp によって統合されます。たとえば、このオプションを使用すると、1 時間で書き込まれたすべてのログファイルを 1 つのファイルに統合できます。統合されたファイル名は、グループ化のためのこの正規表現と一致する値になります。

括弧は、ファイルをグループ化する方法を示しています。括弧で囲まれたステートメントと一致するすべての項目が 1 つの出力ファイルに統合されます。正規表現に括弧で囲まれたステートメントが含まれない場合、クラスターは S3DistCp ステップで失敗し、エラーを返します。

正規表現の引数にアスタリスク(*)などの特殊文字が含まれる場合は、正規表現または ‑‑args 文字列全体のいずれかを引用符(')で囲む必要があります。

‑‑groupBy が指定されている場合は、指定されたパターンと一致するファイルのみがコピーされます。‑‑groupBy‑‑srcPattern は同時に指定する必要はありません。

例: ‑‑groupBy=.*subnetid.*([0-9]+-[0-9]+-[0-9]+-[0-9]+).*

No
‑‑targetSize=SIZE

‑‑groupBy オプションに基づいて作成するファイルのサイズ(メビバイト(Mib)単位)。整数の値である必要があります。‑‑targetSize が設定されている場合、S3DistCp はファイルのサイズをこの値に合わせようとしますが、コピーされたファイルの実際のサイズは、この値より大きかったり小さかったりする場合があります。ジョブはデータファイルのサイズに基づいて集計されるため、ターゲットファイルサイズがソースデータファイルのサイズに一致する場合があります。

‑‑groupBy によって統合されたファイルが ‑‑targetSize の値よりも大きい場合、そのファイルはパートファイルに分割され、それぞれのファイル名の末尾に数値が順番に付けられます。たとえば、myfile.gz に統合されたファイルは、myfile0.gzmyfile1.gz などにパートに分割されます。

例: ‑‑targetSize=2

No
‑‑appendToLastFile

Amazon S3 から HDFS へ既存するファイルをコピーする際の S3DistCp の動作を指定します。既存のファイルに新しいファイルのデータが追加されます。‑‑appendToLastFile を指定して ‑‑groupBy を使用すると、新しいデータは同じグループのファイルに追加されます。このオプションは、‑‑targetSize‑‑groupBy. を指定して使用した動作にも順守しています。

No
‑‑outputCodec=CODEC

コピーされたファイルで使用する圧縮コーデックを指定します。値としては gzipgzlzosnappy、または none をとることができます。このオプションを使用すると、たとえば、Gzip で圧縮された入力ファイルを LZO 圧縮の出力ファイルに変換したり、コピーオペレーションの一環としてファイルを解凍したりできます。出力コーデックを選択した場合、ファイル名には適切な拡張子(gzgzip など。拡張子は .gz)が付加されます。‑‑outputCodec の値を指定しない場合、圧縮に変更が加えられずにファイルがコピーされます。

例: ‑‑outputCodec=lzo

No
‑‑s3ServerSideEncryption

ターゲットデータが SSL を使って転送され、AWS サービス側キーを使用して Amazon S3 で自動的に暗号化されるようにします。S3DistCp を使用してデータを取得するとき、オブジェクトは自動的に暗号化解除されます。暗号化されていないオブジェクトを、暗号化が必要な Amazon S3 バケットにコピーしようとすると、操作は失敗します。詳細については、「データ暗号化の使用」を参照してください。

例: ‑‑s3ServerSideEncryption

No
‑‑deleteOnSuccess

コピーオペレーションが成功すると、このオプションにより、S3DistCp がコピーされたファイルをコピー元の場所を削除します。このオプションは、スケジュールされたタスクとして、ログファイルなどの出力ファイルを、あるロケーションから他のロケーションにコピーするときに役立ちます。これにより、同じファイルを 2 回コピーせずに済むようになります。

例: ‑‑deleteOnSuccess

No
‑‑disableMultipartUpload

マルチパートアップロードの使用を無効にします。

例: ‑‑disableMultipartUpload

No
‑‑multipartUploadChunkSize=SIZE

Amazon S3 マルチパートアップロードでの各パートサイズ (MiB 単位)。S3DistCp では、multipartUploadChunkSize より大きいデータをコピーする場合、マルチパートアップロードが使用されます。ジョブのパフォーマンスを向上させるには、各パートサイズを大きく設定します。デフォルトのサイズは 128 MiB です。

例: ‑‑multipartUploadChunkSize=1000

No
‑‑numberFiles

出力ファイル名の先頭に通し番号を付けます。‑‑startingIndex で別の値を指定しない限り、番号は 0 で開始されます。

例: ‑‑numberFiles

No
‑‑startingIndex=INDEX

‑‑numberFiles とともに使用され、通し番号の開始値を指定します。

例: ‑‑startingIndex=1

No
‑‑outputManifest=FILENAME

Gzip で圧縮されたテキストファイルを作成します。このテキストファイルには、S3DistCp によってコピーされたすべてのファイルのリストが含まれます。

例: ‑‑outputManifest=manifest-1.gz

No
‑‑previousManifest=PATH

‑‑outputManifest フラグを使用して S3DistCp への以前の呼び出し中に作成されたマニフェストファイルを読み込みます。この ‑‑previousManifest フラグが設定されている場合、このマニフェストにリストされているファイルは S3DistCp のコピーオペレーションから除外されます。‑‑outputManifest と共に ‑‑previousManifest が指定されている場合、新しいマニフェストファイルには、以前のマニフェストにリストされているファイルも表示されます。ただし、そのファイルはコピーされません。

例: ‑‑previousManifest=/usr/bin/manifest-1.gz

No
‑‑requirePreviousManifest

以前の S3DistCp の呼び出し中に作成したマニフェストファイルが必要です。これが false に設定されている場合、以前のマニフェストが指定されていないときにエラーが生成されません。デフォルトは true です。

No
‑‑copyFromManifest

‑‑previousManifest の逆を行い、S3DistCp において、指定したマニフェストファイルを、コピーから除外するファイルのリストではなく、コピーするファイルのリストとして使用します。

例: ‑‑copyFromManifest ‑‑previousManifest=/usr/bin/manifest-1.gz

No
‑‑s3Endpoint=ENDPOINT

ファイルをアップロードするときに使用する Amazon S3 エンドポイントを指定します。このオプションは、アップロード元とアップロード先の両方のエンドポイントを設定します。設定しない場合は、デフォルトのエンドポイント s3.amazonaws.com が使用されます。Amazon S3 エンドポイントの一覧は、「リージョンとエンドポイント」を参照してください。

例: ‑‑s3Endpoint=s3.eu-west-1.amazonaws.com

No
‑‑storageClass=CLASS

送信先が Amazon S3 のときに使用するストレージクラス。有効な値は、STANDARD と REDUCED_REDUNDANCY です。このオプションを指定しない場合、S3DistCp はストレージクラスを維持しようとします。

例: ‑‑storageClass=STANDARD

No
‑‑srcPrefixesFile=PATH

src プレフィックスのリスト (1 行ごとにプレフィックスが 1 つずつ) を含む Amazon S3 (s3://)、HDFS (hdfs:///)、またはローカルファイルシステム (file:/) 内のテキストファイル。

srcPrefixesFile が提供されている場合、S3DistCp は src パスをリストしません。代わりに、このファイルで指定されたすべてのプレフィックスをリストした結果を組み合わせたソースリストを生成します。これらのプレフィックスの代わりに、src パスに対する相対パスを使用して宛先パスが生成されます。srcPattern も指定された場合、入力をさらにフィルタリングするため、ソースプレフィックスを組み合わせたリスト結果に適用されます。copyFromManifest が使用された場合、マニフェストのオブジェクトがコピーされ、srcPrefixesFile が無視されます。

例: ‑‑srcPrefixesFile=PATH

No

上記のオプション以外にも、S3DistCp はツールインターフェイスを実装しているので、一般的なオプションもサポートしています。

クラスターに S3DistCp をステップとして追加する

S3DistCp を呼び出すには、これをステップとしてクラスターに追加します。ステップは、起動時にクラスターに追加することも、コンソール、CLI、または API を使用して実行中のクラスターに追加することもできます。以下の例では、実行中のクラスターへの S3DistCp ステップの追加を示します。クラスターへのステップの追加の詳細については、「Amazon EMR 管理ガイド」の「クラスターへの作業の送信」を参照してください。

AWS CLI を使用して実行中のクラスターに S3DistCp ステップを追加するには

AWS CLI での Amazon EMR コマンドの使用の詳細については、「AWS CLI コマンドリファレンス」を参照してください。

  • S3DistCp を呼び出すステップをクラスターに追加するには、S3DistCp によるコピーオペレーションの実行方法を指定するパラメータを引数として渡します。

    次の例では、デーモンログを Amazon S3 から hdfs:///output にコピーします。次のコマンドについて説明します。

    実行中のクラスターに S3DistCp コピーステップを追加するには、Amazon S3 に保存された JSON ファイルまたはローカルファイルシステムのファイル (この例では myStep.json) に次の内容を配置します。j-3GYXXXXXX9IOK をクラスター ID に置き換え、mybucket を Amazon S3 バケット名に置き換えます。

    [ { "Name":"S3DistCp step", "Args":["s3-dist-cp","‑‑s3Endpoint=s3.amazonaws.com","‑‑src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","‑‑dest=hdfs:///output","‑‑srcPattern=.*[a-zA-Z,]+"], "ActionOnFailure":"CONTINUE", "Type":"CUSTOM_JAR", "Jar":"command-runner.jar" } ]
    aws emr add-steps ‑‑cluster-id j-3GYXXXXXX9IOK ‑‑steps file://./myStep.json
例 Amazon S3 からのログファイルを HDFS へコピーする

この例では、実行中のクラスターにステップを追加して、Amazon S3 バケットに格納されたログファイルを HDFS にコピーする方法も示します。この例では、‑‑srcPattern オプションを使用して、デーモンログにコピーされたデータを制限しています。

‑‑srcPattern オプションを使用してログファイルを Amazon S3 から HDFS にコピーするには、Amazon S3 に保存された JSON ファイルまたはローカルファイルシステムのファイル (この例では myStep.json) に次の内容を配置します。j-3GYXXXXXX9IOK をクラスター ID に置き換え、mybucket を Amazon S3 バケット名に置き換えます。

[ { "Name":"S3DistCp step", "Args":["s3-dist-cp","‑‑s3Endpoint=s3.amazonaws.com","‑‑src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","‑‑dest=hdfs:///output","‑‑srcPattern=.*daemons.*-hadoop-.*"], "ActionOnFailure":"CONTINUE", "Type":"CUSTOM_JAR", "Jar":"command-runner.jar" } ]