Spark SQL createDataFrame() 引发 OutOfMemory 异常
Posted
技术标签:
【中文标题】Spark SQL createDataFrame() 引发 OutOfMemory 异常【英文标题】:Spark SQL createDataFrame() raising OutOfMemory exception 【发布时间】:2015-07-17 09:59:39 【问题描述】:它会在内存中创建整个数据帧吗?
如何创建一个大型数据帧(> 100 万行)并将其持久化以供以后查询?
【问题讨论】:
这是一个很好的关闭候选。你的设置是什么?配置是什么?你得到的确切错误是什么? 【参考方案1】:将其持久化以供以后查询:
val sc: SparkContext = ...
val hc = new HiveContext( sc )
val df: DataFrame = myCreateDataFrameCode().
coalesce( 8 ).persist( StorageLevel.MEMORY_ONLY_SER )
df.show()
这会将 DataFrame 合并为 8 个分区,然后再通过序列化对其进行持久化。不确定我能说出最好的分区数,甚至可能是“1”。查看StorageLevel
文档以获取其他持久性选项,例如MEMORY_AND_DISK_SER
,它将同时保留在内存和磁盘中。
在回答第一个问题时,是的,我认为 Spark 需要在持久化之前在内存中创建整个 DataFrame。如果你得到“OutOfMemory”,那可能是关键的障碍。你没有说你是如何创造它的。也许有一些解决方法,比如创建并保存成更小的部分,通过序列化保存到 memory_and_disk,然后组合这些部分。
【讨论】:
以上是关于Spark SQL createDataFrame() 引发 OutOfMemory 异常的主要内容,如果未能解决你的问题,请参考以下文章
在 SPARK 2.1 中传递包含 ArrayType 列的 javaRDD 时,createDataFrame() 抛出异常
Scala Spark - 调用 createDataFrame 时获取重载方法