1. 程式人生 > >spark 讀取mongodb失敗,報executor time out 和GC overhead limit exceeded 異常

spark 讀取mongodb失敗,報executor time out 和GC overhead limit exceeded 異常

資源 base for read 就是 conn context mon getc

代碼:

import com.mongodb.spark.config.ReadConfig
import com.mongodb.spark.sql._
val config = sqlContext.sparkContext.getConf
.set("spark.mongodb.keep_alive_ms", "15000")
.set("spark.mongodb.input.uri", "mongodb://10.100.12.14:27017")
.set("spark.mongodb.input.database", "bi")
.set("spark.mongodb.input.collection", "userGroupMapping")
val readConfig 
= ReadConfig(config) val objUserGroupMapping = sqlContext.read .format("com.mongodb.spark.sql") .mongo(readConfig) objUserGroupMapping.printSchema() val tbUserGroupMapping=objUserGroupMapping.toDF() tbUserGroupMapping.registerTempTable("userGroupMapping") select _id,c,g,n,rn,t,ut from userGroupMapping where ut
>‘2018-05-02‘ limit 100

使用上述的代碼取userGroupMapping 集合過後的100條記錄,出現了executor time out 和GC overhead limit exceeded 異常。一開始以為推測是task 從mongodb取的數據太大,導致spark executor內存不夠,後來調研了一下spark mongodb connector 在取數據的時候是條件下發的,也就是先從mongodb過濾再取回spark 內存,這樣的話就不會出現內存不夠的情況。後來在網上調研後,有一種說法是說task 太多,導致task gc的時候爭奪gc時間和內存資源(這個不是很清楚),根據這種說法,我把本來task core 從16個調成6個後再跑程序,居然不會報錯了。至於 具體原因還不是很清楚,先在這裏記錄一下。

spark 讀取mongodb失敗,報executor time out 和GC overhead limit exceeded 異常