【问题标题】:Saving DataFrame to Parquet takes lot of time将 DataFrame 保存到 Parquet 需要大量时间
【发布时间】:2017-04-15 16:10:30
【问题描述】:

我有一个大约 458MM 行的 spark 数据框。它最初是一个 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") 

我正在使用带有 Yarn 的 Spark,它有 50 个 10g 的执行器和 5 个内核。写入命令持续运行一个小时,但文件仍未保存。

是什么让它这么慢?

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    我可以想到两件事来尝试:

    1. 您可能想要检查您拥有的分区数。如果分区太少,则无法获得所需的并行度。

    2. Spark 懒惰地做事。这意味着可能是写入速度非常快,但计算速度很慢。您可以尝试做的是缓存数据帧(并执行一些操作,例如对其进行计数以确保它实现),然后尝试再次写入。如果现在节省部分很快,那么问题在于计算而不是拼花书写。

    【讨论】:

    • 自从我数了数之后,它就实现了。如何在 spark 上下文中增加分区?
    【解决方案2】:

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

    【讨论】:

    • 好吧,我阅读了一篇 Cloudera 博文,他们提到理想情况下,每个执行程序的内核数不应超过 5 个。
    • 每个执行器 5 个核心完全没问题,我教每个作业。请使用 repartition() 增加分区数。
    • @PrudviSagar 即使我遇到了同样的问题,有 30 个执行程序并将 df 重新分区为 30,但仍然很慢,并且观察到只有一个分区处于活动状态,所有其他分区都处于空闲状态,我做错了什么让所有执行者平等地承担负载???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多