Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
Java 什么是Scala烫伤中总和列表的替代品_Java_Scala_Mapreduce_Scalding - Fatal编程技术网

Java 什么是Scala烫伤中总和列表的替代品

Java 什么是Scala烫伤中总和列表的替代品,java,scala,mapreduce,scalding,Java,Scala,Mapreduce,Scalding,我在下面的代码中维护了一个大列表:我在这里做的是遍历数据流并创建一个反向索引。我使用的是推特的api,dataTypePipe是TypedPipe的类型 lazy val cats = dataTypePipe.cross(cmsCats) .map(vf => (vf._1.itemId, vf._1.leafCats, vf._2)) .flatMap { case (id, categorySet, cHhitters) => categorySet.m

我在下面的代码中维护了一个大列表:我在这里做的是遍历数据流并创建一个反向索引。我使用的是推特的api,dataTypePipe是TypedPipe的类型

  lazy val cats = dataTypePipe.cross(cmsCats)
  .map(vf => (vf._1.itemId, vf._1.leafCats, vf._2))
    .flatMap {
    case (id, categorySet, cHhitters) => categorySet.map(cat => (
    ...
  }
    .filter(f => f._2.nonEmpty)
    .group.withReducers(4000)
    .sum
    .map {
    case ((token,bucket), ids) =>
      toIndexedRecord(ids, token, bucket)
  }
由于序列化问题,我将scala列表转换为java列表,并使用avro编写:

  def toIndexedRecord(ids: List[Long], token: String, bucket: Int): IndexRecord = {
     val javaList = ids.map(l => l: java.lang.Long).asJava //need to convert from scala long to java long
     new IndexRecord(token, bucket,javaList)
  }
但问题是大量信息保存在列表中会导致Java堆问题。我认为总结也是这个问题的一个原因

2013-08-25 16:41:09,709 WARN org.apache.hadoop.mapred.Child: Error running child
cascading.pipe.OperatorException: [_pipe_0*_pipe_1][com.twitter.scalding.GroupBuilder$$anonfun$1.apply(GroupBuilder.scala:189)] operator Every failed executing operation: MRMAggregator[decl:'value']
    at cascading.flow.stream.AggregatorEveryStage.receive(AggregatorEveryStage.java:136)
    at cascading.flow.stream.AggregatorEveryStage.receive(AggregatorEveryStage.java:39)
    at cascading.flow.stream.OpenReducingDuct.receive(OpenReducingDuct.java:49)
    at cascading.flow.stream.OpenReducingDuct.receive(OpenReducingDuct.java:28)
    at cascading.flow.hadoop.stream.HadoopGroupGate.run(HadoopGroupGate.java:90)
    at cascading.flow.hadoop.FlowReducer.reduce(FlowReducer.java:133)
    at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:522)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:421)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1232)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.OutOfMemoryError: Java heap space
    at scala.collection.mutable.ListBuffer.$plus$eq(ListBuffer.scala:168)
    at scala.collection.mutable.ListBuffer.$plus$eq(ListBuffer.scala:45)
    at scala.collection.generic.Growable$$anonfun$$plus$plus$eq$1.apply(Growable.scala:48)
    at scala.collection.generic.Growable$$anonfun$$plus$plus$eq$1.apply(Growable.scala:48)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48)
    at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:176)
    at scala.collection.immutable.List.$colon$colon$colon(List.scala:127)
    at scala.collection.immutable.List.$plus$plus(List.scala:193)
    at com.twitter.algebird.ListMonoid.plus(Monoid.scala:86)
    at com.twitter.algebird.ListMonoid.plus(Monoid.scala:84)
    at com.twitter.scalding.KeyedList$$anonfun$sum$1.apply(TypedPipe.scala:264)
    at com.twitter.scalding.MRMAggregator.aggregate(Operations.scala:279)
    at cascading.flow.stream.AggregatorEveryStage.receive(AggregatorEveryStage.java:128)

所以我的问题是我能做些什么来避免这种情况

快速但不可缩放的答案:尝试增加
mapred.child.java.opts

更好的回答是,理解这个问题有点棘手,因为我不知道VAL的类型,也不知道
f
是什么
vf
,因为您没有对它们进行详细的命名。如果您提供了所需的最少代码量,这样我就可以粘贴到IDE中并进行游戏,那么我可能会发现您的问题

sum
可能是OOM发生的地方,但这不是导致OOM发生的原因-以不同的方式进行sum重构不会有帮助


很有可能是你遇到了太大而无法记忆的事情。所以
mapred.child.java.opts可能是您唯一的解决方案,除非您完全重新构造数据。注意
cross
调用
crossWithTiny
,现在tiny的意思是tiny:)

快速但不可缩放的回答:尝试增加
mapred.child.java.opts

更好的回答是,理解这个问题有点棘手,因为我不知道VAL的类型,也不知道
f
是什么
vf
,因为您没有对它们进行详细的命名。如果您提供了所需的最少代码量,这样我就可以粘贴到IDE中并进行游戏,那么我可能会发现您的问题

sum
可能是OOM发生的地方,但这不是导致OOM发生的原因-以不同的方式进行sum重构不会有帮助


很有可能是你遇到了太大而无法记忆的事情。所以
mapred.child.java.opts可能是您唯一的解决方案,除非您完全重新构造数据。注意
cross
调用
crossWithTiny
,现在tiny的意思是tiny:)

在.sum之前尝试.forceToReducer。当我们缓存值时,这个OOM发生在映射端。这对你的情况可能没有帮助


但是,如果列表确实太大,那么可以做的事情就很少了。

在.sum之前尝试.forceToReducer。当我们缓存值时,这个OOM发生在映射端。这对你的情况可能没有帮助

然而,如果名单真的太大,那就真的没什么可做的了