数据帧上的Scala Spark迭代操作导致OoM-和其他错误

时间:2018-11-02 14:39:40

标签: scala apache-spark zip rdd

我有20列和25条记录的数据框(小的标准数据。文件大小= 7KB)。我需要在数据帧中执行多个操作。循环可以在几秒钟内正常工作。问题是完成时,我尝试将show()或将数据写入磁盘时,我的CPU处于高内存状态持续了很多分钟(15-20分钟)。很多时候,我遇到stackoverflow或内存不足错误。

我的main()方法如下:

val spark = get_spark()
val i_file = args(1)
val df = spark.read
  .format("csv")
  .option("delimiter", ",")
  .option("header", true)
  .option("inferSchema","true")
  .option("timestampFormat", "yyyy/MM/dd HH:mm:ss")
  .load(i_file)

var s_df = something.calculate(spark,df)


/////////problem starts here ///////////
s_df.repartition(col("cluster_id"))    //tried without repartition also
  .write.mode("overwrite")
  .option("header", "true").csv("C:\\Workspace\\data\\out.csv")    

还有我的calculate()方法:

def calculate(spark: SparkSession, df: DataFrame): DataFrame = {
  var newdf = init(spark, df) //some initialization on the dataframe
  val t_count = 100
  var t_i = 0
  newdf.rdd.cache()
  while (t_i < t_count) {
    if(some codition){
      newdf = calculate_type1(spark, newdf)
    }else{
      newdf = calculate_type2(spark, newdf)
    }
    t_i = t_i + 1
    if(t_i === 50){
      newdf.rdd.checkpoint()
    }
  }
  return newdf
}

我的分析

  1. 注意到它可以使用更少的循环,例如t_count = 2,一切正常。

  2. 我相信问题在于,火花将图形保留在内存中, 尝试处理图形以生成最终数据帧。

  3. 我正在使用不正确的var,因此我应该使用val和 使用左折或zip更新原始rdd。但是我很努力 接着就,随即。有人可以帮忙吗?非常感谢!!!

  4. 我需要检查站吗?我看不到有任何用途

0 个答案:

没有答案