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

Posted

技术标签:

【中文标题】将数据存储到 PySpark (Azure - DataBricks) 中的数据库非常慢【英文标题】:Storing data to database in PySpark (Azure - DataBricks) is very slow 【发布时间】:2018-09-19 10:34:42 【问题描述】:

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

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

如果您需要这方面的更多信息,请告诉我。

【问题讨论】:

“我已成功执行所有计算/操作”是什么意思?我问是因为数据框是惰性的,它们实际上不会计算任何东西,直到您执行操作,例如写入表。您的操作很可能是花费大部分时间的事情。 这意味着,代码/程序级别的一切都已完成。一旦我执行了 count() 和其他与数据相关的操作。我开始收到这些错误。 countsaveAsTable 都是执行您在代码中构建的查询计划的操作。 Spark 有一个构建计划、执行计划模型,类似于某些编程语言的编译代码、运行代码模型。直到您执行操作(例如计数或保存)的所有代码部分都在构建计划,在您执行操作之前,该计划不会真正运行。看来您的计划构建良好,但运行时遇到问题(速度慢,是否抛出错误?)。您的计划运行时出现问题的原因有很多,我们需要查看代码以提供帮助。 【参考方案1】:

听起来到目前为止,正如 Bi Rico 上面指出的那样,您一直在对数据集执行“惰性”操作。这是 延迟执行 含义的detailed summary。

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

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

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

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

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

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

【讨论】:

很好的解释 GuavaKhan...我已经使用小数据集完成了所有验证测试,但现在我想将我所有的研究应用于更大的实际数据...所以在这种情况下,我我不确定如何处理这种情况。如果您知道任何算法方法,请提出建议。您的意见将不胜感激。 你能分享更多关于你试图用这些数据做什么的信息吗?例如,这是否将是一个夜间批处理作业,用于清理业务用户早上查询的信息?另外能否分享一下数据集的大小(GBs、TBs、PBs)是多少? 您好,这不是夜间工作。我必须使用这个数据集来应用机器学习(数据科学)......所以,如果这可以分成不同的块并且可以用来在存储的 Pyspark DataFrame 上应用 ML。这将符合我的期望.. @shail 我编辑了帖子以反映一些关于加快处理速度的建议。

以上是关于将数据存储到 PySpark (Azure - DataBricks) 中的数据库非常慢的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure 存储目录作为流数据源执行 PySpark Stream

将 udf 调用移动到新函数后的 azure pyspark udf 属性 nonetype

无法从 databricks pyspark 工作人员写入 Azure Sql DataWarehouse

如何在 Azure Databricks PySpark 中执行存储过程?

如何将火花流数据帧存储到 Mysql 表。?

使用 PySpark JDBC 将数据帧写入 Azure SQL 数据库时性能下降