【问题标题】:How to specify AWS Access Key ID and Secret Access Key as part of a amazon s3n URL如何将 AWS 访问密钥 ID 和秘密访问密钥指定为亚马逊 s3n URL 的一部分
【发布时间】:2021-11-20 21:00:50
【问题描述】:

我将输入和输出文件夹作为参数从网页传递给 mapreduce 字数统计程序。

出现以下错误:

HTTP 状态 500 - 请求处理失败;嵌套异常是 java.lang.IllegalArgumentException:AWS 访问密钥 ID 和密钥 必须将访问密钥指定为用户名或密码 (分别)s3n URL,或通过设置 fs.s3n.awsAccessKeyId 或 fs.s3n.awsSecretAccessKey 属性(分别)。

【问题讨论】:

    标签: hadoop amazon-web-services amazon-s3 mapreduce hadoop2


    【解决方案1】:

    文档格式为:http://wiki.apache.org/hadoop/AmazonS3

     s3n://ID:SECRET@BUCKET/Path
    

    【讨论】:

    • 不幸的是,如果密钥中包含“/”,这将不起作用。这是相当频繁的。这是一个古老的已知错误issues.apache.org/jira/browse/HADOOP-3733,可能会在 hadoop 2.8 中针对 s3a 协议进行修复。 issues.apache.org/jira/browse/HADOOP-11573。另一种方法是将密钥放在 conf 中(但这也有其他警告)
    • 它适用于 emr-4.3.0。 Emr-4.4.0 和 emr-4,5,0 抛出 java.lang.IllegalArgumentException: Bucket name must not be formatted as an IP Address,好像 ID 和 SECRET 是存储桶名称的一部分。 Emr-4.6.0 抛出 java.lang.IllegalArgumentException: Bucket name should be between 3 and 63 characters long。有什么想法吗?
    • s3n 不再受支持
    【解决方案2】:

    我建议你使用这个:

    hadoop distcp \
    -Dfs.s3n.awsAccessKeyId=<your_access_id> \ 
    -Dfs.s3n.awsSecretAccessKey=<your_access_key> \
    s3n://origin hdfs://destinations
    

    它还可以作为键中出现斜杠的解决方法。 带有 id 和访问密钥的参数必须完全按以下顺序提供:在 disctcp 之后和 origin

    之前

    【讨论】:

    • s3n 不再受支持
    【解决方案3】:

    出于安全考虑,通常不建议将 AWS 凭证作为 Amazon s3n url 的一部分传递。特别是如果该代码被推送到存储库保存服务(如 github)。理想情况下,将 conf/core-site.xml 中的凭据设置为:

    <configuration>
      <property>
        <name>fs.s3n.awsAccessKeyId</name>
        <value>XXXXXX</value>
      </property>
    
      <property>
        <name>fs.s3n.awsSecretAccessKey</name>
        <value>XXXXXX</value>
      </property>
    </configuration>
    

    或在您的机器上重新安装 awscli。

    pip install awscli
    

    【讨论】:

    • 在哪里添加&lt;configuration&gt; 数据?我的 pom.xml 似乎不喜欢它。我在 CentOS 虚拟机上运行 Spark 作业,安装和配置 AWS CLI 也没有帮助。
    • 添加到这个文件中:conf/core-site.xml
    • 这是什么conf/core-site.xml
    • 如果有不同的 s3 帐户需要不同的密钥怎么办?
    • @prometheus2305 不幸的是我没能解决这个问题。
    【解决方案4】:

    对于 pyspark 初学者:

    准备

    https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws下载jar
    , 把这个放到 spark jars 文件夹里

    那你就可以了

    1。 Hadoop 配置文件

    core-site.xml

    export AWS_ACCESS_KEY_ID=<access-key>
    export AWS_SECRET_ACCESS_KEY=<secret-key>
    
    <configuration>
      <property>
        <name>fs.s3n.impl</name>
        <value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value>
      </property>
    
      <property>
        <name>fs.s3a.impl</name>
        <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
      </property>
    
      <property>
        <name>fs.s3.impl</name>
        <value>org.apache.hadoop.fs.s3.S3FileSystem</value>
      </property>
    </configuration>
    

    2。 pyspark 配置

    sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", access_key)
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", access_key)
    sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", access_key)
    sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", secret_key)
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", secret_key)
    sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", secret_key)
    sc._jsc.hadoopConfiguration().set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    sc._jsc.hadoopConfiguration().set("fs.s3.impl", "org.apache.hadoop.fs.s3.S3FileSystem")
    

    示例

    import sys
    from random import random
    from operator import add
    
    from pyspark.sql import SparkSession
    from pyspark.conf import SparkConf
    
    
    if __name__ == "__main__":
        """
            Usage: S3 sample
        """
        access_key = '<access-key>'
        secret_key = '<secret-key>'
    
        spark = SparkSession\
            .builder\
            .appName("Demo")\
            .getOrCreate()
    
        sc = spark.sparkContext
    
        # remove this block if use core-site.xml and env variable
        sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", access_key)
        sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", access_key)
        sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", access_key)
        sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", secret_key)
        sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", secret_key)
        sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", secret_key)
        sc._jsc.hadoopConfiguration().set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
        sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
        sc._jsc.hadoopConfiguration().set("fs.s3.impl", "org.apache.hadoop.fs.s3.S3FileSystem")
    
        # fetch from s3, returns RDD
        csv_rdd = spark.sparkContext.textFile("s3n://<bucket-name>/path/to/file.csv")
        c = csv_rdd.count()
        print("~~~~~~~~~~~~~~~~~~~~~count~~~~~~~~~~~~~~~~~~~~~")
        print(c)
    
        spark.stop()
    

    【讨论】:

      【解决方案5】:

      创建文件core-site.xml 并将其放在类路径中。 在文件中指定

      <configuration>
          <property>
              <name>fs.s3.awsAccessKeyId</name>
              <value>your aws access key id</value>
              <description>
                  aws s3 key id
              </description>
          </property>
      
          <property>
              <name>fs.s3.awsSecretAccessKey</name>
              <value>your aws access key</value>
              <description>
                  aws s3 key
              </description>
          </property>
      </configuration>
      

      Hadoop 默认指定两个资源,从类路径中按顺序加载:

      • core-default.xml:hadoop 的只读默认值
      • core-site.xml:给定 hadoop 的特定于站点的配置 安装

      【讨论】:

        【解决方案6】:

        在 s3 URI 中将 s3 改为 s3n

        【讨论】:

        • 请尽量给出正确的答案解释。
        【解决方案7】:
        hadoop distcp \
          -Dfs.s3a.access.key=<....> \
          -Dfs.s3a.secret.key=<....> \
          -Dfs.s3a.fast.upload=true \
          -update \
          s3a://path to file/ hdfs:///path/
        

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 2015-12-09
        • 1970-01-01
        • 2017-10-02
        • 2021-12-25
        • 2020-11-28
        • 1970-01-01
        相关资源
        最近更新 更多