私はhadoopが初めてで、クラスター内の3つのノードで作業しています(それぞれに2GBのRAMがあります)。入力ファイルは小さい (5 MB) ですが、マップ出力は非常に大きい (約 6 GB) です。
マップ段階でメモリがいっぱいになり、タスクの実行が非常に遅くなります。その理由は何ですか?
プログラムを高速化する方法を教えてくれる人はいますか?
私はhadoopが初めてで、クラスター内の3つのノードで作業しています(それぞれに2GBのRAMがあります)。入力ファイルは小さい (5 MB) ですが、マップ出力は非常に大きい (約 6 GB) です。
マップ段階でメモリがいっぱいになり、タスクの実行が非常に遅くなります。その理由は何ですか?
プログラムを高速化する方法を教えてくれる人はいますか?
マッパーは「ストリーミング」モードで動作できるため、マップ出力のサイズ自体がメモリの問題を引き起こすことはありません。レコードを消費して処理し、出力に書き込みます。Hadoop は、ある程度の量のデータをメモリに保存してから、ディスクにスピルします。
そのため、問題は次の 2 つのいずれかによって引き起こされる可能性があります
。a) マッパー アルゴリズムが処理中にデータを蓄積する。b) マッパーに与えられる累積メモリが、ノードの RAM よりも少ない。その後、OS のスワッピングが開始され、パフォーマンスが桁違いに低下する可能性があります。
2 GB は通常の Hadoop 構成には実際には小さすぎるため、ケース b の可能性が高くなります。作業する場合は、ノードごとに最大 2 つのマッパー スロットを 1 つ構成することをお勧めします。
NLineInputFormat を使用します。N は、各マッパーが受け取る入力の行数を表します。このようにして、より多くの分割が作成され、各マッパー タスクにより小さな入力データが強制されます。そうでない場合は、5 MB 全体が 1 つの Map タスクに入ります。