Spark 缓存:RDD 仅缓存了 8%
Spark Caching: RDD Only 8% cached
我的代码片段如下:
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("null")))))
.mapValues(value => value.mkString(","))
.partitionBy(new HashPartitioner(24))
.persist(StorageLevel.MEMORY_ONLY_SER)
levelPairRddtemp.count // just to trigger rdd creation
信息
- 文件大小~4G
- 我正在使用 2
executors
(每个 5G)和
12 核。
Spark
版本:1.5.2
问题
当我查看 Storage tab
中的 SparkUI
时,我看到的是:
查看 RDD
内部,似乎 24 个 partitions
中只有 2 个被缓存。
对此行为的任何解释,以及如何解决这个问题。
编辑 1:我刚刚尝试使用 60 个分区 HashPartitioner
作为:
..
.partitionBy(new HashPartitioner(60))
..
它有效。现在我正在缓存整个 RDD
。猜猜这里可能发生了什么?数据偏斜会导致这种行为吗?
Edit-2:当我再次使用 24 partitions
运行 时,包含 BlockManagerInfo
的日志。这次缓存了 3/24 partitions
:
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)
我认为发生这种情况是因为达到了内存限制,或者更重要的是,您使用的内存选项不会让您的工作利用所有资源。
增加#partitions,意味着减少每个任务的大小,这或许可以解释这种行为。
我的代码片段如下:
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("null")))))
.mapValues(value => value.mkString(","))
.partitionBy(new HashPartitioner(24))
.persist(StorageLevel.MEMORY_ONLY_SER)
levelPairRddtemp.count // just to trigger rdd creation
信息
- 文件大小~4G
- 我正在使用 2
executors
(每个 5G)和 12 核。 Spark
版本:1.5.2
问题
当我查看 Storage tab
中的 SparkUI
时,我看到的是:
查看 RDD
内部,似乎 24 个 partitions
中只有 2 个被缓存。
对此行为的任何解释,以及如何解决这个问题。
编辑 1:我刚刚尝试使用 60 个分区 HashPartitioner
作为:
..
.partitionBy(new HashPartitioner(60))
..
它有效。现在我正在缓存整个 RDD
。猜猜这里可能发生了什么?数据偏斜会导致这种行为吗?
Edit-2:当我再次使用 24 partitions
运行 时,包含 BlockManagerInfo
的日志。这次缓存了 3/24 partitions
:
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)
我认为发生这种情况是因为达到了内存限制,或者更重要的是,您使用的内存选项不会让您的工作利用所有资源。
增加#partitions,意味着减少每个任务的大小,这或许可以解释这种行为。