如何指定 AWS 访问密钥 ID 和秘密访问密钥作为 amazon s3n URL 的一部分

问题描述 投票:0回答:8

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

出现以下错误:

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

hadoop amazon-web-services amazon-s3 mapreduce hadoop2
8个回答
40
投票

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

 s3n://ID:SECRET@BUCKET/Path

10
投票

我建议你使用这个:

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

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

之前

8
投票

出于安全考虑,通常不建议将 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

2
投票

对于 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()

0
投票

创建文件

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 的特定于站点的配置 安装

0
投票

将 s3 URI 中的 s3 更改为 s3n


0
投票
hadoop distcp \
  -Dfs.s3a.access.key=<....> \
  -Dfs.s3a.secret.key=<....> \
  -Dfs.s3a.fast.upload=true \
  -update \
  s3a://path to file/ hdfs:///path/

0
投票

s3n://ID:SECRET@BUCKET/路径

像 / 这样的特殊字符可以使用 URLEncode.encode 方法进行转义 例如

String ID = URLEncoder.encode("<AWS_ACCESS_KEY_ID>", StandardCharsets.UTF_8.toString());
String SECRET= URLEncoder.encode("<AWS_SECRET_ACCESS_KEY>", StandardCharsets.UTF_8.toString());
© www.soinside.com 2019 - 2024. All rights reserved.