250000 SparseVector(300000) をキャノピー クラスター化しようとしている 30 ノード (それぞれに 8 コア 16G メモリ) があるクラスターで Mahout 0.7 を実行しています。
キャノピー パラメータ (T1、T2) を微調整して少数のキャノピー センターを見つけるキャノピー クラスタリングを行うと、非常にうまく機能します。
特定の数のキャノピー センターを超えると、削減フェーズの 67% でジョブが「エラー: Java ヒープ スペース」メッセージで失敗し続けます。
Kの値が増加している場合、K-meansクラスタリングにも同じヒープスペースの問題があります。
canopy-center ベクトルと k-center ベクトルは、すべての mapper と reducer のメモリに保持されていると聞きました。これは、キャノピー センターの数 (または k) x sparsevector(300000 サイズ) = 4g のメモリに十分であり、それほど悪くはないようです。
ここや他の場所での以前の質問に基づいて、見つけられるすべてのメモリノブを上げました。
- hadoop-env.sh:そこにあるすべてのヒープ スペースを、名前ノードで最大 16 GB、さらにはデータ ノードで 8 GB に設定します。
- mapred-site.xml: mapred.{map, reduce}.child.java.opts プロパティを追加し、それらの値を -Xmx4000m に設定します
- mapred-site.xml: mapred.tasktracker.{map, reduce}.tasks.maximum プロパティを変更し、それらの値を 8 から 4 に下げます
そして、問題は解決しません。私はこれに対してあまりにも長い間頭を悩ませてきました - 誰か提案はありますか?
完全なコマンドと出力は次のようになります。
public static void main(String [] args) throws Exception{
String ratingsPath = args[0];
String outputPath = args[1];
String T1 = args[2];
String T2 = args[3];
Configuration conf = new Configuration();
HadoopUtil.delete(conf, new Path(outputPath));
CanopyDriver.run(conf, new Path(ratingsPath), new Path(outputPath), new ManhattanDistanceMeasure(),
Double.parseDouble(T1), Double.parseDouble(T2), true, 0.0, false);
}
ここに私が直面するエラーメッセージがあります:
Exception in thread "main" java.lang.InterruptedException: Canopy Job failed processing /MrBic/Output/SeedGeneration_predSample
at org.apache.mahout.clustering.canopy.CanopyDriver.buildClustersMR(CanopyDriver.java:363)
at org.apache.mahout.clustering.canopy.CanopyDriver.buildClusters(CanopyDriver.java:248)
at org.apache.mahout.clustering.canopy.CanopyDriver.run(CanopyDriver.java:155)
at org.apache.mahout.clustering.canopy.CanopyDriver.run(CanopyDriver.java:170)
at MrBicClusteringDriver.main(MrBicClusteringDriver.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
2013-06-12 10:56:00,825 FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError: Java heap space
at org.apache.mahout.math.map.OpenIntDoubleHashMap.rehash(OpenIntDoubleHashMap.java:434)
at org.apache.mahout.math.map.OpenIntDoubleHashMap.put(OpenIntDoubleHashMap.java:387)
at org.apache.mahout.math.RandomAccessSparseVector.setQuick(RandomAccessSparseVector.java:139)
at org.apache.mahout.math.AbstractVector.assign(AbstractVector.java:560)
at org.apache.mahout.clustering.AbstractCluster.observe(AbstractCluster.java:275)
at org.apache.mahout.clustering.canopy.Canopy.<init>(Canopy.java:43)
at org.apache.mahout.clustering.canopy.CanopyClusterer.addPointToCanopies(CanopyClusterer.java:163)
at org.apache.mahout.clustering.canopy.CanopyReducer.reduce(CanopyReducer.java:47)
at org.apache.mahout.clustering.canopy.CanopyReducer.reduce(CanopyReducer.java:30)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:649)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:417)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.mapred.Child.main(Child.java:249)