Spark程序排错 DAG Scheduler StackOverflowError
场景
最近在工作中遇到新的数据ETL场景:
数据部分在MySQL库中,主要的细节日志数据使用URL方式存储在阿里云OSS中存储,
需要把所有日志数据读出来存储到数据仓库中(日志数据存储方式涉及到私有化部署一些问题导致)。
代码如下
val dataArr = logInfo
.filter(row => {
val url = row.getAs[String]("feedback_data")
val valid = row.getAs[String]("valid")
val homework_id = row.getAs[String]("resource_assign_id")
valid == "1" && homework_id != null && url != null && UrlUtil.isUrlHttp(url)
})
.map(row => {
// 获取Mysql中的各属性值
var url: String = row.getAs[String]("feedback_data")
var student_id: String = row.getAs[String]("student_id")
var homework_id: String = row.getAs[String]("resource_assign_id")
// 使用URL工具类将 http请求的url转换为OSS的路径格式
var ossurl = UrlUtil.HttpUrlReplaceToOSS(url)
(ossurl, url, student_id, homework_id)
})
.collect()
val rddlists = ArrayBuffer[RDD[LogData]]()
for (tp <- homework) {
// OSS文件路径
val filePath = tp._1
// 其他属性值
//....
// 结合笔记数据与维度表 整合成源数据的格式
val rawData = sc.textFile(filePath).map(str => {
val datas: Array[String] = str.split(" ")
// ....
LogData(feedback_data,homework_id,...)
})
rddlists.append(rawData)
}
//rddlists中的文件路径转化的rdd大约500+,将所有RDD 结合成一个RDD
val alldatardd: RDD[LogData] = rddlists.reduceLeft((a, b) => a.union(b))
val logdatadf = alldatardd.toDF().createOrReplaceTempView("log_data")
结果
java.lang.StackOverflowError
被 Driver stacktrace 迷惑了,以为是在Driver端爆出的异常, 不管怎么加
–conf spark.driver.extraJavaOptions="-Xss100M"
还是一样出错
然后就去查资料 有一篇博客提醒使用 sparkSession.sparkContext.union(Seq(RDD[]))
或者增加
–conf spark.executor.extraJavaOptions="-Xss100M"
程序完美运行。。。
具体内容待调研