我应该如何从自定义spark jar登录

1l5u6lss  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(396)

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的建议都将不胜感激。

twh00eeo

twh00eeo1#

正如您所说,“sbt assembly”将把所有依赖项都包含到您的jar中。
如果您想使用特定的两个选项:
下载logback core和logback classic并将它们添加到-jarspark2 submit命令中
在--packages spark2 submit选项中指定上述deps

相关问题