Hadoop 如何从ApacheSpark访问s3a://文件?

Hadoop 如何从ApacheSpark访问s3a://文件?,hadoop,apache-spark,amazon-s3,Hadoop,Apache Spark,Amazon S3,Hadoop 2.6不支持即时可用的s3a,因此我尝试了一系列解决方案和修复,包括: 使用hadoop aws和aws java sdk部署=>无法读取环境变量的凭据 将hadoop aws添加到maven=>各种可传递的依赖冲突中 有人成功地使这两个都工作了吗?使用Hadoop 2.6预构建的Spark 1.4.1,我可以通过添加Hadoop 2.7.1发行版中的Hadoop aws和aws java sdk jar文件(在Hadoop 2.7.1的$Hadoop_HOME/share/Had

Hadoop 2.6不支持即时可用的s3a,因此我尝试了一系列解决方案和修复,包括:

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


有人成功地使这两个都工作了吗?

使用Hadoop 2.6预构建的Spark 1.4.1,我可以通过添加Hadoop 2.7.1发行版中的Hadoop aws和aws java sdk jar文件(在Hadoop 2.7.1的$Hadoop_HOME/share/Hadoop/tools/lib下找到)使s3a://在部署到Spark独立集群时工作到$SPARK\u HOME/conf/SPARK-env.sh文件中的SPARK\u CLASSPATH环境变量。

我使用了带hadoop 2.6的SPARK 1.4.1预构建二进制文件 确保将
spark.driver.extraClassPath
spark.executor.extraClassPath
都设置为指向两个JAR(hadoop aws和aws java sdk)
如果您在集群上运行,请确保您的执行者能够访问集群上的jar文件。

亲身体验了s3a和s3n之间的差异,s3a上传输的7.9GB数据大约需要7分钟,而s3n上传输的7.9GB数据需要73分钟[us-east-1到us-west-1不幸的是,在这两种情况下;红移和Lambda此时都是us-east-1]这是非常重要的一部分,需要纠正,值得沮丧

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

  • 您的Spark群集将需要Hadoop版本2.x或更高版本。如果您使用Spark EC2安装脚本,但可能没有使用它,则使用1.0以外的工具的切换是指定
    --Hadoop主要版本2
    (在撰写本文时使用CDH 4.2)

  • 对于最晚2.7.1(稳定版)的Hadoop版本,您需要包括一个可能在一开始看起来已经过时的AWS SDK库(2014年构建为1.7.4版):AWS java SDK 1.7.4。据我所知,将其与1.10.8的特定AWS SDK JAR一起使用并没有破坏任何东西

  • 在类路径上还需要hadoop aws 2.7.1 JAR。这个JAR包含类
    org.apache.hadoop.fs.s3a.S3AFileSystem

  • spark.properties
    中,您可能需要如下设置:

    spark.hadoop.fs.s3a.access.key=ACCESSKEY spark.hadoop.fs.s3a.secret.key=SECRETKEY

  • 如果您将hadoop 2.7版本与spark一起使用,那么aws客户端将使用V2作为默认身份验证签名。并且所有新的aws区域仅支持V4协议。要使用V4,请在spark submit中传递这些配置,并且必须指定端点(format-
    s3..amazonaws.com

  • --conf“spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true

    --conf“spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true


    我在一个网站上更详细地介绍了这个列表,因为我在这个过程中一直在努力。此外,我还介绍了我在这个过程中遇到的所有异常情况,以及我认为每种情况的原因和解决方法。

    我们在Mesos上使用了spark 1.6.1,我们从spark那里收到了很多问题。我要感谢cfeduke为了回答这个问题,我做了一个小小的改变,就是在spark-defaults.conf文件中的spark.jar配置中添加了maven坐标。我尝试使用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.access.key  <MY ACCESS KEY>
    spark.hadoop.fs.s3a.secret.key  <MY SECRET KEY>
    spark.hadoop.fs.s3a.fast.upload true
    
    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.access.key
    spark.hadoop.fs.s3a.secret.key
    spark.hadoop.fs.s3a.fast.upload true
    

    感谢您抽出时间撰写您的帖子。这非常有帮助。

    正如您所说,hadoop 2.6不支持s3a,最新的spark 1.6.1版本不支持hadoop 2.7,但spark 2.0与hadoop 2.7和s3a绝对没有问题

    对于spark 1.6.x,我们使用来自EMR的s3驱动程序进行了一些肮脏的攻击…您可以查看以下文档:


    如果您仍想尝试在spark 1.6.x中使用s3a,请参阅此处的答案:

    以下是截至2016年10月的详细信息,如spark Summit EU所示:

    要点

    • 由于存在数据损坏的风险/经验,直接输出提交人不再使用Spark 2.0
    • FileOutputCommitter上有一些设置可以减少重命名,但不能消除重命名
    • 我正在和一些同事一起做一个O(1)提交者,依靠ApacheDynamo为我们提供我们需要的一致性
    • 要使用S3a,请正确设置类路径
    • 在Hadoop2.7.z上;2.6.x有一些问题,这些问题在那时已经解决了
    • SPARK-7481下有一个PR,可以把所有东西都放到你自己构建的SPARK发行版中。否则,请提供二进制文件的人来完成这项工作
    • Hadoop2.8将添加主要的性能改进

    产品植入:HDP2.5中包含了HADOOP-11694的读取性能方面;其中可能有令人感兴趣的部分-尤其是调谐选项。

    我写这个答案是为了从HADOOP 2.7.3上的Spark 2.0.1访问带有S3A的文件

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

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

        find / -name hadoop-aws*.jar
        find / -name aws-java-sdk*.jar
      
    进入容纳所有火花罐的火花类路径

    • 提示:我们不能直接指出位置(它必须在属性文件中),因为我想为发行版和Linux版本提供一个通用的答案。spark类路径可以
        find / -name spark-core*.jar
      
      #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.
      
      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
      
      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
      
      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.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
      
      dataset.write().format("hive").option("fileFormat", "orc").mode(SaveMode.Overwrite)
          .option("path", "s3://reporting/default/temp/job_application")
          .saveAsTable("job_application");