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 sql

在 SPARK 2.1 中传递包含 ArrayType 列的 javaRDD 时,createDataFrame() 抛出异常

spark 从RDD createDataFrame 的坑

Scala Spark - 调用 createDataFrame 时获取重载方法

Spark createDataFrame(df.rdd, df.schema) vs checkPoint 打破血统

Spark sql连接两个没有主键的数据帧