我一直在EC2上运行Apache Spark程序,我的结果表明,通过将数据划分为每个核心推荐的2-3个分区比使用(看似)默认分区2要慢得多 .

在没有分区的情况下完成纳秒:

u1 - 650472112996
u2 - 654525970891
u3 - 498530412012
u4 - 568162162934
u5 - 659015135256

总分区数为2,我使用 sparkContext.partitions.size 进行了检查 . *

纳秒完成每个核心2个分区(总共32个分区):

u1 - 1562831187137
u2 - 1690008041723
u3 - 1652170780785
u4 - 3381857826333 
u5 - 3969656930184

这组特定的实验在16节点集群中运行 .

虽然没有分区每次大约需要10分钟,但分区需要25-60分钟!使用了完全相同的程序和参数 . 检查Spark UI显示数据文件对于默认分区节点而言太大,并且通常数据溢出到磁盘,这在使用32个分区时从未发生过 . 此外,在默认的分区运行中只能运行2个任务(显然,只有2个分区);同时,32个分区集群有16个并发运行的任务 . 我以为分区运行会更快,而不是更慢!

什么可能导致速度下降?可能在节点间混乱数据?另外,为什么一个运行,即 u1 需要25分钟而另一个运行,即 u5 ,在32个分区集群上花费1个小时,但是当使用默认分区运行它们大约需要相同的时间?

  • Apache Spark文档说分区数量将等于集群中的核心数量;但是,我已经使用不同的EC2实例,每次默认为2个分区,在2到20个簇大小范围内测试了这个 .