4

(Hadoop初心者より)

おもちゃの Hadoop 概念実証の例では、可能な限りファイルを避けたいと考えています。非ファイルベースの入力からデータを読み取ることができました ( http://codedemigod.com/blog/?p=120のおかげで) - 乱数を生成します。

結果をメモリに保存して、さらに (Map-Reduce 以外の) ビジネス ロジック処理を実行できるようにします。本質的に:

conf.setOutputFormat(InMemoryOutputFormat)
JobClient.runJob(conf);
Map result = conf.getJob().getResult(); // ?

私が望むことを行うように見える最も近いことは、結果をバイナリファイル出力形式で保存し、同等の入力形式で読み戻すことです。それは不要なコードと不要な計算のように思えます (Map Reduce が依存する前提を誤解していますか?)。

4

1 に答える 1

7

この考え方の問題点は、Hadoop には「分散メモリ」という概念がないことです。「メモリ内」の結果が必要な場合、次の質問は「どのマシンのメモリですか?」です。本当にそのようにアクセスしたい場合は、独自のカスタム出力形式を作成し、マシン間でメモリを共有するために既存のフレームワークを使用するか、独自のものを作成する必要があります。

私の提案は、単純に通常どおり HDFS に書き込むことです。次に、MapReduce 以外のビジネス ロジックについては、FileSystem API を介して HDFS からデータを読み取ることから始めます。つまり、次のようになります。

FileSystem fs = new JobClient(conf).getFs();
Path outputPath = new Path("/foo/bar");
FSDataInputStream in = fs.open(outputPath);
// read data and store in memory
fs.delete(outputPath, true);

確かに、不必要なディスクの読み取りと書き込みが行われますが、データがメモリ内に収まるほど小さい場合、とにかくそれについて心配する必要はありません。それが深刻なボトルネックだったとしたら、私は驚くだろう。

于 2012-08-27T23:16:41.343 に答える