2016-06-18 6 views
1

私はM1モジュールの下でスパークのk平均クラスタリングを使用しています。私はPySparkでプログラミングしています。モジュールは200クラスタまでうまく動作しますが、300クラスタ以上を過ぎるとOutOfMemoryErrorとなります。私の データには、オブジェクトごとに200k個のオブジェクトと25k個の機能が含まれています。私はリンクpyspark ML mocumentationからclass pyspark.ml.clustering.KMeansの下に記載されたガイドラインに従っています。このドキュメントで言及されているコードと鉱山の唯一の違いは、密ではなく疎ベクトルを使用していることです。スパークk平均OutOfMemoryError

700個以上のコアと2TBのメモリを持つ共振可能な大規模なクラスタ設定があるため、ハードウェアの制限はありません。私はこの問題を捜し求めました、そして、リンクの大部分は私に次の構成の1つまたはすべてをするように導きます。 次は私が試したもののセットです:

  • セット/ conf.set("spark.driver.memory", "64g")
  • セットの並列処理に加えてconf.set("spark.default.parallelism","1000")
  • セット/メモリ割合を増やすconf.set("spark.storage.memoryFraction", "1")

を使用してドライバメモリを増やします上記のコンフィグレーションでは、executorメモリを168コアとして150と設定しました.Unfortuna何もうまくいっていないし、次のエラー(切り詰められたエラー)が続く。

Py4JJavaError: An error occurred while calling o98.fit. : java.lang.OutOfMemoryError: Java heap space at org.apache.spark.mllib.linalg.SparseVector.toArray(Vectors.scala:678) at org.apache.spark.mllib.clustering.VectorWithNorm.toDense(KMeans.scala:612)

これは火花が300+クラスタサイズのためにも200k*25Kデータセットを扱うことができないわけない?または私は何かが足りないのです?。

+0

ベンチマークa **非分散ツール**と比較してELKIなど。通常、データがメインメモリに収まる限り、驚くほどうまく実行されます。 200k個のオブジェクトはそれほど多くはありませんが、それは1つのホスト上で動作するはずです。私の経験では、分散した「もの」は驚くほど遅いです。 –

答えて

1
org.apache.spark.mllib.clustering.VectorWithNorm.toDense(KMeans.scala:612) 

これは問題です。クラスタセンターは密集した表現に変換され、すべてのエグゼキュータにブロードキャストされます。これは、あなたの場合である何千もの機能ではスケールされません。チェックアウトSparseML

+0

'SparseML'への良いリンク。あなたはそれを使いましたか? – javadba

+0

リンクありがとうございます。私はそれを使用し、それが私のために働くかどうかを見ます。 – Rkz

関連する問題