【问题标题】:Missing SLF4J logger on spark workers火花工作者缺少 SLF4J 记录器
【发布时间】:2021-08-27 23:44:27
【问题描述】:

我正在尝试通过spark-submit 运行工作。

此作业导致的错误是:

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2625)
    at java.lang.Class.getMethod0(Class.java:2866)
    at java.lang.Class.getMethod(Class.java:1676)
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 6 more

不确定这是否重要,但我正在尝试在 Mesos 上的 Docker 容器中运行此作业。 Spark 是 1.61,Mesos 是 0.27.1,Python 是 3.5,Docker 是 1.11.2。我在客户端模式下运行。

这是我的spark-submit 声明的要点:

export SPARK_PRINT_LAUNCH_COMMAND=true
./spark-submit \
    --master mesos://mesos-blahblahblah:port \
    --conf spark.mesos.executor.docker.image=docker-registry:spark-docker-image \
    --conf spark.mesos.executor.home=/usr/local/spark \
    --conf spark.executorEnv.MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.dylib \
    --conf spark.shuffle.service.enabled=true \
    --jars ~/spark/lib/slf4j-simple-1.7.21.jar \
    test.py

test.py 的要点是它从 parquet 加载数据,按特定列对其进行排序,然后将其写回 parquet。

当我不断收到该错误时,我添加了 --jars 行(该错误未出现在我的驱动程序中 - 我浏览 Mesos 框架以查看每个 Mesos 任务中的 stderr 以找到它)

我也试过加--conf spark.executor.extraClassPath=http:some.ip:port/jars/slf4j-simple-1.7.21.jar

因为我注意到当我从上面运行spark-submit 时,它会输出

INFO SparkContext: Added JAR file:~/spark/lib/slf4j-simple-1.7.21.jar at http://some.ip:port/jars/slf4j-simple-1.7.21.jar with timestamp 1472138630497

但错误没有改变。有什么想法吗?

我找到了this link,这让我觉得这是一个错误。但此人尚未发布任何解决方案。

【问题讨论】:

  • 通常当我在 yarn 上提交申请时,我会使用 --jars--files 配置参数的组合,这似乎可行。
  • 你解决过这个错误吗?
  • @FGreg 不,我没有。

标签: apache-spark jar pyspark slf4j


【解决方案1】:

我遇到了同样的问题,并且还尝试在 Docker 上运行 Mesos/Spark/Python。

最终为我解决的问题是使用spark.executor.extraClassPath 配置选项将hadoop classpath 输出添加到Spark 执行器的类路径中。

我运行的完整命令是:

MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so \
${SPARK_HOME}/bin/pyspark --conf spark.master=mesos://mesos-master:5050 --driver-class-path $(${HADOOP_HOME}/bin/hadoop classpath) --conf spark.executor.extraClassPath=$(${HADOOP_HOME}/bin/hadoop classpath)

【讨论】:

    【解决方案2】:

    所以异常是正确的——提到的“slf4j-simple-1.7.21”jar 中不存在 org/slf4j/Logger:

    └── org
    └── slf4j
        └── impl
            ├── SimpleLogger$1.class
            ├── SimpleLogger.class
            ├── SimpleLoggerFactory.class
            ├── StaticLoggerBinder.class
            ├── StaticMDCBinder.class
            └── StaticMarkerBinder.class
    

    包含正确的 jar(尝试 slf4j-api-1.7.21.jar)

    (提示 - 您可以通过解压缩来简单地检查 jar 文件的内容)

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2012-10-08
      相关资源
      最近更新 更多