我正在处理大约60亿条记录的大型数据集,我已成功执行了所有计算/运算。最后,当我使用以下命令将数据存储到databricks(DBFS)数据库时,它花费的时间更长(超过25-30小时),即使它也没有完成。有人可以给我一些好的方法来处理如此巨大的数据。
df_matches_ml_target.write.mode("overwrite").saveAsTable("Demand_Supply_Match_ML")
让我知道您是否需要更多信息。
最佳答案
到目前为止,这听起来很像Bi Rico指出的那样,您一直在对数据集执行“惰性”操作。这是懒执行的含义的detailed summary。
本质上,您对数据集所做的任何转换(例如地图,flatMap,过滤器等)都不会执行,直到调用一个动作为止。动作执行需要使用结果的操作,一些示例正在写入文件(saveAsTable),count(),take()等。
由于您有60亿条未知大小的记录,因此听起来您的数据集相当大,这可能是为什么花这么长时间执行操作的一个重要因素。
在将Spark与大数据结合使用时,通常的建议是处理较小的数据子集。这使您可以检查转换和代码的有效性,并在合理的时间内获得结果。然后,您可以将您的工作应用于整个数据集。
编辑于2018年9月21日:建议加快处理时间
没有更多信息很难说,但是这里有一些一般性提示。
避免导致改组的命令(例如groupByKey)。改组将所有数据重新分配到它们各自的分区,然后再合并它们。这导致大量的网络I / O。
尝试正确地对数据进行分区。这将最大程度地并行处理数据
将更多节点添加到群集中和/或增加节点的大小(CPU /内存)。这不是一门精确的科学。更多节点可以帮助进行分区。仅在节点受到资源限制时才增加它们的大小。
关于apache-spark - 在PySpark(Azure-DataBricks)中将数据存储到数据库非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52403848/