S3A FileSystem上的Spark History Server:ClassNotFoundException

Pet*_*sky 6 history scala amazon-s3 apache-spark

Spark可以使用Hadoop S3A文件系统org.apache.hadoop.fs.s3a.S3AFileSystem.通过添加以下内容conf/spark-defaults.conf,我可以获得spark-shell来登录S3存储桶:

spark.jars.packages               net.java.dev.jets3t:jets3t:0.9.0,com.google.guava:guava:16.0.1,com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3
spark.hadoop.fs.s3a.impl          org.apache.hadoop.fs.s3a.S3AFileSystem
spark.eventLog.enabled            true
spark.eventLog.dir                s3a://spark-logs-test/
spark.history.fs.logDirectory     s3a://spark-logs-test/
spark.history.provider            org.apache.hadoop.fs.s3a.S3AFileSystem
Run Code Online (Sandbox Code Playgroud)

Spark History Server也从中加载配置conf/spark-defaults.conf,但似乎没有加载spark.jars.packages配置,并抛出ClassNotFoundException:

Exception in thread "main" java.lang.ClassNotFoundException: org.apache.hadoop.fs.s3a.S3AFileSystem
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.spark.util.Utils$.classForName(Utils.scala:225)
    at org.apache.spark.deploy.history.HistoryServer$.main(HistoryServer.scala:256)
    at org.apache.spark.deploy.history.HistoryServer.main(HistoryServer.scala)
Run Code Online (Sandbox Code Playgroud)

用于加载配置的Spark源代码在SparkSubmitArguments.scalaHistoryServerArguments.scala中是不同的,特别是HistoryServerArguments似乎不加载包.

有没有办法将org.apache.hadoop.fs.s3a.S3AFileSystem依赖项添加到历史记录服务器?

Pet*_*sky 7

做了一些挖掘并弄明白了.这是错的:

  1. 可以添加S3A所需的JAR $SPARK_HOME/jars(如SPARK-15965中所述)

  2. 这条线

    spark.history.provider     org.apache.hadoop.fs.s3a.S3AFileSystem
    
    Run Code Online (Sandbox Code Playgroud)

    $SPARK_HOME/conf/spark-defaults.conf会引起

    Exception in thread "main" java.lang.NoSuchMethodException: org.apache.hadoop.fs.s3a.S3AFileSystem.<init>(org.apache.spark.SparkConf)
    
    Run Code Online (Sandbox Code Playgroud)

    例外.如本答案所示,可以安全地删除该行.

总结一下:

我将以下JAR添加到$SPARK_HOME/jars:

  • jets3t-0.9.3.jar(可能已经存在你预先构建的Spark二进制文件,似乎无关紧要哪个0.9.x版本)
  • guava-14.0.1.jar(可能已经存在你预先构建的Spark二进制文件,似乎无关紧要哪个14.0.x版本)
  • aws-java-sdk-1.7.4.jar(必须是1.7.4)
  • hadoop-aws.jar(版本2.7.3)(可能应该与Spark版本中的Hadoop版本相匹配)

并添加此行 $SPARK_HOME/conf/spark-defaults.conf

spark.history.fs.logDirectory     s3a://spark-logs-test/
Run Code Online (Sandbox Code Playgroud)

您需要一些其他配置才能首先启用日志记录,但是一旦S3存储桶具有日志,这是历史服务器所需的唯一配置.