2016-12-01 58 views
0

我有一个有大约458MM行的火花数据框。它最初的RDD所以然后我转换使用sqlcontext.createDataFrame RDD的将DataFrame保存到拼花板需要很多时间

前几行火花数据帧如下:

sorted_rdd.take(5) 
Out[25]: 
[(353, 21, u'DLR_Where Dreams Come True Town Hall', 0, 0.896152913570404), 
(353, 2, u'DLR_Leading at a Higher Level', 1, 0.7186800241470337), 
(353, 
    220, 
    u'DLR_The Year of a Million Dreams Leadership Update', 
    0, 
    0.687175452709198), 
(353, 1, u'DLR_Challenging Conversations', 1, 0.6632049083709717), 
(353, 
    0, 
    u'DLR_10 Keys to Inspiring, Engaging, and Energizing Your People', 
    1, 
    0.647541344165802)] 

我保存到数据帧如下

sorted_df=sqlContext.createDataFrame(sorted_rdd,['user','itemId','itemName','Original','prediction']) 

最后将其保存为如下:

sorted_df.write.parquet("predictions_df.parquet") 

我使用的Spark具有纱每个10g和5个核心的50个执行者。写入命令将继续运行一个小时,但文件尚未保存。

是什么让它变慢?

回答

1

两件事我能想到的尝试:

  1. 你可能要检查你的分区数目。如果你的分区太少,那么你没有得到所需的并行性。

  2. 火花懒洋洋地做它的东西。这意味着它可能是写作非常快,但为了达到它的计算速度很慢。你可以尝试做的是缓存数据帧(并执行一些操作,例如计数,以确保其实现),然后再次尝试写入。如果现在保存的部分很快,那么问题在于计算,而不是实木复合地板书写。

+0

它已经物化,因为我做了一个计数。如何在火花上下文中增加分区? – Baktaawar

0

也尝试增加内核,如果你有足够的,这是最主要的事情之一,因为核心数量是成正比的执行者的数量。那么,可能的并行处理。

+0

好吧,我读了一篇Cloudera博客文章,他们提到理想情况下,每个执行者不应超过5个内核。 – Baktaawar

+0

每执行者5个核心是完全罚款我教每个工作。请使用重新分区(<分区数量>)来增加分区数量。 –

相关问题