【问题标题】:How to run Apache Spark applications with a JAR dependency from AWS S3?如何使用来自 AWS S3 的 JAR 依赖项运行 Apache Spark 应用程序?
【发布时间】:2023-01-05 02:03:21
【问题描述】:

我有一个 .jar 文件,其中包含对位于 AWS S3 存储桶中的应用程序有用的函数,我想将它用作 Spark 中的依赖项,而不必先在本地下载它。是否可以使用spark-submit(或pyspark--jars选项直接引用.jar文件?

到目前为止,我已经尝试了以下方法:

spark-shell --packages com.amazonaws:aws-java-sdk:1.12.336,org.apache.hadoop:hadoop-aws:3.3.4 --jars s3a://bucket/path/to/jar/file.jar

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 变量设置正确,因为在不带 --jars 选项的情况下运行相同命令时,可以成功读取同一存储桶中的其他文件。但是,如果添加该选项,我会收到以下错误:

Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2688)
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3431)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3466)
    at org.apache.hadoop.fs.FileSystem.access$300(FileSystem.java:174)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3574)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3521)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:540)
    at org.apache.spark.util.DependencyUtils$.resolveGlobPath(DependencyUtils.scala:317)
    at org.apache.spark.util.DependencyUtils$.$anonfun$resolveGlobPaths$2(DependencyUtils.scala:273)
    at org.apache.spark.util.DependencyUtils$.$anonfun$resolveGlobPaths$2$adapted(DependencyUtils.scala:271)
    at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:293)
    at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
    at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:38)
    at scala.collection.TraversableLike.flatMap(TraversableLike.scala:293)
    at scala.collection.TraversableLike.flatMap$(TraversableLike.scala:290)
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:108)
    at org.apache.spark.util.DependencyUtils$.resolveGlobPaths(DependencyUtils.scala:271)
    at org.apache.spark.deploy.SparkSubmit.$anonfun$prepareSubmitEnvironment$4(SparkSubmit.scala:364)
    at scala.Option.map(Option.scala:230)
    at org.apache.spark.deploy.SparkSubmit.prepareSubmitEnvironment(SparkSubmit.scala:364)
    at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:901)
    at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:203)
    at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:90)
    at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1046)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1055)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2592)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2686)
    ... 27 more

我正在使用为 Apache Hadoop 3.3 及更高版本预构建的 Spark 3.3.1。

【问题讨论】:

    标签: java scala apache-spark amazon-s3


    【解决方案1】:

    要从 Amazon S3 运行具有 JAR 依赖项的 Apache Spark 应用程序,您可以使用 --jars 命令行选项在提交 Spark 应用程序时指定 JAR 文件的 S3 URL。

    例如,如果你的JAR文件存放在my-bucket S3 bucket中,路径为jars/my-jar.jar,你可以通过如下方式提交Spark应用:

    spark-submit --jars s3a://my-bucket/jars/my-jar.jar 
      --class com.example.MySparkApp 
      s3a://my-bucket/my-spark-app.jar
    

    这将从 S3 下载 JAR 文件并将其添加到 Spark 应用程序的类路径中。

    请注意,您需要在 S3 URL 中包含 s3a:// 前缀才能使用 s3a 文件系统连接器,这是用于读取和写入 S3 的推荐连接器。您可能还需要使用 AWS 访问密钥和秘密密钥配置 fs.s3a.access.key 和 fs.s3a.secret.key 属性,以便验证与 S3 的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      相关资源
      最近更新 更多