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

tri*_*oid 49 hadoop amazon-s3 apache-spark

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

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

有没有人成功地使两者都有效?

cfe*_*uke 46

经历了第三手s3a和s3n之间的差异 - 在s3a上传输的7.9GB数据大约是7分钟,而s3n上的7.9GB数据花费了73分钟[不幸的是,在这两种情况下,us-east-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. 对于Hadoop的版本,你需要在最初的2.7.1(稳定版)中包含最初似乎是过时的AWS SDK库(2014年版本为1.7.4):aws-java-sdk 1.7 0.4.据我所知,使用它与特定的AWS SDK JARs for 1.10.8没有破坏任何东西.

  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
    
    Run Code Online (Sandbox Code Playgroud)

我已经通过这个过程完成了我写的一篇文章,详细列出了这个列表.此外,我已经涵盖了我在此过程中遇到的所有异常情况以及我认为是每种情况的原因以及如何解决它们.

  • 这对我很有帮助.我最后添加的唯一依赖是"org.apache.hadoop"%"hadoop-aws"%"3.0.0-alpha2",地址是https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws/ 3.0.0-α-2 (4认同)

mrs*_*vas 16

我写这个答案与访问文件S3A星火2.0.1的Hadoop 2.7.3

复制默认情况下随Hadoop一起提供的AWS jar(hadoop-aws-2.7.3.jaraws-java-sdk-1.7.4.jar)

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

     find / -name hadoop-aws*.jar
     find / -name aws-java-sdk*.jar
    
    Run Code Online (Sandbox Code Playgroud)

进入火花类路径,其中包含所有火花罐

  • 提示:我们不能直接指向位置(它必须在属性文件中),因为我想要为发行版和Linux风格做出通用答案.spark classpath可以通过下面的find命令识别

     find / -name spark-core*.jar
    
    Run Code Online (Sandbox Code Playgroud)

spark-defaults.conf

提示:(大多数情况下会被放入/etc/spark/conf/spark-defaults.conf)

#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.
Run Code Online (Sandbox Code Playgroud)

如果需要,在spark提交中包括jar(aws-java-sdkhadoop-aws)--driver-class-path.

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
Run Code Online (Sandbox Code Playgroud)

注意:

在运行find命令之前,请确保Linux用户具有读取权限, 以防止错误权限被拒绝


Chr*_*rts 13

我使用带有hadoop 2.6的Spark 1.4.1预构建二进制文件,确保你设置它们spark.driver.extraClassPathspark.executor.extraClassPath指向两个jar(hadoop-aws和aws-java-sdk)如果你在集群上运行,请确保你的执行者有权访问到群集上的jar文件.


小智 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
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ran 7

以下是截至2016年10月的细节,如Spark Summit EU:Apache Spark和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和S3的文件有可能是利益-尤其是在调优选项.