从spark 2.0访问s3

vybvopom  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(438)

我正在尝试从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没有文件系统

8iwquhpp

8iwquhpp1#

实际上,spark的所有操作都是针对工人的。然后在master上设置这些配置,这样一旦您可以尝试在mappartition{}上应用s3的配置

shyt4zoc

shyt4zoc2#

如果你想用 s3n :

sc.hadoopConfiguration.set("fs.s3n.impl","org.apache.hadoop.fs.s3native.NativeS3FileSystem")
sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", accessKey)
sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", secretKey)

现在,关于这个异常,您需要确保两个jar都位于驱动程序和工作类路径上,并且如果您通过 --jars 标志:

spark-submit \
--conf "spark.driver.extraClassPath=/location/to/aws-java-sdk.jar" \
--conf "spark.driver.extraClassPath=/location/to/hadoop-aws.jar" \
--jars /location/to/aws-java-sdk.jar,/location/to/hadoop-aws.jar \

另外,如果你正在构建你的uberjar,包括 aws-java-sdk 以及 hadoop-aws ,没有理由使用 --packages 旗帜。

相关问题