2

より多くの画像ファイルを作成するためにJavaプログラムを実行する必要がある多くの画像があります-恥ずかしいほど類似したケースです。各入力ファイルは約 500 MB で、処理中に約 4 GB のメモリが必要で、実行には 30 秒から 2 分かかります。Java プログラムはマルチスレッド化されていますが、より多くのスレッドを使用するよりも、入力ファイルを並列化することでより多くの利益が得られます。1 日に数回プロセスを開始する必要があります (クラスターを手動でオン/オフにしたり、24 時間年中無休で支払いをしたりしたくありません)。

私はそこにあるさまざまなクラウドオプションに少し迷っています。

  • Amazonラムダのシステム リソースが不足しています (メモリが不足しています)。
  • Google Cloud DataFlowの場合、Cloud Storage バケットを使用するには、独自のパイプライン ソースを作成する必要があるようです。わかりましたが、それが適切な解決策でない場合は、時間を無駄にしたくありません (そうかもしれませんが、まだわかりません)。
  • Amazonデータ パイプラインは、Google Cloud DataFlow と同等のようです。(完全を期すために編集で追加されました。 )
  • Google Cloud Dataproc、これは map/reduce hadoop-y の状況ではありませんが、それでも機能する可能性があります。ただし、自分のクラスターを管理したくありません。
  • 自動スケーリングを備えた Google コンピューティング エンジンまたは AWS で、マシンのコアごとにプロセスを開始するだけです。私からの管理は増えますが、学ぶべき API はありません。
  • Microsoft Data Lakeはまだリリースされておらず、hadoop のように見えます。
  • Microsoft Batchは非常に適しているようです (ただし、他のオプションにまだ興味があるので質問しています)。

これに適切な解決策を教えてくれる人はいますか?

4

1 に答える 1

5

これは、Dataflow で非常に簡単に実行できるはずです。パイプラインは次のようになります (ファイルがGoogle Cloud Storage、GCS にあると仮定します)。

class ImageProcessor {
    public static void process(GcsPath path) {
        // Open the image, do the processing you want, write
        // the output to where you want.
        // You can use GcsUtil.open() and GcsUtil.create() for
        // reading and writing paths on GCS.
    }
}

// This will work fine until a few tens of thousands of files.
// If you have more, let me know.
List<GcsPath> filesToProcess = GcsUtil.expand(GcsPath.fromUri("..."));
p.apply(Create.of(filesToProcess))
 .apply(MapElements.via(ImageProcessor::process)
                   .withOutputType(new TypeDescriptor<Void>() {}));
p.run();

これは、Dataflow がデータ処理フレームワークではなく、非常に並列なオーケストレーション フレームワークとして使用される一般的なケースの 1 つですが、うまくいくはずです。

MapElements 変換を使用するには、Dataflow SDK 1.2.0 が必要です (Java 8 ラムダのサポートは 1.2.0 で新しく追加されました)。

于 2015-10-09T21:26:36.260 に答える