【发布时间】:2015-05-26 08:38:32
【问题描述】:
我正在寻找一种能够在 Apache Spark 节点上执行代码时记录额外数据的解决方案,以帮助稍后调查执行期间可能出现的一些问题。尝试使用传统解决方案(例如 com.typesafe.scalalogging.LazyLogging)会失败,因为无法在 Apache Spark 等分布式环境上序列化日志实例。
我已经调查过这个问题,目前我发现的解决方案是使用 org.apache.spark.Logging 特征,如下所示:
class SparkExample with Logging {
val someRDD = ...
someRDD.map {
rddElement => logInfo(s"$rddElement will be processed.")
doSomething(rddElement)
}
}
但是,Logging trait 似乎不是 Apache Spark 的永久解决方案,因为它被标记为 @DeveloperApi 并且类文档提到:
这可能会在未来的版本中更改或删除。
我想知道 - 它们是否是我可以使用的任何已知日志记录解决方案,并且允许我在 Apache Spark 节点上执行 RDD 时记录数据?
@Later Edit :下面的一些 cmets 建议使用 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()
}
}
我看到的例外是:
线程 "main" org.apache.spark.SparkException 中的异常:任务不可序列化 -> 原因:java.io.NotSerializableException: org.apache.log4j.Logger
【问题讨论】:
-
嗯...配置您的 log4j 并完成您的日志记录。
-
所以基本上 Apache Spark 强制你只使用 log4j ?
-
Fwiw,log4j的正确拼写是“slf4j”。
-
除了 / 作为日志记录的替代方案之外,指标可能会为您提供您想要的:spark.apache.org/docs/latest/monitoring.html
-
@michael_n 这不正确。 log4j 和 slf4j 是不同的东西。
标签: scala logging apache-spark