【问题标题】:Apache Spark SQL - RDD In-Memory Data SkewApache Spark SQL - RDD 内存数据倾斜
【发布时间】: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


【解决方案1】:

我不完全知道为什么直接从磁盘读取数据时会出现偏差。但是,我发现repartition 您的数据通常很有用,可以平衡分区的大小并避免被单一的长期任务拖累。我建议阅读https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html 的最后一部分(“数据分区(高级)”部分),其中提供了一些不错的提示:)

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多