>我正在尝试使用缓存表表名;
在此命令之后,表成功缓存,但是我注意到内存中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格式存储
我不完全知道为什么直接从磁盘读取时您的数据会偏斜。但是,我发现repartition
数据以平衡分区的大小并避免被单个长期任务拖累通常很有用。我建议阅读 https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html 的最后一部分("数据分区(高级)"部分),其中提供了一些不错的提示:)