2013-10-10 34 views
10

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

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

答えて

20

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

しかし、悪魔は詳細です。 S3のマルチパートアップロードAPIの最小ファイルサイズは5MBです。したがって、連結している一連のファイル内のファイルが< 5MBの場合、それは失敗します。

しかし、これを回避するには、最終的なアップロードファイルを<(5MB)にすることができます(これは残りの部分をアップロードするときに実世界で行われるため許可されています)。最初の部分は*作品をダウンロードし、5メガバイトがバッファリングされるまで、ディスクへのバッファリング、5メガバイトの下 ある場合

  • をアップロードするファイルのマニフェストを問い合わせる

    1. マイ生産コードがすることによってこれを行います。

    2. ファイル結合が完了するまで順番にファイルを追加します。
    3. 非終端ファイルが< 5MBの場合は、追加してからアップロードを完了し、新しいアップロードを作成して続行します。

    最後に、S3 APIにバグがあります。 ETag(実際にはS3のMD5ファイルチェックサムは、マルチパートアップロードの完了時に正しく再計算されません)これを修正するには、完了時に罰金をコピーします。連結中に一時ロケーションを使用すると解決されますパート1は10Kで、パート2が5ギガバイトであれば、最終的なコピー操作に。

    *あなたがbyte range of a fileをダウンロードすることもできます。この方法で、あなただけ継続するために必要な5メガバイトのサイズを満たし得るために5110Kで読み取る必要があります。

    **あなたはまた、S3上のゼロの5メガバイトのブロックを持っているし、作品を始め、あなたのデフォルトとしてそれを使用することができます。その後、アップロードが完了すると、5MB+1 to EOF-1

    のバイト範囲を使用してファイルのコピーを行います

    P.S.このコードの要点を作る時間があれば、ここにリンクを投稿します。

  • +1

    これは本当に素晴らしい答えです!私は[このブログの記事](http://www.w2lessons.com/2012/01/fast-zipping-in-amazon-s3.html)に記載されているように、zipファイルを動的に作成するためにそれを実装しようとしています。また、AWS Lambdaを使用してS3レート制限を回避してリクエストをより迅速に処理するワーカープールを作成することも検討しています。 – MadMod

    +0

    @MadMod私は、Zip形式でZipファイルを直接連結することでこれを可能にするかどうか分かりません。連結後、既存のzipのサイズとCRCヘッダーを少なくとも更新する必要があります。 –

    +0

    @JosephLust、あなたはGistを共有することができますか? – Blexy

    -6

    S3はオブジェクトストレージであり、ブロックストレージではありません。オブジェクトを操作する前にオブジェクトをフェッチする必要があります。

    答えは:いいえ。いいえ、S3上のファイルを直接マージすることはできません。

    +2

    これは必ずしも正確ではありません。1つのファイルを除くすべてのファイルが少なくとも5MBであれば、以下で述べるようにコピーでマルチパートを使用することができます – bridiver

    +0

    これは5GB(5MBではなく)ですか? –

    +0

    いいえ、最小部品サイズの5 MB(最後の部分は小さくてもかまいません)。 –

    14

    Multipart Upload with Copyを使用すると、S3にダウンロードしてアップロードすることなくオブジェクトをマージすることができます。

    Java、.NET、またはREST API hereでいくつかの例が見つかります。

    関連する問題