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

标签 apache-spark amazon-s3

我已将自爆 jar 添加到spark/jars路径中。

  • 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

在 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.S3AFileSystem.initialize(S3AFileSystem.java:287) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
at 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) at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:229) at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:315) at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:202)
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) at org.apache.spark.rdd.RDD.partitions(RDD.scala:250) at 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) at org.apache.spark.rdd.RDD.partitions(RDD.scala:250) at org.apache.spark.SparkContext.runJob(SparkContext.scala:1958) at org.apache.spark.rdd.RDD.count(RDD.scala:1157) ... 48 elided

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

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

最佳答案

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 time 不会破坏任何东西。哦,如果您查看 Spark Master,并使用 -Phadoop-cloud 配置文件进行构建,它会提取正确的内容来正确设置 Spark 的依赖项。

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

关于apache-spark - Spark 使用 sc.textFile ("s3a://bucket/filePath"读取 s3 )。 java.lang.NoSuchMethodError : com. amazonaws.services.s3.transfer.TransferManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43929025/

相关文章:

apache-spark - 如何以编程方式获取 Pyspark 中的日志级别

java - MicroBatchExecution : Query terminated with error UnsatisfiedLinkError: org. apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

amazon-web-services - 使用 GitHub Flavored Markdown 显示来自 AWS S3 的图像

amazon-s3 - 从 Windows Server 自动执行 Amazon S3 备份的工具

amazon-web-services - 从 S3 迁移到 Redshift 数据库时如何删除标题行?

sql - 存储大型城市以进行自动完成查询的最佳方式是什么?

apache-spark - 将可为空的列作为参数传递给 Spark SQL UDF

scala - Apache Spark、范围连接、数据倾斜和性能

python - 正确编码 sc.textFile 数据 (python 2.7)

Symfony2 : Using the Finder Component for S3