Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala SparkError:XXXX任务的序列化结果的总大小(2.0 GB)大于spark.driver.maxResultSize(2.0 GB)_Scala_Apache Spark_Apache Spark Mllib - Fatal编程技术网

Scala SparkError:XXXX任务的序列化结果的总大小(2.0 GB)大于spark.driver.maxResultSize(2.0 GB)

Scala SparkError:XXXX任务的序列化结果的总大小(2.0 GB)大于spark.driver.maxResultSize(2.0 GB),scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,错误: 目标:获得使用模型的所有用户的推荐,并与每个用户测试数据重叠,并生成重叠率 我已经使用spark mllib构建了一个推荐模型。我评估每个用户的测试数据和每个用户的推荐项目的重叠率,并生成平均重叠率 ERROR TaskSetManager: Total size of serialized results of XXXX tasks (2.0 GB) is bigger than spark.driver.maxResultSize (2.0 GB) 但这里的问题是,它最终抛出了上面

错误:

目标:获得使用模型的所有用户的推荐,并与每个用户测试数据重叠,并生成重叠率

我已经使用spark mllib构建了一个推荐模型。我评估每个用户的测试数据和每个用户的推荐项目的重叠率,并生成平均重叠率

ERROR TaskSetManager: Total size of serialized results of XXXX tasks (2.0 GB) is bigger than spark.driver.maxResultSize (2.0 GB)
但这里的问题是,它最终抛出了上面的
maxResultSize
错误。在spark配置中,我执行了以下操作以增加
maxResultSize

  def overlapRatio(model: MatrixFactorizationModel, test_data: org.apache.spark.rdd.RDD[Rating]): Double = {

    val testData: RDD[(Int, Iterable[Int])] = test_data.map(r => (r.user, r.product)).groupByKey
    val n = testData.count

    val recommendations: RDD[(Int, Array[Int])] = model.recommendProductsForUsers(20)
      .mapValues(_.map(r => r.product))

    val overlaps = testData.join(recommendations).map(x => {
      val moviesPerUserInRecs = x._2._2.toSet
      val moviesPerUserInTest = x._2._1.toSet
      val localHitRatio = moviesPerUserInRecs.intersect(moviesPerUserInTest)
      if(localHitRatio.size > 0)
        1
      else
        0
    }).filter(x => x != 0).count

    var r = 0.0
    if (overlaps != 0)
      r = overlaps / n

    return r

  }
但这并没有解决问题,我几乎接近了分配驱动程序内存的数量,但问题没有得到解决。当代码被执行时,我一直在关注我的spark工作,我看到的有点令人费解

val conf = new SparkConf()
conf.set("spark.driver.maxResultSize", "6g")
在上述阶段,代码正在执行spark mllib
recommendForAll
中关于
第277行的矩阵工厂化代码(不确切确定行号)

recommendForAll
方法从俄罗斯的
RecommendProducts
方法调用

但看起来该方法正在剥离一百万个任务。数据来自2000个零件文件,所以我很困惑它是如何开始吐出100万个任务的,我认为这可能是问题所在


我的问题是如何才能真正解决这个问题。如果不使用这种方法,很难计算
重叠率
recall@K
。这是spark 1.5(cloudera 5.5)

2GB问题对于spark社区来说并不新鲜:

如果分区大小大于2GB,请尝试将RDD重新分区(
myRdd.repartition(parallelism)
)到更多的分区(w/r/t/当前的并行级别),从而减小每个分区的大小

关于旋转的任务数(因此创建了分区),我的假设是它可能来自
srcBlocks.cartesian(dstBlocks)
API调用,该调用生成由(z=srcBlocks的分区数*dstBlocks的分区数)分区组成的输出RDD

在此情况下,您可以考虑使用<代码> Myrd.CuuleSeCE(并行) API,而不是<代码>重新分区< /代码>,以避免洗牌(以及分区与SerialList相关的问题)。

[Stage 281:==>   (47807 + 100) / 1000000]15/12/01 12:27:03 ERROR TaskSetManager: Total size of serialized results of 47809 tasks (6.0 GB) is bigger than spark.driver.maxResultSize (6.0 GB)
  private def recommendForAll(
      rank: Int,
      srcFeatures: RDD[(Int, Array[Double])],
      dstFeatures: RDD[(Int, Array[Double])],
      num: Int): RDD[(Int, Array[(Int, Double)])] = {
    val srcBlocks = blockify(rank, srcFeatures)
    val dstBlocks = blockify(rank, dstFeatures)
    val ratings = srcBlocks.cartesian(dstBlocks).flatMap {
      case ((srcIds, srcFactors), (dstIds, dstFactors)) =>
        val m = srcIds.length
        val n = dstIds.length
        val ratings = srcFactors.transpose.multiply(dstFactors)
        val output = new Array[(Int, (Int, Double))](m * n)
        var k = 0
        ratings.foreachActive { (i, j, r) =>
          output(k) = (srcIds(i), (dstIds(j), r))
          k += 1
        }
        output.toSeq
    }
    ratings.topByKey(num)(Ordering.by(_._2))
  }