我正在尝试从SparkSQL作业中访问S3文件。我已经尝试了几篇文章中提供的解决方案,但似乎都没有起作用。可能是因为我的EC2集群运行了适用于Hadoop2.7的新版Spark2.0。
我是这样设置hadoop的:
sc.hadoopConfiguration.set("fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem")
sc.hadoopConfiguration.set("fs.s3a.awsAccessKeyId", accessKey)
sc.hadoopConfiguration.set("fs.s3a.awsSecretAccessKey", secretKey)
我使用sbt assembly构建了一个超级JAR,命令如下:
name := "test"
version := "0.2.0"
scalaVersion := "2.11.8"
libraryDependencies += "com.amazonaws" % "aws-java-sdk" % "1.7.4"
libraryDependencies += "org.apache.hadoop" % "hadoop-aws" % "2.7.3" excludeAll(
ExclusionRule("com.amazonaws", "aws-java-sdk"),
ExclusionRule("commons-beanutils")
)
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.0" % "provided"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.0.0" % "provided"
当我将作业提交到集群时,总是会出现以下错误:
异常线程“main”org.apache.spark.SparkException:由于阶段失败而中止作业:阶段0.0中的任务0失败了4次,最新的故障:在阶段0.0中丢失了任务0.3(TID 6,172.31.7.246):java.lang.RuntimeException:java.lang.ClassNotFoundException:未找到类org.apache.hadoop.fs.s3a.S3AFileSystem 在org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195)处 在org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2638)处 在org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2651)处 在org.apache.hadoop.fs.FileSystem.access $ 200(FileSystem.java:92)时 在org.apache.hadoop.fs.FileSystem $ Cache.getInternal(FileSystem.java:2687)处 在org.apache.hadoop.fs.FileSystem $ Cache.get(FileSystem.java:2669)处 在org.apache.hadoop.fs.FileSystem.get(FileSystem.java:371)时 在org.apache.spark.util.Utils $ .getHadoopFileSystem(Utils.scala:1726)时 在org.apache.spark.util.Utils $ .doFetchFile(Utils.scala:662)时 在org.apache.spark.util.Utils $ .fetchFile(Utils.scala:446)时 在org.apache.spark.executor.Executor $$ anonfun $ org $ apache $ spark $ executor $ Executor $$ updateDependencies $ 3.apply(Executor.scala:476)
看起来驱动程序可以从S3读取,但是工作者/执行程序不能...我不明白为什么我的uberjar不足够。
然而,我也尝试了以下配置spark-submit,但没有成功:
--packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3
PS:如果我切换到s3n协议,则会出现以下异常:
java.io.IOException:方案没有文件系统:s3n
sc.addFile(s3://pathToLibrary.so)
将库添加到Spark上下文中,然后使用System.load(SparkFiles.get(Library.so))
进行加载。 - elldekaa