0

DistributedCache に関する Apache および Yahoo のチュートリアルを読みました。私はまだ一つのことについて混乱しています。すべてのデータノードにコピーしたいファイルがあるとします。DistributedCache.addCacheFile(new URI(hdfsPath),job)そのため、ジョブ Driver で使用 して、ファイルを使用できるようにします。次に、DistributedCache.getLocalCacheFiles(job)Mapper 内で呼び出します。

ここで、このファイルの内容に基づいてデータ ノードに配列を作成し、map() が実行されるたびに配列の要素にアクセスできるようにします。これはできますか?キャッシュされたファイルを読み取って Mapper クラス内で配列を作成すると、Mapper ごとに 1 回ではなく、Mapper への新しい入力ごとに配列が作成されるように見えるため、混乱しています。この部分は実際にどのように機能しますか (つまり、いつどこで配列を作成する必要があるか)。

4

1 に答える 1

2

ここにはいくつかの概念が混在しています。Datanode は DistributedCache とは直接関係ありません。MapReduceレイヤーの概念です。
マッパー間でキャッシュされたファイルから同じ派生物を再利用したいという欲求は、MR パラダイムの機能的性質と多少矛盾します。マッパーは論理的に独立している必要があります。
あなたが望むのは、マッパーのキャッシュされたファイルの前処理が比較的高価な場合に意味のある一種の最適化です。前処理され
たデータをいくつかの静的変数に保存し、それを遅延評価し、仮想を再利用するように Hadoop を設定することで、ある程度は実行できます。タスク間のマシン。「MR」精神解決策ではありませんが、うまくいくはずです。
より良い解決策は、キャッシュされたファイルをフォームに前処理することです。これにより、マッパーによる消費が安価になります。
すべてのアイデアが一種の最適化であると仮定しましょう。それ以外の場合は、マッピングごとにファイルを読み取って処理するだけで十分です。
マッパーごとにファイルを準備することが、マップ処理自体よりもはるかに安価であるか、マッパーの実行オーバーヘッドよりもはるかに安価である場合、問題はないと言えます。
フォームとは、必要なメモリ内構造に非常に効率的に変換できるファイルの形式を意味します。たとえば、データの検索が必要な場合は、既に並べ替えられたデータを保存できます。毎回ソートする手間が省けます。通常、ディスクから順次読み取るよりもはるかにコストがかかり
ます。あなたの場合、それがいくつかの適度な数(たとえば数千)のプロパティである場合、それらの読み取りと初期化は、シングルマッパー

于 2012-04-25T15:38:07.957 に答える