1.問題描述:
對7萬*3萬的矩陣,對行數據KMeans聚類,剛開始執行,就報錯:java.lang.OutOfMemoryError: Java heap space
2.原因查找:
查看Spark MLLib KMeans源碼中有關開闢堆棧空間的部分,在
spark-1.6.1\mllib\src\main\scala\org\apache\spark\mllib\clustering\KMeansModel.scala
中找到了下面這個語句:
def this(centers: java.lang.Iterable[Vector]) = this(centers.asScala.toArray) 3.分析:我設置的類別數目是5000,數據維度上面提到了是3萬,猜測源碼把5000*3萬的數據量放到一個數組中而,這個猜測與報錯的原因及報錯發生在剛執行的時刻吻合。
4.確認與解決:
方案一:降低聚類數目,降低到50後,不再OOM,分析得到了印證;
方案二:降低數據維度,使用SVD降維,左矩陣乘以奇異值矩陣得到原始數據的低維近似;