Pyspark:序列化任务超过了所允许的最大值。考虑增加spark.rpc.message.maxSize或将广播变量用于较大的值

时间:2019-01-31 10:47:03

标签: dataframe pyspark message rpc max-size

我正在集群上进行计算,最后,当我使用df.describe()。show()询问Spark数据框的摘要统计信息时,出现错误:

序列化任务15:0为137500581字节,超过了允许的最大值:spark.rpc.message.maxSize(134217728字节)。考虑增加spark.rpc.message.maxSize或对较大的值使用广播变量

在我的Spark配置中,我已经尝试增加上述参数:

spark = (SparkSession
         .builder
         .appName("TV segmentation - dataprep for scoring")
         .config("spark.executor.memory", "25G")
         .config("spark.driver.memory", "40G")
         .config("spark.dynamicAllocation.enabled", "true")
         .config("spark.dynamicAllocation.maxExecutors", "12")
         .config("spark.driver.maxResultSize", "3g")
         .config("spark.kryoserializer.buffer.max.mb", "2047mb")
         .config("spark.rpc.message.maxSize", "1000mb")
         .getOrCreate())

我还尝试使用以下方法重新划分数据框:

dfscoring = dfscoring.repartition(100)

但是我仍然继续遇到相同的错误。

我的环境:Python 3.5,Anaconda 5.0,Spark 2

如何避免此错误?

3 个答案:

答案 0 :(得分:2)

我也遇到麻烦,然后我解决了。 原因是spark.rpc.message.maxSize,如果默认设置为128M,则可以在启动Spark客户端时更改它,我正在pyspark中工作并将其值设置为1024,所以我这样写:

pyspark --master yarn --conf spark.rpc.message.maxSize=1024

解决它。

答案 1 :(得分:1)

我遇到了同样的问题,这浪费了我一生中从未有过的日子。我不确定为什么会这样,但是这就是我如何使其成功。

步骤1:确保正确设置了PYSPARK_PYTHON和PYSPARK_DRIVER_PYTHON。 事实证明,worker(2.6)中的python版本与driver(3.6)中的版本不同。您应该检查是否正确设置了环境变量PYSPARK_PYTHON和PYSPARK_DRIVER_PYTHON。

我通过在Jupyter中将我的内核从Python 3 Spark 2.2.0切换到Python Spark 2.3.1来修复了它。您可能需要手动设置。这是确保您的PySpark正确设置的方法https://mortada.net/3-easy-steps-to-set-up-pyspark.html

步骤2:如果不起作用,请尝试解决该问题: 此内核开关适用于DF,而我未在其中添加任何列: spark_df-> panda_df-> back_to_spark_df ....但是它在我添加了5个额外列的DF上不起作用。 因此,我尝试了以下工作,并且奏效了:

# 1. Select only the new columns: 

    df_write = df[['hotel_id','neg_prob','prob','ipw','auc','brier_score']]


# 2. Convert this DF into Spark DF:



     df_to_spark = spark.createDataFrame(df_write)
     df_to_spark = df_to_spark.repartition(100)
     df_to_spark.registerTempTable('df_to_spark')


# 3. Join it to the rest of your data:

    final = df_to_spark.join(data,'hotel_id')


# 4. Then write the final DF. 

    final.write.saveAsTable('schema_name.table_name',mode='overwrite')

希望有帮助!

答案 2 :(得分:0)

我有同样的问题,但使用Watson Studio。我的解决方案是:

sc.stop()
configura=SparkConf().set('spark.rpc.message.maxSize','256')
sc=SparkContext.getOrCreate(conf=configura)
spark = SparkSession.builder.getOrCreate()

我希望它可以帮助某人...