gpt4 book ai didi

apache-spark - 运行 Spark MLlib kmeans 时出现 OutOfMemory

转载 作者:行者123 更新时间:2023-11-30 09:27:20 27 4
gpt4 key购买 nike

当我在大数据集上运行 Spark Kmeans 时,我总是遇到 OutOfMemory 错误。训练集大约250GB,我有10个节点的spark集群,每台机器有16个cpu和150G内存。我在每个节点上为作业分配了 100GB 内存,总共 50 个 cpu。我设置聚类中心为100,迭代次数为5。但是当代码在以下行运行时,我得到了OutOfMemory:

val model = KMeans.train(parsedData, numClusters, numIterations)

是否有任何我可以调整的参数来解决问题。

如果我设置较小的聚类中心数或迭代数就可以了。

我的代码如下:

val originalData = sc.textFile("hdfs://host/input.txt").cache()
val tupleData = originalData.map { x => (x.split(":")(0),x.split(":")(1)) }
val parsedData = tupleData.map { x => x._1 }.map(s => Vectors.dense(s.split(',').map(_.toDouble)))

val model = KMeans.train(parsedData, numClusters, numIterations, 1, initializationMode = KMeans.RANDOM)
val resultRdd = tupleData.map { p => (model.predict(Vectors.dense(p._1.split(',').map(_.toDouble))),p._2)}
resultRdd.sortByKey(true, 1).saveAsTextFile("hdfs://host/output.txt")

我的输入格式如下:

0.0,0.0,91.8,21.67,0.0 ... (the element number is 100K)
1.1,1.08,19.8,0.0,0.0 ...
0.0,0.08,19.8,0.0,0.0 ...
...
The rows number is 600K.

我得到的异常如下:

scheduler.DAGScheduler: Submitting ShuffleMapStage 42 (MapPartitionsRDD[49] at map at KmeansTest.scala:47), which has no missing parents
Exception in thread "dag-scheduler-event-loop" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2271)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1876)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1785)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1188)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

最佳答案

默认情况下,Spark 的 Kmeans 实现使用 K_MEANS_PARALLEL 初始化模式。此模式的一部分在驱动程序计算机上运行,​​并且可能非常慢/导致驱动程序上出现 OOM,具体取决于您的数据。

尝试切换到RANDOM初始化模式。

val model = KMeans.train(parsedData, numClusters, numIterations, 1, initializationMode = KMeans.RANDOM)

您可以尝试的另一件事是在提交申请时增加您的驱动程序内存。例如使用以下命令将驱动内存设置为4G

spark-submit --conf "spark.driver.memory=4g" ...

关于apache-spark - 运行 Spark MLlib kmeans 时出现 OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38536468/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com