Spark中OOM问题解决方案

1,避免在算子内部使用scala的方法将集合toList,如果只是取TopN的话可以定义排序规则,使用spark的top()算子

错误示范:

解决方法:定义排序规则,使用rdd的top()

      val bigdataRDD: RDD[((String, String), Int)] = rdd1.filter(_._1._1.equals(sub))
      implicit val orderRules: Ordering[((String, String), Int)] = Ordering[Int].on[((String, String), Int)](t => t._2)
      val res = bigdataRDD.top(2) //Action

2,避免用scala的toList,自定义排序规则后,使用treeSet来排序

    val result: RDD[((String, String), Int)] = rdd2.mapPartitions(it => {
      //定义一个可以排序的特殊集合 TreeSet
      implicit val rules = Ordering[Int].on[((String, String), Int)](t => -t._2)
      val sorter = new mutable.TreeSet[((String, String), Int)]()
      //遍历迭代器
      it.foreach(t => {
        //将数据添加到treesetzhong
        sorter += t
        if (sorter.size > 2) {
          sorter -= sorter.last //treeSet中一共放入N+1个元素,每次插入元素后删除最后一个元素(最小值)
        }
      })
      sorter.iterator
    })

3,分区排序使用repatitionAndSortWithPartitions

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值