我一直在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个小时,但是当使用默认分区运行时,它们需要大约相同的时间?