我正在尝试从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程序集构建了一个uber 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:class 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(文件系统)。java:2651)在org.apache.hadoop.fs.filesystem.access$200(文件系统)。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$$updateDependences$3.apply(executor。scala:476)
似乎驱动程序能够毫无问题地从s3读取数据,但工人/执行者却不能。。。我不明白为什么我的uberjar不够。
但是,我也尝试使用以下方法配置spark submit,但没有成功:
--包裹com。amazonaws:aws-java-sdk:1.7.4,org.apache。hadoop:hadoop-aws:2.7.3
ps:如果我切换到s3n协议,我会遇到以下异常:
java.io.ioexception:scheme:s3n没有文件系统
2条答案
按热度按时间8iwquhpp1#
实际上,spark的所有操作都是针对工人的。然后在master上设置这些配置,这样一旦您可以尝试在mappartition{}上应用s3的配置
shyt4zoc2#
如果你想用
s3n
:现在,关于这个异常,您需要确保两个jar都位于驱动程序和工作类路径上,并且如果您通过
--jars
标志:另外,如果你正在构建你的uberjar,包括
aws-java-sdk
以及hadoop-aws
,没有理由使用--packages
旗帜。