我正在Azure上的Apache Spark中运行一个代码,该代码将超过300万个XML文件转换为一个CSV文件。我要执行此操作时遇到以下错误:
org.apache.spark.SparkException:作业由于阶段故障而中止:1408098任务(4.0 GB)的序列化结果的总大小大于spark.driver.maxResultSize(4.0 GB) < / p>
我知道错误通常意味着什么,但是我不知道对于我的情况意味着什么,我也不知道如何解决这个问题。
代码是:
df = spark.read.format('com.databricks.spark.xml').option("rowTag", "ns0:TicketScan").load('LOCATION/*.xml')
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')
我希望我的问题足够清楚。如果没有,请允许我进一步解释。
我希望有人能帮助我。
最诚挚的问候。
答案 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 可能存在类似的内容。
在您的笔记本中,您可以通过包含以下命令验证该值是否已设置:
当然,在您的情况下 8g 可能不够大,因此请继续增加它,直到问题消失 - 或者其他事情发生!祝你好运。
注意:当我遇到这个问题时,我的笔记本试图写入 S3,而不是直接尝试“收集”数据,可以这么说。