HadoopTimes

ストリーミングアーキテクチャ Apache Kafka とMapR Streams による新しい設計手法
技術情報

Javaのヒープ領域エラーを回避する5つのステップ

以下の5つのステップを覚えておけば、頭を痛める心配もなくJavaのヒープ領域エラーを回避することができます。

  1. 必要なメモリ容量を計算する。
  2. TaskTrackerタスクに十分なメモリがJVMにあることを確認する。
  3. JVMの設定がタスクに適していることを確認する。
  4. ノードが使用するスワップ領域とページ化メモリを制限する。
  5. タスク試行スロットをJobTrackerウェブGUIで計算した数よりも少ない数に設定する。

この記事では、タスク試行メモリの管理に関する理解と能力を高めるための上記の各ステップについて説明します。

Javaのヒープ領域エラーを防ぐためには、タスク試行メモリの管理方法を理解することが重要です。map/reduceジョブを実行する際には、以下のようにタスク試行が失敗する場合があります。

13/09/20 08:50:56 INFO mapred.JobClient: Task Id : attempt_201309200652_0003_m_000000_0, Status : FAILED on node node1
Error: Java heap space

このエラーは、タスク試行の実行に使用するJava仮想マシン (JVM) に設定されている最大制限より多くのメモリをそのタスク試行で使用しようとする場合に起こります。

Javaのヒープ領域エラーを回避するための最初のステップは、map/reduceタスクに必要となるメモリ容量を理解して、JVMに適切なメモリ制限を設定して起動できるようにすることです。

例えば、hadoop-0.20.2-dev-examples.jarに含まれる文字カウントジョブでは、処理するデータ内容が何であれ、mapタスクに多量のメモリは必要ありません。多量のメモリがmapタスクに必要となるのは、実行に必要となるライブラリへの読み込みです。MapRパッケージに含まれるデフォルトの文字カウントを使用する場合、mapを試行するJVMには512MBあれば十分すぎるほどです。上記のHadoop例を実行する予定の場合、mapを試行するJVMに512MBのメモリ制限を設定することを目安にしましょう。

mapタスク試行で受信するメモリの量がわかっている場合 (この例では512MB)、次のステップは、その量のメモリがあるJVMを起動することです。JVMはTaskTrackerによってmap/reduceジョブ用のデータを処理するように生成されるので、タスクを試行するJVMのメモリはTaskTrackerによって設定します。TaskTrackerによって設定する制限は2つのソース候補のうちの1つから決定されます。ユーザーがジョブ構成オブジェクトの一部としてジョブを送信する際に希望するメモリ容量を指定するか、TaskTrackerがJVMにデフォルトのメモリ容量を生成します。