xml – 在Spark 2.1.0中读取大文件时出现内存不足错误
我想使用spark将大型(51GB)
XML文件(在外部硬盘上)读入数据帧(使用
spark-xml plugin),进行简单的映射/过滤,重新排序,然后将其作为CSV文件写回磁盘.
但我总是得到一个java.lang.OutOfMemoryError:Java堆空间,无论我如何调整它. 我想了解为什么不增加分区数量来阻止OOM错误 它不应该将任务分成更多部分,以便每个部分都更小并且不会导致内存问题吗?
我试过的事情: >在读取和写入时重新分区/合并到(5,000和10,000个分区)数据帧(初始值为1,604) 我的所有代码都在这里(注意我没有缓存任何东西): val df: DataFrame = spark.sqlContext.read .option("mode","DROPMALFORMED") .format("com.databricks.spark.xml") .schema(customSchema) // defined previously .option("rowTag","row") .load(s"$pathToInputXML") println(s"nnNUM PARTITIONS: ${df.rdd.getNumPartitions}nn") // prints 1604 // i pass `numPartitions` as cli arguments val df2 = df.coalesce(numPartitions) // filter and select only the cols i'm interested in val dsout = df2 .where( df2.col("_TypeId") === "1" ) .select( df("_Id").as("id"),df("_Title").as("title"),df("_Body").as("body"),).as[Post] // regexes to clean the text val tagPat = "<[^>]+>".r val angularBracketsPat = "><|>|<" val whitespacePat = """s+""".r // more mapping dsout .map{ case Post(id,title,body,tags) => val body1 = tagPat.replaceAllIn(body,"") val body2 = whitespacePat.replaceAllIn(body1," ") Post(id,title.toLowerCase,body2.toLowerCase,tags.split(angularBracketsPat).mkString(",")) } .orderBy(rand(SEED)) // random sort .write // write it back to disk .option("quoteAll",true) .mode(SaveMode.Overwrite) .csv(output) 笔记 >输入分割非常小(仅33MB),为什么我不能每个处理一个分割的8个线程?它真的不应该让我记忆犹新(我已经 更新我写了一个较短版本的代码,只读取文件,然后是forEachPartition(println). 我得到了相同的OOM错误: val df: DataFrame = spark.sqlContext.read .option("mode","DROPMALFORMED") .format("com.databricks.spark.xml") .schema(customSchema) .option("rowTag","row") .load(s"$pathToInputXML") .repartition(numPartitions) println(s"nnNUM PARTITIONS: ${df.rdd.getNumPartitions}nn") df .where(df.col("_PostTypeId") === "1") .select( df("_Id").as("id"),df("_Tags").as("tags") ).as[Post] .map { case Post(id,tags) => Post(id,body.toLowerCase,tags.toLowerCase)) } .foreachPartition { rdd => if (rdd.nonEmpty) { println(s"HI! I'm an RDD and I have ${rdd.size} elements!") } } P.S.:我正在使用spark v 2.1.0.我的机器有8个核心和16 GB RAM. 解决方法
我在运行spark-shell时遇到了这个错误,因此我将驱动程序内存增加到了一个很高的数字.然后我就能加载XML了.
spark-shell --driver-memory 6G 资料来源:https://github.com/lintool/warcbase/issues/246#issuecomment-249272263 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |