如何从Apache Spark访问s3a://文件?

时间:2015-05-21 23:24:05

标签: hadoop apache-spark amazon-s3

Hadoop 2.6不支持开箱即用的s3a,所以我尝试了一系列解决方案和修复,包括:

使用hadoop-aws和aws-java-sdk =>进行部署无法读取凭据的环境变量 将hadoop-aws添加到maven =>各种传递性依赖冲突

有没有人成功同时工作?

10 个答案:

答案 0 :(得分:40)

亲身经历了s3a和s3n之间的差异 - 在s3a上传输的7.9GB数据大约是7分钟,而s3n上的7.9GB数据需要73分钟[不幸的是,我们 - 东 - 1到us-west-1两种情况; Redshift和Lambda在这个时候是us-east-1]这是一个非常重要的堆栈,以便得到正确的,并且值得沮丧。

截至2015年12月,以下是关键部分:

  1. 您的Spark群集需要Hadoop 2.x或更高版本。如果你使用Spark EC2设置脚本并且可能错过了它,那么使用1.0以外的东西的开关是指定--hadoop-major-version 2(在撰写本文时使用CDH 4.2)。

  2. 您需要在最初的2.7.1版本的Hadoop版本中包含最初可能是过时的AWS SDK库(2014年版本为1.7.4)。 ):aws-java-sdk 1.7.4。据我所知,使用它以及1.10.8的特定AWS SDK JAR没有破坏任何东西。

  3. 您还需要类路径上的hadoop-aws 2.7.1 JAR。此JAR包含类org.apache.hadoop.fs.s3a.S3AFileSystem

  4. spark.properties中,您可能需要一些如下所示的设置:

    spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem  
    spark.hadoop.fs.s3a.access.key=ACCESSKEY  
    spark.hadoop.fs.s3a.secret.key=SECRETKEY
    
  5. 我在post I wrote上详细详细列出了这个列表,因为我正在通过这个过程。此外,我已经介绍了我遇到的所有异常情况,以及我认为是每种情况的原因以及如何解决它们。

答案 1 :(得分:13)

我使用带有hadoop 2.6的Spark 1.4.1预构建二进制文件 确保将spark.driver.extraClassPathspark.executor.extraClassPath都指向两个罐子(hadoop-aws和aws-java-sdk) 如果在群集上运行,请确保执行程序可以访问群集上的jar文件。

答案 2 :(得分:13)

我正在编写此答案,以便在 Hadoop 2.7.3

Spark 2.0.1 中访问 S3A 文件

默认情况下复制随Hadoop附带的AWS jar(hadoop-aws-2.7.3.jaraws-java-sdk-1.7.4.jar

  • 提示:如果jar位置不确定?以特权用户身份运行find命令可能会有所帮助,命令可以是..

     find / -name hadoop-aws*.jar
     find / -name aws-java-sdk*.jar
    

进入 spark classpath ,其中包含所有火花罐

  • 提示:我们无法直接指向位置(它必须位于属性文件中),因为我希望对发行版和Linux版本进行通用回答。 spark classpath 可以通过下面的find命令识别

     find / -name spark-core*.jar
    
<{1}} 中的

提示:(通常会将其放在spark-defaults.conf

/etc/spark/conf/spark-defaults.conf
如果需要,

in spark submit会在#make sure jars are added to CLASSPATH spark.yarn.jars=file://{spark/home/dir}/jars/*.jar,file://{hadoop/install/dir}/share/hadoop/tools/lib/*.jar spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem spark.hadoop.fs.s3a.access.key={s3a.access.key} spark.hadoop.fs.s3a.secret.key={s3a.secret.key} #you can set above 3 properties in hadoop level `core-site.xml` as well by removing spark prefix. 中包含jars(aws-java-sdkhadoop-aws)。

--driver-class-path
  

注意:

     

在运行之前确保具有读取权限的Linux用户   spark-submit --master yarn \ --driver-class-path {spark/jars/home/dir}/aws-java-sdk-1.7.4.jar \ --driver-class-path {spark/jars/home/dir}/hadoop-aws-2.7.3.jar \ other options 命令用于防止错误权限被拒绝

答案 3 :(得分:9)

我们正在使用带有Mesos的spark 1.6.1,并且我们从spark写入S3时遇到了很多问题。我赞同cfeduke的答案。我做的微小改动是将maven坐标添加到spark-defaults.conf文件中的spark.jar配置中。我尝试使用hadoop-aws:2.7.2但仍然遇到很多错误,所以我们回到了2.7.1。以下是spark-defaults.conf中对我们有用的更改:

spark.jars.packages             net.java.dev.jets3t:jets3t:0.9.0,com.google.guava:guava:16.0.1,com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.1
spark.hadoop.fs.s3a.impl        org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key  <MY ACCESS KEY>
spark.hadoop.fs.s3a.secret.key  <MY SECRET KEY>
spark.hadoop.fs.s3a.fast.upload true

感谢cfeduke花时间写你的帖子。这非常有帮助。

答案 4 :(得分:7)

以下是截至2016年10月的细节,如Spark Summit EU所示:Apache Spark and Object Stores

关键点

  • 由于数据损坏的风险/经验,直接输出提交者已从Spark 2.0中消失。
  • FileOutputCommitter上有一些设置可以减少重命名,但不能消除它们
  • 我和一些同事一起做O(1)提交者,依靠Apache Dynamo为我们提供所需的一致性。
  • 要使用S3a,请将您的类路径设为正确。
  • 使用Hadoop 2.7.z; 2.6.x遇到了一些问题,然后由HADOOP-11571解决了。
  • 在SPARK-7481下有一个公关将所有东西都拉成你自己建造的火花发行版。否则,请询问谁向二进制文件供应工作。
  • Hadoop 2.8将添加主要的性能提升HADOOP-11694

产品展示:HADOOP-11694的读取性能方面包含在HDP2.5中; Spark and S3 documentation可能会引起人们的兴趣 - 特别是调整选项。

答案 5 :(得分:4)

使用预先构建的Hadoop 2.6的Spark 1.4.1,通过从Hadoop添加hadoop-aws和aws-java-sdk jar文件,我可以在部署到Spark Standalone集群时使s3a://工作2.7.1发行版(在Hadoop 2.7.1的$ HADOOP_HOME / share / hadoop / tools / lib下找到)到我的$ SPARK_HOME / conf / spark-env.sh文件中的SPARK_CLASSPATH环境变量。

答案 6 :(得分:4)

正如你所说,hadoop 2.6并不支持s3a,而最新的spark 1.6.1并不支持hadoop 2.7,但是对于hadoop 2.7和s3a来说,spark 2.0绝对没问题。

对于spark 1.6.x,我们用EMR的s3驱动程序做了一些肮脏的黑客攻击......你可以看一下这个文档:https://github.com/zalando/spark-appliance#emrfs-support

如果您仍想尝试在spark 1.6.x中使用s3a,请参阅此处的答案:https://stackoverflow.com/a/37487407/5630352

答案 7 :(得分:2)

您还可以使用spark-defaults.conf将S3A依赖项添加到类路径中。

示例:

spark.driver.extraClassPath     /usr/local/spark/jars/hadoop-aws-2.7.5.jar
spark.executor.extraClassPath   /usr/local/spark/jars/hadoop-aws-2.7.5.jar
spark.driver.extraClassPath     /usr/local/spark/jars/aws-java-sdk-1.7.4.jar
spark.executor.extraClassPath   /usr/local/spark/jars/aws-java-sdk-1.7.4.jar

或者只是:

spark.jars     /usr/local/spark/jars/hadoop-aws-2.7.5.jar,/usr/local/spark/jars/aws-java-sdk-1.7.4.jar

确保将您的AWS开发工具包版本与Hadoop版本相匹配。有关此问题的更多信息,请查看以下答案:Unable to access S3 data using Spark 2.2

答案 8 :(得分:2)

这是pyspark(可能带代理)的解决方案:

def _configure_s3_protocol(spark, proxy=props["proxy"]["host"], port=props["proxy"]["port"], endpoint=props["s3endpoint"]["irland"]):
    """
    Configure access to the protocol s3
    https://sparkour.urizone.net/recipes/using-s3/
    AWS Regions and Endpoints
    https://docs.aws.amazon.com/general/latest/gr/rande.html
    """
    sc = spark.sparkContext
    sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    sc._jsc.hadoopConfiguration().set("fs.s3a.access.key",  os.environ.get("AWS_ACCESS_KEY_ID"))
    sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY"))
    sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.host", proxy)
    sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.port", port)
    sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", endpoint)
    return spark

答案 9 :(得分:-1)

我正在使用spark版本2.3,当我使用spark保存数据集时:

dataset.write().format("hive").option("fileFormat", "orc").mode(SaveMode.Overwrite)
    .option("path", "s3://reporting/default/temp/job_application")
    .saveAsTable("job_application");

它完美运行并将我的数据保存到s3中。