Scala Spark缓存:RDD仅缓存8%
对于我的代码片段,如下所示:Scala Spark缓存:RDD仅缓存8%,scala,memory-management,apache-spark,distributed-computing,rdd,Scala,Memory Management,Apache Spark,Distributed Computing,Rdd,对于我的代码片段,如下所示: val levelsFile=sc.textFile(levelsFilePath) val levelsSplitedFile=levelsFile.map(line=>line.split(fileDelimiter,-1)) val levelPairRddtemp=levelsSplitedFile .filter(linearr=>(linearr(pogIndex).length!=0)) .map(linearr=>(linearr(pogIndex)
val levelsFile=sc.textFile(levelsFilePath)
val levelsSplitedFile=levelsFile.map(line=>line.split(fileDelimiter,-1))
val levelPairRddtemp=levelsSplitedFile
.filter(linearr=>(linearr(pogIndex).length!=0))
.map(linearr=>(linearr(pogIndex).toLong,levelsIndexes.map(x=>linearr(x))
.filter(value=>(!value.equalsIgnoreCase(“”&!value.equalsIgnoreCase(“”&!value.equalsIgnoreCase(“”)&!value.equalsIgnoreCase(“”)&!null“))
.mapValues(value=>value.mkString(“,”))
.partitionBy(新HashPartitioner(24))
.persist(仅限存储级别的内存)
levelPairRddtemp.count//仅用于触发rdd创建
信息
Spark
版本:1.5.2存储选项卡中的SparkUI
时,我看到的是:
查看RDD
,似乎24个分区中只有2个被缓存
对此行为的任何解释,以及如何修复此问题
编辑1:我刚刚尝试了60个分区作为HashPartitioner
:
..
.partitionBy(new HashPartitioner(60))
..
而且它起作用了。现在我得到了整个RDD
缓存。猜猜这里会发生什么事?数据偏斜会导致这种行为吗
Edit-2:当我再次使用24个分区运行时,包含BlockManagerInfo
的日志。这次缓存了3/24分区
:
16/03/17 14:15:28 INFO BlockManagerInfo: Added rdd_294_14 in memory on ip-10-1-34-66.ec2.internal:47526 (size: 107.3 MB, free: 2.6 GB)
16/03/17 14:15:30 INFO BlockManagerInfo: Added rdd_294_17 in memory on ip-10-1-34-65.ec2.internal:57300 (size: 107.3 MB, free: 2.6 GB)
16/03/17 14:15:30 INFO BlockManagerInfo: Added rdd_294_21 in memory on ip-10-1-34-65.ec2.internal:57300 (size: 107.4 MB, free: 2.5 GB)
我相信这是因为内存限制已经达到,或者更重要的是,您使用的内存选项并没有让您的工作利用所有资源
增加#分区意味着减少每个任务的大小,这也许可以解释这种行为。是否可能在整个作业完成之前截取了屏幕截图,但它没有得到更新?如果您有日志文件,是否可以查找包含BlockManagerMasterActor
的行?否则它将意味着一个bug…我的是一个周期为5分钟的流作业。我等了15分钟。我从BlockManagerMaster获得了一些日志,但只是作为信息,没有错误。BlockManagerMasterActor
中的任何内容都与在
上的内存中添加的rdd_0_1相似吗?你有多少?当然是在“24”分区的情况下。@MateuszDymczyk:相关日志被添加到问题中。