S3 にアップロードされ、いくつかの Redshift タスクのために処理されているファイルがいくつかあります。そのタスクが完了したら、これらのファイルをマージする必要があります。現在、これらのファイルを削除し、マージされたファイルを再度アップロードしています。これらは多くの帯域幅を消費します。ファイルを S3 に直接マージする方法はありますか?
ルーティングには Apache Camel を使用しています。
S3 にアップロードされ、いくつかの Redshift タスクのために処理されているファイルがいくつかあります。そのタスクが完了したら、これらのファイルをマージする必要があります。現在、これらのファイルを削除し、マージされたファイルを再度アップロードしています。これらは多くの帯域幅を消費します。ファイルを S3 に直接マージする方法はありますか?
ルーティングには Apache Camel を使用しています。
S3 では、S3 ファイル URI をコピー操作のソースとして使用できます。S3 のマルチパート アップロード API と組み合わせると、複数の S3 オブジェクト URI をマルチパート アップロードのソース キーとして指定できます。
しかし、悪魔は細部に宿ります。S3 のマルチパート アップロード API の最小ファイル パーツ サイズは 5MB です。したがって、連結中の一連のファイルのいずれかのファイルが 5MB 未満の場合、連結は失敗します。
ただし、最終的なアップロード ピースを 5 MB 未満にすることができるループ ホールを利用することで、これを回避できます (これは、残りのピースをアップロードするときに現実世界で発生するためです)。
私の生産コードはこれを次のように行います:
最後に、S3 API にバグがあります。ETag (実際には S3 上の任意の MD5 ファイル チェックサムであり、マルチパート アップロードの完了時に適切に再計算されません。これを修正するには、完了時に罰金をコピーします。連結中に一時的な場所を使用する場合、これは解決されます。最後のコピー操作について。
*
ファイルのバイト範囲をダウンロードできることに注意してください。このように、パート 1 が 10K でパート 2 が 5GB の場合、5110K を読み込むだけで、続行するために必要な 5MB のサイズを満たすことができます。
**
S3 に 5MB のゼロのブロックを配置し、それをデフォルトの出発点として使用することもできます。次に、アップロードが完了したら、のバイト範囲を使用してファイルのコピーを行います5MB+1 to EOF-1
PS このコードの Gist を作成する時間があれば、ここにリンクを投稿します。