如何将AWS Access Key ID和Secret Access Key指定为amazon s3n URL的一部分

时间:2014-07-24 03:48:23

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

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

获得以下错误:

  

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

6 个答案:

答案 0 :(得分:38)

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

 s3n://ID:SECRET@BUCKET/Path

答案 1 :(得分:8)

我建议你用这个:

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

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

答案 2 :(得分:7)

通常不建议将AWS凭证作为Amazon s3n网址的一部分传入,安全性明智。特别是如果将该代码推送到保存服务的存储库(如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

答案 3 :(得分:1)

对于pyspark初学者:

准备

https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws下载jar,
,将其放入火花罐文件夹

那么你可以

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

答案 4 :(得分:0)

创建文件 image: { url: { type: String, required: false }, id: { type: String, required: false } }, 并将其放在类路径中。 在文件中指定

core-site.xml

Hadoop默认情况下指定了两种资源,这些资源是从类路径中按顺序加载的:

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

答案 5 :(得分:0)

将s3 URI中的s3改为s3n