【问题标题】:Spark ML Lib FP-Growth with Out Of MemorySpark MLLib FP-Growth with Out Of Memory
【发布时间】:2018-02-28 04:29:50
【问题描述】:

当我使用 Spark-mllib FP-growth 算法挖掘频繁项集时,我遇到了这些错误。

java.lang.OutOfMemoryError:Java 堆空间 在 java.util.IdentityHashMap.resize(IdentityHashMap.java:469) 在 java.util.IdentityHashMap.put(IdentityHashMap.java:445) 在 org.apache.spark.util.SizeEstimator$SearchState.enqueue(SizeEstimator.scala:132) 在 org.apache.spark.util.SizeEstimator$$anonfun$visitSingleObject$1.apply(SizeEstimator.scala:178) 在 org.apache.spark.util.SizeEstimator$$anonfun$visitSingleObject$1.apply(SizeEstimator.scala:177) 在 scala.collection.immutable.List.foreach(List.scala:381).....

但是,我的数据集大小只有 1000M,freqitems 的数量只有 300,我不知道为什么它会给我一个 OOM 错误。 重新分区也无济于事。

顺便说一句,executor.memory是20G,driver.memory是20G。

部分代码:

  val fileInput = args(0)
  val fileOutput = args(1)
  val fileTemp = args(2)
  val sc = new SparkContext(new SparkConf().setAppName("Association Rules"))
  val originData = sc.textFile(fileInput + "/D.dat",48)

  val transactions: RDD[Array[String]] = originData.map(s => s.trim.split(' '))
  val model = new FPGrowth().setMinSupport(0.092).setNumPartitions(48).run(transactions)
  val freqItems = model.freqItemsets.persist()
  val AAnswer = freqItems.sortBy(x => x.items.toString)
  AAnswer.saveAsTextFile(fileOutput + "/D.dat")

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    只需添加更多内存(对于 1GB 数据集,默认值可能不够)。

    首先将这些选项添加到您的 spark-shell/spark-submit 命令中:

    spark-submit.sh --driver-memory 4g --executor-memory 4g 
    

    (或 8g、16g,任何适合你的)

    你也可以在你的代码中做同样的事情

    val conf = new SparkConf()
                 .setMaster("local")
                 .setAppName("MyApp")
                 .set("spark.executor.memory", "4g")
                 .set("spark.driver.memory", "4g")
    val sc = new SparkContext(conf)
    

    【讨论】:

    • 对此感到抱歉。我在 spark submit 中使用了这些选项,但是当我使用更大的内存时,它仍然给我带来了 oom。
    • 您的数据集中有多少记录和列? FP-Growth 可能需要大量内存,所以我在这里看不到任何不一致之处。使用数据样本来确定实际工作的容量,然后您就会知道需要多少内存。
    • 你确定“你也可以在你的代码中做同样的事情”适用于.setMaster("local")吗?我不是
    • 嗯,这个例子来自官方 Spark 文档页面,所以我倾向于相信它。 (但为了公平起见,我自己并没有尝试过,我通常将所有这些选项设置在 spark-submit 级别)。 spark.apache.org/docs/1.0.2/configuration.html
    • 数据集很大。它包含大约 1M 条记录和每条记录 200 列。我尝试在fp-growth中输出freq项,数量为300。在我看来,每个executor 20G内存不应该OOM。
    【解决方案2】:

    将分区的数量设置为非常高的值。我做了2000。解决了这些问题。最终得到了 2000 个 csv 文件结果,但是地狱。它奏效了,而且相当快。显然有一个甜蜜点,但从高起点开始并针对速度和内存问题运行测试,并在必要时减少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2023-04-01
      相关资源
      最近更新 更多