【问题标题】:Spark 1.3.1: cannot read file from S3 bucket, org/jets3t/service/ServiceExceptionSpark 1.3.1:无法从 S3 存储桶读取文件,org/jets3t/service/ServiceException
【发布时间】:2015-08-05 10:26:11
【问题描述】:

我在 AWS EC2 VM (Ubuntu 14.04) 上,愿意在我的 S3 文件中的 RDD 上使用 Spark 做一些基础知识。在成功运行这个脏命令时(暂时不使用sparkContext.hadoopConfiguration

scala> val distFile = sc.textFile("s3n://< AWS_ACCESS_KEY_ID>:<AWS_SECRET_ACCESS_KEY>@bucketname/folder1/folder2/file.csv")

然后在运行distFile.count() 时出现以下错误

java.lang.NoClassDefFoundError: org/jets3t/service/ServiceException
         at org.apache.hadoop.fs.s3native.NativeS3FileSystem.createDefaultStore(NativeS3FileSystem.java:334)
         at org.apache.hadoop.fs.s3native.NativeS3FileSystem.initialize(NativeS3FileSystem.java:324)
         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2596)
...
...
Caused by: java.lang.ClassNotFoundException: org.jets3t.service.ServiceException
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

以前有过

  • 使用相应的 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 定义了一个 AWS IAM 用户
  • 在 .bashrc 中添加了两个键的 export 作为环境变量
  • 使用SPARK_HADOOP_VERSION=2.6.0-cdh5.4.1 sbt/sbt assembly 构建了 Spark 1.3.1
  • 安装并运行 hadoop 2.6-cdh5.4.1(伪分布式)

它是否与 textFile("s3n// ...") 的语法有关?我尝试过其他人,包括 s3:// 没有成功...

谢谢

【问题讨论】:

    标签: amazon-ec2 amazon-s3 apache-spark hadoop2


    【解决方案1】:

    将 Jets3t jar 包含到您的类路径中。使用您当前的设置添加适当的兼容版本。您需要将 ServiceException 添加到您的类路径中。

    【讨论】:

    • 它有帮助!谢谢!
    • 你能解释一下如何做到这一点吗?我正在运行一个 jupyter 笔记本,它给出了同样的错误。
    【解决方案2】:

    我遇到了同样的问题。尽管它发生在 spark v2.1.0 和 hadoop v2.7.2 环境中,但是我把它留在这里,因为它是相同的原因。这就是我所拥有的。

    A needed class was not found. This could be due to an error in your runpath. Missing class: org/jets3t/service/ServiceException
    java.lang.NoClassDefFoundError: org/jets3t/service/ServiceException
    at      org.apache.hadoop.fs.s3native.NativeS3FileSystem.createDefaultStore(NativeS3FileSystem.java:342)
    at org.apache.hadoop.fs.s3native.NativeS3FileSystem.initialize(NativeS3FileSystem.java:332)
    at
    ...
    ...
     Caused by: java.lang.ClassNotFoundException: org.jets3t.service.ServiceException
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    

    这是因为类路径获得的 net.java.dev.jets3t:jets3t 依赖版本低于 org.apache.hadoop:hadoop-aws 所需的版本。

    我在 build.sbt 中添加 net.java.dev.jets3t:jets3t:0.9.0 后解决了这个问题

    【讨论】:

    • 你能告诉我在哪里可以找到 build.sbt 吗?
    【解决方案3】:

    您需要在 CLASSPATH 中包含 hadoop-mapreduce-client jar。就我而言,我使用这些依赖项制作了自己的分发版。

    我将以下文件放在lib文件夹中:

    • hadoop-mapreduce-client-jobclient-2.6.0.jar
    • hadoop-mapreduce-client-hs-plugins-2.6.0.jar
    • hadoop-mapreduce-client-shuffle-2.6.0.jar
    • hadoop-mapreduce-client-jobclient-2.6.0-tests.jar
    • hadoop-mapreduce-client-common-2.6.0.jar
    • hadoop-mapreduce-client-app-2.6.0.jar
    • hadoop-mapreduce-client-hs-2.6.0.jar
    • hadoop-mapreduce-client-core-2.6.0.jar

    【讨论】:

    • 嗨,在找到 jars 的位置后,我运行了这个命令 ./spark-1.3.1/bin/spark-shell -classpath /usr/local/hadoop/share/hadoop/mapreduce/*,但在运行 distFile.count() 时仍然得到完全相同的错误
    • 尝试将这些 jars 放入 Spark 的 lib 文件夹中。
    • 实际上我已经在 Spark 的文件夹 lib_managed/jars 中找到了这些 jar,所以我运行了 ./spark-1.3.1/bin/spark-shell -classpath spark-1.3.1/lib_managed/jars/*,但不幸的是仍然得到相同的 jets3t 错误:Caused by: java.lang.ClassNotFoundException: org.jets3t.service.S3ServiceException
    • 我还在线程“Spark-Shell:如何定义 JAR 加载顺序”之后使用了命令 spark-shell --jars $(echo /home/ubuntu/spark-1.3.1/lib_managed/jars/*.jar | tr ' ' ',') ,并得到了 same 错误。我还授予了我的 S3 文件的打开/上传权限,以防万一。
    猜你喜欢
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2022-06-28
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多