【发布时间】:2015-07-08 14:15:15
【问题描述】:
我正在尝试使用在内存中缓存 Hive 表 CACHE TABLE 表名;
执行此命令后,表被成功缓存,但是我注意到 RDD 在内存中的分区方式存在偏差。
这是我在应用程序主控的“存储”选项卡中看到的内容
rdd_71_1 Memory Deserialized 1x Replicated 1264.7 MB 0.0 B node4:38759
rdd_71_10 Memory Deserialized 1x Replicated 11.6 MB 0.0 B node1:58115
rdd_71_11 Memory Deserialized 1x Replicated 25.7 MB 0.0 B node1:53968
rdd_71_2 Memory Deserialized 1x Replicated 72.6 MB 0.0 B node4:54133
rdd_71_4 Memory Deserialized 1x Replicated 1260.9 MB 0.0 B node2:33179
rdd_71_5 Memory Deserialized 1x Replicated 56.8 MB 0.0 B node2:54222
rdd_71_7 Memory Deserialized 1x Replicated 54.5 MB 0.0 B node4:34149
rdd_71_8 Memory Deserialized 1x Replicated 1277.8 MB 0.0 B node1:43572
rdd_71_9 Memory Deserialized 1x Replicated 1255.8 MB 0.0 B node1:58518
请注意,有些分区的范围是 11MB 到 72MB,而其他分区的范围是 ~1200MB
即使我没有缓存表,而只是简单地从磁盘处理,我发现有些任务比其他任务完成得早得多,这进一步证实了我对偏度的猜测。
这是怎么回事?如何避免这种数据倾斜?
PS : 表格是以ORC格式存储的
【问题讨论】:
-
我猜缓存表正在执行临时缓存以提高计算性能
标签: apache-spark rdd apache-spark-sql