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

时间:2018-10-30 15:17:48

标签: python azure apache-spark databricks

我正在Azure上的Apache Spark中运行一个代码,该代码将超过300万个XML文件转换为一个CSV文件。我要执行此操作时遇到以下错误:

org.apache.spark.SparkException:作业由于阶段故障而中止:1408098任务(4.0 GB)的序列化结果的总大小大于spark.driver.maxResultSize(4.0 GB) < / p>

我知道错误通常意味着什么,但是我不知道对于我的情况意味着什么,我也不知道如何解决这个问题。

代码是:

所有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')

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

我希望有人能帮助我。

最诚挚的问候。

3 个答案:

答案 0 :(得分:1)

看起来您的驱动程序来存储结果的大小受限制,并且结果文件已超出限制,因此您可以在笔记本中通过以下命令来增加结果的大小。

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

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

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

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

不建议这样做,因为它会降低群集的性能,因为这样可以最大程度地减少分配给临时文件的可用空间,以便在群集中进行处理。但是我认为这可以解决您的问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您需要增加集群的 maxResultSize 值。

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

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

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

cluster configuration

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

enter image description here

当然,在您的情况下 8g 可能不够大,因此请继续增加它,直到问题消失 - 或者其他事情发生!祝你好运。

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