Spark重新分区很慢,并且会对数据进行洗牌

时间:2015-05-05 01:01:04

标签: apache-spark

我的群集:

  • 5个数据节点
  • 每个数据节点具有:8个CPU,45GB内存

由于某些其他配置限制,我只能在每个数据节点上启动5个执行程序。所以我做了

spark-submit --num-executors 30 --executor-memory 2G ...

因此每个执行者使用1个核心。

我有两个数据集,每个数据集约为20 GB。在我的代码中,我做了:

val rdd1 = sc...cache()
val rdd2 = sc...cache()

val x = rdd1.cartesian(rdd2).repartition(30) map ...

在Spark UI中,我看到repartition步骤耗时超过30分钟,导致数据洗牌超过150GB。

我不认为这是对的。但我无法弄清楚出了什么问题......

1 个答案:

答案 0 :(得分:3)

你真的是说"笛卡尔"?

您将RDD1中的每一行乘以RDD2中的每一行。因此,如果您的行每个都是1k,那么每个RDD大约有20,000行。笛卡尔积将返回一组20,000 x 20,000或4亿条记录。请注意,现在每行的宽度都是两倍 - 2k - 所以你在RDD3中有800 GB,而在RDD1和RDD2中你只有20 GB。

也许试试:

val x = rdd1.union(rdd2).repartition(30) map ...

或者甚至可能:

val x = rdd1.zip(rdd2).repartition(30) map ...