我已经将自动罐子添加到spark / jars路径。
在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
" java.lang.NoSuchMethodError:com.amazonaws.services.s3.transfer.TransferManager"是由不匹配的罐子引起的? (hadoop-aws,aws-java-sdk)
要从Spark应用程序访问存储在Amazon S3中的数据,应使用Hadoop文件API。那么hadoop-aws.jar包含Hadoop文件APIS还是必须运行hadoop env?
答案 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;假设发货版本将是最新版本。