猿问

Databricks 异常:序列化结果的总大小大于

我正在 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')

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


我希望有一个人可以帮助我。


最好的祝福。


慕尼黑5688855
浏览 151回答 3
3回答

倚天杖

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

缥缈止盈

看起来您的驱动程序存储结果的大小有限,并且您的结果文件已超过限制,因此您可以通过笔记本中的以下命令增加结果的大小。sqlContext.getConf("spark.driver.maxResultSize") res19: String = 20g它给出了当前最大存储容量为 20 GB,我的sqlContext.setConf("spark.driver.maxResultSize","30g")要增加 maxResultSize,您可以使用上述命令。不推荐这样做,因为它会降低集群的性能大小,因为这样您就最大限度地减少了分配给集群中用于处理的临时文件的可用空间。但我认为它解决了您的问题。

撒科打诨

您需要增加集群的 maxResultSize 值。在maxResultSize必须设置之前在启动群集-试图在启动群集之后将无法正常工作设置maxResultSize在笔记本上。“编辑”集群并在“高级选项”下的“Spark 配置”部分设置值。这是在 AWS 中为 Databricks配置集群的屏幕截图,但对于 Azure 中的 Databricks 可能存在类似的内容。在您的笔记本中,您可以通过包含以下命令来验证该值是否已设置:当然,在您的情况下 8g 可能不够大,因此请继续增加它直到问题消失 - 或者其他东西爆炸!祝你好运。注意:当我遇到这个问题时,我的笔记本试图写入 S3,而不是直接尝试“收集”数据,可以这么说。
随时随地看视频慕课网APP

相关分类

Python
我要回答