我正在寻找一种解决方案,在执行Apache Spark节点上的代码时能够记录附加数据,以便在执行过程中出现问题时进行调查。尝试使用传统解决方案(例如com.typesafe.scalalogging.LazyLogging
)会失败,因为像Apache Spark这样的分布式环境无法序列化日志实例。
我已经研究了这个问题,目前我找到的解决方案是使用org.apache.spark.Logging
trait,如下所示:
class SparkExample with Logging {
val someRDD = ...
someRDD.map {
rddElement => logInfo(s"$rddElement will be processed.")
doSomething(rddElement)
}
}
然而,看起来Logging特征对于Apache Spark并非长久之计,因为它被标记为@DeveloperApi
并且类文档中提到:
在未来版本中可能会更改或删除此功能。
我想知道是否有任何已知的日志记录解决方案,可以让我在Apache Spark节点上执行RDD时记录数据?
@后续编辑: 下面的一些评论建议使用Log4J。 我尝试使用Log4J,但是当我从Scala类(而不是Scala对象)使用记录器时仍然遇到问题。 这是我的完整代码:
import org.apache.log4j.Logger
import org.apache.spark._
object Main {
def main(args: Array[String]) {
new LoggingTestWithRDD().doTest()
}
}
class LoggingTestWithRDD extends Serializable {
val log = Logger.getLogger(getClass.getName)
def doTest(): Unit = {
val conf = new SparkConf().setMaster("local[4]").setAppName("LogTest")
val spark = new SparkContext(conf)
val someRdd = spark.parallelize(List(1, 2, 3))
someRdd.map {
element =>
log.info(s"$element will be processed")
element + 1
}
spark.stop()
}
我看到的异常是:
Exception in thread "main" org.apache.spark.SparkException: Task not serializable -> Caused by: java.io.NotSerializableException: org.apache.log4j.Logger