2

ターゲットと依存関係がローカル ファイルではなく、AWS/S3 バケットに存在するメイクファイルを作成したいと考えています。

「data_raw」ファイルを「obj1」にコピーしてから「obj2」に単純にコピーする次の例を考えてみましょう (これを実行する前に、「bucket」を所有するバケットに編集し、「data_raw」ファイルを作成する必要があります)。

# local, works fine
bucket = /tmp/test/
cp = cp

# remote, does not work
bucket = s3://bucket/test/
cp = s3cmd cp

all : $(bucket)obj2

$(bucket)obj2 : $(bucket)obj1
    $(cp) $(bucket)obj1 $(bucket)obj2

$(bucket)obj1 :
    $(cp) $(bucket)raw_data $(bucket)obj1

これで発生するエラーは次のとおりです。

makefile:9: *** target pattern contains no `%'.  Stop.

これは次の場合です。

all : $(bucket)obj2

make がリモート URI ("s3://xxx") をまったく理解していないと思われます。

私が見つけたすべての例/ドキュメントは、ターゲットと依存関係のローカル ファイルを暗黙的に参照しているようです。大規模なグーグル検索では、s3 ( http://code.google.com/p/awstasks/ ) 用の Ant タスクの作成に関するいくつかの一見未完成のアイデアしか得られませんでした。

これは、Python で複数の複雑/入り組んだ MapReduce ジョブを実行するコンテキストにあります。

私はむしろ GNU make を使用したいと思いますが、確かに代替案を検討します。

リモート ターゲットの軽いローカル ミラーをいつでも作成できますが、確かにもっと良い方法がありますか?

前もって感謝します!

ニック

4

1 に答える 1

2

有効な回避策の 1 つは、S3 バケットをローカルにマウントすることです。

Linux では、おそらくfuse/ s3fsを使用できます。これは MacOS でも動作する可能性がありますが、インストールが非常に面倒なようです。代わりに商用ソフトウェアの送信を使用することにしました([ディスクとしてマウント] をクリックします)。それで、上記の例は私にとって機能的です:

bucket = /Volumes/s3.amazonaws.com/bucket/test/
cp = cp

この例では、「s3cmd cp」がローカル URI を拒否するため、「cp」を使用します。(私の) 実際の例では、そのコマンドは、実際の s3 入出力 uris を必要とする python map-reduce スクリプトに置き換えられます。

物事を整理するために、ローカルにマウントされたファイル (存在/最新かどうかをテストするための Make 用) には、おそらく 1 つのプレフィックス変数 ("/Volumes/s3.amazonaws.com/") と 1 つのプレフィックス変数 ("/Volumes/s3.amazonaws.com/") が必要です。 "s3://") をビルド コマンドに使用して実際のデータを指定します (データは mapreduce を介して EC2 インスタンスによって処理されるため、すべてをローカルにダウンロードすることは絶対に避けたいと考えています)。

S3 は結果整合性しかないことに注意してください。また、存在と最新性をテストするために、ファイル全体がローカルにダウンロードされないようにしてください (その場合、いくつかのダミー ファイルを使用する必要があります)。

それが役立つことを願っています。

誰かがより直接的なアプローチ(ローカルマウントなし)を持っている場合、私は興味があります。

ニック

于 2012-05-11T07:54:37.470 に答える