我得到一个简单的火花应用程序。让我烦恼的是,在运行了大约10个小时后,驱动程序得到了3GB内存的错误,但实际上使用的是4.7GB。
我的逻辑非常简单:
首先获取所有文件路径并将其存储到名为Seq
的{{1}}中。
接下来,allpath
。 allpath.map(path => upsert(getStatistics(path))
函数用于计算该路径下文件的记录数,如下所示:
getStatistics
val parquetDF = sqlContext.read.parquet("/path/to/parquet/files")
parquetDF.register("tmp_table")
resDF.sqlContext.sql("select count(*) record_num from tmp_table").withColumn(...).withColumn(...)
函数旨在通过分区对mysql数据库中的目标表执行upsert
操作:
insert ... on duplicate key...
基本上,我找不到太多东西需要在整个程序中使用驱动程序端存储器。是否有任何其他原因导致使用过多的驱动程序端内存?欢迎任何建议。
PS: spark提交配置:
val sql = """insert into table ...... on duplicate key id = id"""
currentDF.foreachPartition(iter => {
val state = create statement
while(iter.hasNext) {
val row = iter.next()
state.addBatch(sql.format(...))
}
state.executeBatch()
})