Databricks 异常:序列化结果的总大小大于 spark.driver.maxResultsSize

Databricks Exception: Total size of serialized results is bigger than spark.driver.maxResultsSize

我是 运行 Azure 上 Apache Spark 中的一个代码,可将超过 300 万个 XML 文件转换为一个 CSV 文件。当我想这样做时,出现以下错误:

org.apache.spark.SparkException:作业因阶段失败而中止:1408098 个任务的序列化结果总大小 (4.0 GB) 大于 spark.driver.maxResultSize (4.0 GB)

我知道错误的一般含义,但我不知道它对我的情况意味着什么,我不明白如何解决这个问题。

密码是:

已加载所有 XML 个文件:

df = spark.read.format('com.databricks.spark.xml').option("rowTag", "ns0:TicketScan").load('LOCATION/*.xml')

所有加载的文件都放入 CSV 文件中:

 def saveDfToCsv(df, tsvOutput):
  tmpParquetDir = "dbfs:/tmp/mart1.tmp.csv"
  dbutils.fs.rm(tmpParquetDir, True)
  df.repartition(1).write.format("com.databricks.spark.csv").option("header", "true").save(tmpParquetDir)
  src = filter(lambda x: "part-00000" in x.name, dbutils.fs.ls('dbfs:/tmp/mart1.tmp.csv'))[0].path
  dbutils.fs.mv(src, tsvOutput)

saveDfToCsv(df, 'LOCATION/database.csv')

我希望我的问题足够清楚。如果不是,请允许我进一步解释。

希望有人能帮助我。

此致。

看起来你的驱动程序对存储结果的大小有限制,你的结果文件已经超过了限制,所以你可以在你的笔记本中通过以下命令增加结果的大小。

sqlContext.getConf("spark.driver.maxResultSize")
res19: String = 20g

它给出的当前最大存储容量为 20 GB,我的

sqlContext.setConf("spark.driver.maxResultSize","30g")

要增加 maxResultSize,您可以使用上面的命令。

不推荐这样做,因为它会降低集群的性能大小,因为这样您就可以最大限度地减少免费 space 分配给 cluster.But 中用于处理的临时文件,我认为它解决了您的问题。

您需要在集群配置中更改此参数。进入集群设置,在 Advanced select 下 spark 并粘贴 spark.driver.maxResultSize 0(无限制)或任何适合您的值。不推荐使用 0。您应该通过重新分区来优化作业。

您需要增加群集的 maxResultSize 值。

maxResultSize 必须在 集群启动之前设置 -- 尝试在集群启动后在笔记本中设置 maxResultSize 将不起作用。

“编辑”集群并在“高级选项”下的“Spark 配置”部分设置值。

这是 为 AWS 中的 Databricks 配置集群 的屏幕截图,但 Azure 中的 Databricks 可能存在类似的内容。

在您的笔记本中,您可以通过包含以下命令验证该值是否已设置:

当然,对于您的情况,8g 可能不够大,因此请继续增加它,直到问题消失——否则其他问题就会爆发!祝你好运。

注意:当我 运行 遇到这个问题时,我的笔记本试图写入 S3,而不是直接尝试“收集”数据,可以这么说。