Pandas到PySpark给出OOM错误而不是溢出到磁盘

时间:2017-09-18 17:58:48

标签: python-2.7 apache-spark pyspark rdd

我有一个用例,我希望迭代地将数据加载到Pandas数据帧中,使用外部函数(即xgboost,未在示例代码中显示)进行一些处理,然后将结果推送到单个PySpark对象(RDD或DF)。

在将数据存储为RDD或Dataframe时,我试图让PySpark溢出到磁盘,而源是Pandas DataFrame。似乎没有什么工作,我一直在崩溃Java驱动程序,我无法加载我的数据。或者,我已经尝试加载我的数据而不处理只使用基本的textFile RDD,它就像一个魅力。我想知道这是否是PySpark错误,或者是否有解决方法。

示例代码:

from pyspark import SparkContext
from pyspark.sql import SQLContext
import pandas as pd
import pyspark

try:
    SparkContext.stop(sc)
except NameError:
    1

SparkContext.setSystemProperty('spark.executor.memory', '200g')
SparkContext.setSystemProperty('spark.driver.memory', '200g')
sc = SparkContext("local", "App Name")
sql_sc = SQLContext(sc)

chunk_100k = pd.read_csv("CData.csv", chunksize=100000)
empty_df = pd.read_csv("CData.csv", nrows=0)
infer_df = pd.read_csv("CData.csv", nrows=10).fillna('')
my_schema = SQLContext.createDataFrame(sql_sc, infer_df).schema

SparkDF = SQLContext.createDataFrame(sql_sc, empty_df, schema=my_schema)

for chunk in chunk_100k:
    SparkDF = SparkDF.union(SQLContext.createDataFrame(sql_sc, chunk, schema=my_schema))

经过几次迭代后崩溃:

  

Py4JJavaError:调用时发生错误   Z:org.apache.spark.api.python.PythonRDD.readRDDFromFile。 :   java.lang.OutOfMemoryError:Java堆空间

直接加载到RDD代码:

my_rdd = sc.textFile("CData.csv") \
.map(lambda line: line.split(",")) \
.filter(lambda line: len(line)>1) \
.map(lambda line: (line[0],line[1]))

更新

我已经更改了代码以在加载到Spark DataFrames而不是RDD时演示失败,请注意问题仍然存在且错误消息仍然引用RDD。 在更改示例代码之前,由于以下原因,在使用“parallelize”时,发现保存到RDD至少存在问题:

Why does SparkContext.parallelize use memory of the driver?

1 个答案:

答案 0 :(得分:-1)

在apache-spark / 1.5.1 / libexec / conf /中的文件中创建一个spark-defaults.conf文件,并在其中添加以下行: spark.driver.memory 45G spark.driver.maxResultSize 10G