16

S3 にアップロードされ、いくつかの Redshift タスクのために処理されているファイルがいくつかあります。そのタスクが完了したら、これらのファイルをマージする必要があります。現在、これらのファイルを削除し、マージされたファイルを再度アップロードしています。これらは多くの帯域幅を消費します。ファイルを S3 に直接マージする方法はありますか?

ルーティングには Apache Camel を使用しています。

4

2 に答える 2

29

S3 では、S3 ファイル URI をコピー操作のソースとして使用できます。S3 のマルチパート アップロード API と組み合わせると、複数の S3 オブジェクト URI をマルチパート アップロードのソース キーとして指定できます。

しかし、悪魔は細部に宿ります。S3 のマルチパート アップロード API の最小ファイル パーツ サイズは 5MB です。したがって、連結中の一連のファイルのいずれかのファイルが 5MB 未満の場合、連結は失敗します。

ただし、最終的なアップロード ピースを 5 MB 未満にすることができるループ ホールを利用することで、これを回避できます (これは、残りのピースをアップロードするときに現実世界で発生するためです)。

私の生産コードはこれを次のように行います:

  1. アップロードするファイルのマニフェストを調べる
  2. 最初の部分が 5MB 未満の場合は、断片* をダウンロードし、5MB がバッファリングされるまでディスクにバッファリングします。
  3. ファイルの連結が完了するまでパーツを順次追加する
  4. 非終端ファイルが 5MB 未満の場合は、それを追加してからアップロードを終了し、新しいアップロードを作成して続行します。

最後に、S3 API にバグがあります。ETag (実際には S3 上の任意の MD5 ファイル チェックサムであり、マルチパート アップロードの完了時に適切に再計算されません。これを修正するには、完了時に罰金をコピーします。連結中に一時的な場所を使用する場合、これは解決されます。最後のコピー操作について。

*ファイルのバイト範囲をダウンロードできることに注意してください。このように、パート 1 が 10K でパート 2 が 5GB の場合、5110K を読み込むだけで、続行するために必要な 5MB のサイズを満たすことができます。

**S3 に 5MB のゼロのブロックを配置し、それをデフォルトの出発点として使用することもできます。次に、アップロードが完了したら、のバイト範囲を使用してファイルのコピーを行います5MB+1 to EOF-1

PS このコードの Gist を作成する時間があれば、ここにリンクを投稿します。

于 2015-10-18T17:07:14.270 に答える