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

时间:2017-05-12 03:53:52

标签: apache-spark amazon-s3

我已经将自动罐子添加到spark / jars路径。

  • Hadoop的AWS-2.7.3.jar
  • AWS-java的SDK-s3-1.11.126.jar
  • AWS-java的SDK-芯1.11.126.jar
  • 火花2.1.0

在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 /服务/ S3 / AmazonS3; Ljava / util的/并行/的ThreadPoolExecutor;)V   在   org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:287)   在   org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669)   在org.apache.hadoop.fs.FileSystem.access $ 200(FileSystem.java:94)at   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)at   org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)at   org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:258)   在   org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:229)   在   org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:315)   在org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:202)
  在org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:252)   在org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:250)   在scala.Option.getOrElse(Option.scala:121)at   org.apache.spark.rdd.RDD.partitions(RDD.scala:250)at   org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)   在org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:252)   在org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:250)   在scala.Option.getOrElse(Option.scala:121)at   org.apache.spark.rdd.RDD.partitions(RDD.scala:250)at   org.apache.spark.SparkContext.runJob(SparkContext.scala:1958)at at   org.apache.spark.rdd.RDD.count(RDD.scala:1157)... 48 elided

  1. " java.lang.NoSuchMethodError:com.amazonaws.services.s3.transfer.TransferManager"是由不匹配的罐子引起的? (hadoop-aws,aws-java-sdk)

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

1 个答案:

答案 0 :(得分:10)

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配置文件进行构建,它会提取正确的内容以正确设置Spark的依赖关系。

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