从Spark 2.0访问S3

时间:2016-09-20 23:35:35

标签: hadoop apache-spark amazon-s3

我试图从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程序集构建一个超级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:Job   由于阶段失败而中止:阶段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(FileSystem.java:2651)     在org.apache.hadoop.fs.FileSystem.access $ 200(FileSystem.java:92)at   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)at   org.apache.spark.util.Utils $ .getHadoopFileSystem(Utils.scala:1726)at at   org.apache.spark.util.Utils $ .doFetchFile(Utils.scala:662)at at   org.apache.spark.util.Utils $ .fetchFile(Utils.scala:446)at at   org.apache.spark.executor.Executor $$ anonfun $ $有机阿帕奇$ $火花执行人$ $$执行人$ updateDependencies 3.apply(Executor.scala:476)

驱动程序似乎能够从S3中读取而没有问题但不是工作人员/执行者......我不明白为什么我的uberjar不够。

但是,我尝试使用以下方法配置spark-submit也没有成功:

  

- package com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3

PS:如果我切换到s3n协议,我得到以下异常:

  

java.io.IOException:没有用于scheme的文件系统:s3n

2 个答案:

答案 0 :(得分:6)

如果您想使用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都在驱动程序 worker 类路径上,并确保将它们分发到工作节点通过--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 \

此外,如果您正在构建您的超级JAR并包含aws-java-sdkhadoop-aws,则无理由使用--packages标记。

答案 1 :(得分:1)

实际上所有火花的操作都在工作。并在master上设置这些配置,这样一旦你可以尝试在mapPartition上配置s3的应用程序{ }