在PySpark(Azure - DataBricks)中将数据存储到数据库非常慢



我正在处理拥有大约 60 亿条记录的大型数据集,我已经成功地执行了所有计算/操作。最后,当我使用以下命令将数据存储到 databricks(DBFS( 数据库时,它需要更长的时间(超过 25-30 小时(,即使它也没有完成。有人可以给我一些处理如此庞大的数据的好方法吗?

df_matches_ml_target.write.mode("overwrite").saveAsTable("Demand_Supply_Match_ML")

如果您需要更多信息,请告诉我。

听起来到目前为止,正如Bi Rico上面指出的那样,您一直在对数据集执行"懒惰"操作。以下是延迟执行含义的详细摘要。

从本质上讲,您对数据集(例如map,flatMap,filter等(所做的任何转换在调用操作之前都不会执行。一个动作会执行一些需要使用结果的操作,一些示例是写入文件(saveAsTable(,count((,take((等。

由于您有 60 亿条未知大小的记录,因此听起来您的数据集相当大,这可能是执行操作需要这么长时间的一个重要因素。

将 Spark 与大数据结合使用时,一般建议处理较小的数据子集。这允许您检查转换和代码的有效性,并在合理的时间内获得结果。然后,您可以将工作应用于整个数据集。

于2018年9月21日编辑:加快处理时间的建议

如果没有更多信息,很难说,但这里有一些一般提示。

  • 避免使用导致随机播放的命令(如 groupByKey(。随机播放会在合并数据之前将所有数据重新分配到各自的分区。这会导致大量的网络 I/O。
  • 尝试对数据进行正确分区。这将最大限度地提高数据的并行处理
  • 向群集添加更多节点和/或增加节点的大小(CPU/内存(。这不是一门精确的科学。更多的节点可以帮助分区。仅当节点受到资源限制时,才增加节点的大小。

检查点会有所帮助。查看执行计划。

根据文档:

检查点可用于截断此逻辑计划 数据帧,这在迭代算法中特别有用,其中 该计划可能会呈指数级增长。它将被保存到文件中 使用 SparkContext.setCheckpointDir(( 设置的检查点目录。

希望这有帮助

最新更新