我有一个火花数据框,大约有458MM行。它最初是一个RDD,然后我使用sqlcontext.createDataFrame
转换为spark数据帧RDD的前几行如下:
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 with Yarn有50个执行器,每个10g,5个核心。 write命令一直运行一小时,但文件仍未保存。
是什么让它变慢?
答案 0 :(得分:1)
我可以考虑尝试两件事:
您可能需要检查所拥有的分区数。如果分区太少,则无法获得所需的并行性。
Spark懒洋洋地做着它的东西。这意味着写入速度可能非常快,但计算速度很慢。您可以尝试做的是缓存数据帧(并执行一些操作,例如对其进行计数以确保其具体化),然后再次尝试写入。如果保存部分现在很快,那么问题在于计算而不是镶木地板。
答案 1 :(得分:0)
也会尝试增加核心,这是主要因素之一,因为数字核心与执行者的数量成正比。那么,并行处理成为可能。