首页 文章

Spark使用sc.textFile(“s3a:// bucket / filePath”)读取s3 . java.lang.NoSuchMethodError:com.amazonaws.services.s3.transfer.TransferManager

提问于
浏览
2

我已经为spark / jars路径添加了自爆 jar .

  • hadoop-aws-2.7.3.jar

  • aws-java-sdk-s3-1.11.126.jar

  • aws-java-sdk-core-1.11.126.jar

  • spark-2.1.0

In spark-shell

scala> sc.hadoopConfiguration.set("fs.s3a.access.key", "***")

scala> sc.hadoopConfiguration.set("fs.s3a.secret.key", "***")

scala> val f = sc.textFile("s3a://bucket/README.md")

scala> f.count

java.lang.NoSuchMethodError:com.amazonaws.services.s3.transfer.TransferManager . (Lcom / amazonaws / services / s3 / AmazonS3; Ljava / util / concurrent / ThreadPoolExecutor;)V at org.apache.hadoop.fs.s3a位于org.apache.hadoop.fs.Fs上的orS.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669)的.S3AFileSystem.initialize(S3AFileSystem.java:287)$ 200(FileSystem.java:94) org.apache.hadoop.fs.FileSystem $ Cache.getInternal(FileSystem.java:2703)org.apache.hadoop.fs.FileSystem $ Cache.get(FileSystem.java:2685)org.apache.hadoop.fs .FileSystem.get(FileSystem.java:373)位于org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:258)的org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) Org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:229)位于org.apache.spark.rdd.HadoopRDD.getPartitions的org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:315) HadoopRDD.scala:202)在org.apache.spark.rdd.RDD $$ anonfu n $分区$ 2.apply(RDD.scala:252)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:250)at scala.Option.getOrElse(Option.scala:121) )org.apache.spark.rdd.RDD.partitions(RDD.scala:250)org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)at org.apache.spark.rdd.RDD $ $ anonfun $ partitions $ 2.apply(RDD.scala:252)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:250)at scala.Option.getOrElse(Option.scala: 121)org.apache.spark.rdd.RDD.partitions(RDD.scala:250)org.apache.spark.SparkContext.runJob(SparkContext.scala:1958)at org.apache.spark.rdd.RDD.count (RDD.scala:1157)...... 48被省略了

  • “java.lang.NoSuchMethodError:com.amazonaws.services.s3.transfer.TransferManager”是由不匹配的jar引发的? (hadoop-aws,aws-java-sdk)

  • 要从Spark应用程序访问存储在Amazon S3中的数据,应使用Hadoop文件API . 那么hadoop-aws.jar包含Hadoop文件APIS还是必须运行hadoop env?

1 回答

  • 8

    不匹配的JAR; AWS SDK在各个版本中非常脆弱 .

    Hadoop S3A代码在hadoop-aws JAR中;也需要hadoop-common . Hadoop 2.7是针对AWS S3 SDK 1.10.6构建的 . (*更新:不,它是1.7.4 . 转移到1.10.6进入Hadoop 2.8)HADOOP-12269

    您必须使用该版本 . 如果你想使用1.11 JAR,那么你需要检查hadoop源代码树并自己构建branch-2 . 好消息:使用着色的AWS SDK,因此其版本的jackson和joda时间不会破坏 . 哦,如果你查看spark master,并使用 -Phadoop-cloud profile进行构建,它会将正确的内容设置为正确的Spark依赖项 .

    更新:2017年10月1日:Hadoop 2.9.0-alpha和3.0-beta-1使用1.11.199;假设发货版本将是最新版本 .

相关问题