scala/jvmnoob希望更多地了解日志记录,特别是在使用apachespark时。
我在scala中编写了一个库,它依赖于一堆spark库,以下是我的依赖项:
import sbt._
object Dependencies {
object Version {
val spark = "2.2.0"
val scalaTest = "3.0.0"
}
val deps = Seq(
"org.apache.spark" %% "spark-core" % Version.spark,
"org.scalatest" %% "scalatest" % Version.scalaTest,
"org.apache.spark" %% "spark-hive" % Version.spark,
"org.apache.spark" %% "spark-sql" % Version.spark,
"com.holdenkarau" %% "spark-testing-base" % "2.2.0_0.8.0" % "test",
"ch.qos.logback" % "logback-core" % "1.2.3",
"ch.qos.logback" % "logback-classic" % "1.2.3",
"com.typesafe.scala-logging" %% "scala-logging" % "3.8.0",
"com.typesafe" % "config" % "1.3.2"
)
val exc = Seq(
ExclusionRule("org.slf4j", "slf4j-log4j12")
)
}
(无可否认,我从其他地方复制了很多)。
我可以使用 sbt package
然后我可以通过把jar放进 ${SPARK_HOME}/jars
. 这很有效。
我现在想从我的代码实现日志记录,所以我这样做:
import com.typesafe.scalalogging.Logger
/*
* stuff stuff stuff
*/
val logger : Logger = Logger("name")
logger.info("stuff")
但是,当我尝试调用我的库(我是从python做的,我认为这与此无关)时,我得到一个错误:
py4j.protocol.py4jjavaerror:调用z:com.company.package.class.function时出错。
e:java.lang.noclassdeffounderror:com/typesafe/scalalogging/logger$
显然这是因为 com.typesafe.scala-logging
图书馆不在我的jar里。我知道我可以用 Package 来解决这个问题 sbt assembly
但我不想这样做,因为它将包含所有其他依赖项,并导致我的jar非常庞大。
有没有一种方法可以选择性地包含库( com.typesafe.scala-logging
在这种情况下)在我的jar?或者,我是否应该尝试使用另一种方法进行日志记录,或者使用spark附带的记录器?
感谢评论中的pasha701,我尝试使用 sbt assembly
而不是 sbt package
.
import sbt._
object Dependencies {
object Version {
val spark = "2.2.0"
val scalaTest = "3.0.0"
}
val deps = Seq(
"org.apache.spark" %% "spark-core" % Version.spark % Provided,
"org.scalatest" %% "scalatest" % Version.scalaTest,
"org.apache.spark" %% "spark-hive" % Version.spark % Provided,
"org.apache.spark" %% "spark-sql" % Version.spark % Provided,
"com.holdenkarau" %% "spark-testing-base" % "2.2.0_0.8.0" % "test",
"ch.qos.logback" % "logback-core" % "1.2.3",
"ch.qos.logback" % "logback-classic" % "1.2.3",
"com.typesafe.scala-logging" %% "scala-logging" % "3.8.0",
"com.typesafe" % "config" % "1.3.2"
)
val exc = Seq(
ExclusionRule("org.slf4j", "slf4j-log4j12")
)
}
不幸的是,即使将spark依赖项指定为 Provided
我的jar从324k到12m,所以我选择了使用 println()
相反。以下是我的提交消息:
使用println记录
我选择了println选项,因为它保持了jar的小尺寸。
我试用了com.typesafe.scalalogging.logger,但测试失败,出现错误:
java.lang.noclassdeffounderror:com/typesafe/scalalogging/logger
因为它没有Spark。我尝试使用sbt assembly而不是sbt包,但这导致jar的大小从324k变为12m,即使spark dependencies设置为provided。一个1200万的jar不值得仅仅使用scalalogg来权衡,因此使用println代替。
我注意到pasha701建议使用log4j,因为它提供了spark,所以我将在下一步尝试。在编写spark库时,任何有关使用scala提供的log4j的建议都将不胜感激。
1条答案
按热度按时间twh00eeo1#
正如您所说,“sbt assembly”将把所有依赖项都包含到您的jar中。
如果您想使用特定的两个选项:
下载logback core和logback classic并将它们添加到-jarspark2 submit命令中
在--packages spark2 submit选项中指定上述deps