Azure Databricks OOM 错误导致与 Python REPL 的连接关闭

nam*_*nam 10 python pandas apache-spark azure-sql-database azure-databricks

在以下示例代码中,在one cell我们的Azure Databricks笔记本中,代码将大约 2000 万条记录从 加载到Python pandas 中,通过应用一些函数执行一些数据帧列转换(如下面的代码片段所示)。但运行代码大约半小时后,Databricks 抛出以下错误:dataframeAzure SQL db

错误

ConnectException: Connection refused (Connection refused)
Error while obtaining a new communication channel
ConnectException error: This is often caused by an OOM error that causes the connection to the Python REPL to be closed. Check your query's memory usage.
Run Code Online (Sandbox Code Playgroud)

备注:表大约有 150 列。Databricks上的集群Spark setting如下 :128 GB , 16 Cores, DBR 8.3, Spark 8.3, Scala 2.12

问题:导致该错误的原因可能是什么?我们该如何修复它?

import sqlalchemy as sq
import pandas as pd

def fn_myFunction(lastname):
    testvar = lastname.lower()
    testvar = testvar.strip()
    
    return testvar

pw = dbutils.secrets.get(scope='SomeScope',key='sql')
engine = sq.create_engine('mssql+pymssql://SERVICE.Databricks.NONPUBLICETL:'+pw+'MyAzureSQL.database.windows.net:1433/TEST', isolation_level="AUTOCOMMIT")

app_df = pd.read_sql('select * from MyTable', con=engine)

#create new column
app_df['NewColumn'] = app_df['TestColumn'].apply(lambda x: fn_myFunction(x))
.............
.............
Run Code Online (Sandbox Code Playgroud)

Kar*_*raj 5

首先,我们可以了解驱动程序节点出现 OOM 问题的最常见原因。

导致此错误的一个常见原因是驱动程序遇到内存瓶颈。发生这种情况时,驱动程序会因内存不足 (OOM) 情况而崩溃,并重新启动或由于频繁的完整垃圾收集而变得无响应。内存瓶颈的原因可能是以下任一原因:

  • 该驱动程序实例类型对于在驱动程序上执行的负载来说不是最佳的。
  • 驱动程序上执行内存密集型操作。
  • 有许多笔记本或作业在同一集群上并行运行。

为什么你的情况会发生这种情况?

当我们通过 处理任何数据集时Pandas,它在单台机器(驱动程序节点)上运行操作,而不是像 PySpark 在多台机器上运行。如果你正在处理更大的数据集,通过 python pandas,无论集群有多大。因此可以增加驱动节点的内存大小或以分布式模式进行处理。


小智 3

这意味着驱动程序因 OOM(内存不足)异常而崩溃,之后无法与驱动程序建立新连接。

请尝试以下选项

  • 尝试增加驱动程序端内存,然后重试。
  • 您可以查看 Spark 作业 dag,它为您提供有关数据流的更多信息。

欲了解更多信息,请关注Aditi Sinha 的这篇文章