当前位置: 首页 > 知识库问答 >
问题:

Scala中的Apache Spark日志记录

冯玮
2023-03-14

我正在寻找一种解决方案,能够在Apache Spark节点上执行代码时记录额外的数据,这有助于调查稍后在执行过程中可能出现的一些问题。尝试使用传统的解决方案,例如com。打字安全。鳞片法。LazyLogging失败,因为无法在Apache Spark这样的分布式环境中序列化日志实例。

我已经研究了这个问题,现在我发现的解决方案是使用org.apache.spark.Logging特性如下:

class SparkExample with Logging {
  val someRDD = ...
  someRDD.map {
    rddElement => logInfo(s"$rddElement will be processed.")
    doSomething(rddElement)
  }
}

然而,日志特性似乎不是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()
 }

}

我看到的例外是:

线程"main"中的异常org.apache.spark.Spark异常:任务不可序列化-

共有3个答案

何玺
2023-03-14

如果需要在mapfilter或其他RDD函数之前和之后执行一些代码,请尝试使用mapPartition,其中显式传递基础迭代器。

例子:

val log = ??? // this gets captured and produced serialization error
rdd.map { x =>
  log.info(x)
  x+1
}

变成:

rdd.mapPartition { it =>
  val log = ??? // this is freshly initialized in worker nodes
  it.map { x =>
    log.info(x)
    x + 1
  }
}

每个基本的RDD函数总是使用mapPartition实现。

确保显式地处理分区程序,而不是松动它:请参见Scaladoc,保护分区参数,这对性能至关重要。

祁飞扬
2023-03-14

使用Log4j 2。x、 core logger已可序列化。问题解决了。

Jira讨论:https://issues.apache.org/jira/browse/LOG4J2-801

"org.apache.logging.log4j" % "log4j-api" % "2.x.x"

"org.apache.logging.log4j" % "log4j-core" % "2.x.x"

"org.apache.logging.log4j" %% "log4j-api-scala" % "2.x.x"
仲法
2023-03-14

您可以使用Akhil在
https://www.mail-archive.com/user@火花。阿帕奇。org/msg29010。html。我自己用过,效果很好。

Akhil Das Mon,2015年5月25日08:20:40-0700
试着这样做:

object Holder extends Serializable {      
   @transient lazy val log = Logger.getLogger(getClass.getName)    
}


val someRdd = spark.parallelize(List(1, 2, 3)).foreach { element =>
   Holder.log.info(element)
}
 类似资料:
  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 问题内容: 我正在考虑将Redis用于Web应用程序日志记录目的。我用谷歌搜索,有人将日志转储到Redis队列/列表中,然后将计划的工作人员转储到磁盘中。 http://nosql.mypopescu.com/post/8652869828/another-redis-use-case- centralized-logging 我希望寻求理解,为什么不直接使用Redis持久化到磁盘?如果我分配了一

  • logging 模块自 2.3 版以来一直是 Python 标准库的一部分。在 PEP 282 中有对它的简洁描述。除了 基础日志教程 之外,这些文档是非常难以阅读的。 日志记录一般有两个目的: 诊断日志 记录与应用程序操作相关的日志。例如,当用户遇到程序报错时, 可通过搜索诊断日志以获得上下文信息。 审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用

  • 问题内容: 我使用了tomcat,并简单地覆盖了默认的日志系统。如何在我的Spring应用程序中启用Wildfly上的Logback日志记录? 我在tomcat上的Logback.xml 问题答案: 您可以使用logback来配置应用程序中的日志记录。您不能使用logback为服务器配置日志记录。 要在配置中使用logback,您需要将更改为false或创建一个不包含子系统的。您还需要在部署中包括

  • 我需要一些帮助在Azure中记录Java应用: 1) 使用Azure作为PaaS,我创建了一个配置为使用Java8 Tomcat8的API应用程序。我正试图使用log4j2将应用程序日志记录与Tomcat日志(在一个单独的文件中)分开。据我所知,我有权限在D:\home中的任何地方写入。因此,我将尝试写入“d:\home\Logfiles\Application\”。因此,我创建了一个带有log4

  • 问题是它不在catalina- .log中记录,而是在catalina中记录。似乎没有正确配置appender。文件catalina似乎是从log4j.appender.catalina.file=${catalina.home}/logs/catalina创建的。在配置中。 有人能帮我解决这个问题吗?