我正在做一个基于http://learningfrombigdata.com/semantic-similarity-between-sentences-using-apache-spark/的项目,对代码稍作修改
这是我的代码,其中spark失败(代码在第二个映射期间失败,其中距离是计算量很大的函数):
def distance(lvec: String, rvec: String): Double = {
val l = Vectors.dense(lvec.split(',').map(_.toDouble))
val r = Vectors.dense(rvec.split(',').map(_.toDouble))
math.sqrt(Vectors.sqdist(l, r))
}
val wordVectors = wordPairs.map({case (idx, (lword, rword)) => (rword, (idx, lword))})
.join(w2v)
.map({case (rword, ((idx, lword), rvec)) => (lword, (idx, rvec))})
.join(w2v)
.map({case (lword, ((idx, rvec), lvec)) => ((idx, lword), (lvec, rvec))})
.map({case ((idx, lword), (lvec, rvec)) => ((idx, lword), List(distance(lvec, rvec)))})
这是它去世的地方(思考了很久之后): https://imgur.com/a/yKXIO
我看了一下执行者正在做什么,并为失败的人发现了一些奇怪的GC时间:https://imgur.com/a/zWhjy
然后我启用了详细的GC并为执行程序编写了GC日志,以下是它们的外观: https://imgur.com/a/aAjJx
我对垃圾收集并不是很了解,所以我不太了解这个日志,但在我看来,它通常不应该经常做“Full GC”。
我想知道接下来应该尝试什么:
调整GC本身,如下所示:https://databricks.com/blog/2015/05/28/tuning-java-garbage-collection-for-spark-applications.html
调整火花参数(以下是我目前的参考资料):
重写代码
其他 - 如果我需要发布其他信息,请告诉我