所以我所做的就是
rdd.flatMap(lambda x: enumerate(x))
为我的数据创建密钥0-49。然后我决定这样做:
rdd.flatMap(lambda x: enumerate(x)).partitionBy(50)
我注意到发生了一些奇怪的事情,因此对于以下文件大小,10GB需要46秒才能进行计算,50GB文件需要10分31秒。我检查了文件,由于某种原因它只有4个块。
所以我所做的改变了:
sc.textFile("file", 100)
我删除了分区,50GB文件下降到大约1分钟。我想知道在加载后尝试重新分区数据是否仍然有意义?也许靠钥匙?
答案 0 :(得分:3)
如果我正确理解了您的问题,您会在需要额外重新分配时询问。首先,您应该记住,重新分配是expensive operation。明智地使用它。其次,没有严格的答案,而且还有经验。但是一些常见的情况是:
您可以尝试在repartition
之前的日期致电join, leftOuterJoin, cogroup...
。有时它可以加快计算速度。
您flatMap
将您的数据加入更多"重量级"数据并遇到Java heap space Exception java.lang.OutOfMemoryError
。那么你当然应该让你的分区更小,以适应flatMap
之后的数据。
您将数据加载到database \ mongoDb \ elasticSearch ...您在数据上调用repartition
,然后在forEachPartition
代码块内部将所有这些分区批量插入到数据库中。所以这些块的大小应该是合理的。