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

Hadoop 如何将AWS访问密钥ID和秘密访问密钥指定为amazon s3n URL的一部分,hadoop,amazon-web-services,amazon-s3,mapreduce,hadoop2,Hadoop,Amazon Web Services,Amazon S3,Mapreduce,Hadoop2,我将输入和输出文件夹作为参数传递给网页中的mapreduce字数计算程序 获取以下错误: HTTP状态500-请求处理失败;嵌套异常是 java.lang.IllegalArgumentException:AWS访问密钥ID和密码 必须将访问密钥指定为用户名或密码 (分别)的s3n URL,或通过设置fs.s3n.awsAccessKeyId 或fs.s3n.awsSecretAccessKey属性(分别) 文件的格式如下: 我建议你用这个: hadoop distcp \ -Dfs.s3n.a

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

获取以下错误:

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


文件的格式如下:


我建议你用这个:

hadoop distcp \
-Dfs.s3n.awsAccessKeyId=<your_access_id> \ 
-Dfs.s3n.awsSecretAccessKey=<your_access_key> \
s3n://origin hdfs://destinations
hadoop distcp\ -Dfs.s3n.awsAccessKeyId=\ -Dfs.s3n.awsSecretAccessKey=\ s3n://来源hdfs://destinations 它还可以作为在键中出现斜杠的变通方法。
必须严格按照以下顺序提供带有id和访问密钥的参数:disctcp之后和origin之前

通常不建议将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>
对于pyspark初学者:

准备 从
,将其放入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>
例子 导入系统 从随机导入随机 从操作员导入添加 从pyspark.sql导入SparkSession 从pyspark.conf导入SparkConf 如果名称=“\uuuuu main\uuuuuuuu”: """ 用法:S3示例 """ 访问密钥=“” 密钥=“” 火花=火花会话\ 建筑商先生\ .appName(“演示”)\ .getOrCreate() sc=spark.sparkContext #如果使用core-site.xml和env变量,请删除此块 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.s3文件系统”) #从s3获取,返回RDD csv_rdd=spark.sparkContext.textFile(“s3n:///path/to/file.csv”) c=csv_rdd.count() 打印(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~”) 印刷品(c) spark.stop()
创建文件
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>

fs.s3.awsAccessKeyId
您的aws访问密钥id
aws s3密钥id
fs.s3.awsSecretAccessKey
您的aws访问密钥
aws s3密钥
默认情况下,Hadoop指定两个资源,从类路径按顺序加载:

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

不幸的是,如果秘密中有“/”符号,则此操作无效。这是相当频繁的。这是一个已知的老错误,可能在hadoop 2.8中针对s3a协议进行了修复。另一种方法是将密钥放在conf中(但这也有其他的注意事项),它在emr-4.3.0中起作用。Emr-4.4.0和Emr-4,5,0 throw
java.lang.IllegalArgumentException:存储桶名称不能格式化为IP地址
,就好像ID和机密是存储桶名称的一部分一样。Emr-4.6.0抛出
java.lang.IllegalArgumentException:Bucket名称的长度应在3到63个字符之间
。有什么想法吗?不再支持s3n在哪里添加
数据?我的pom.xml似乎不喜欢它。我在CentOS虚拟机上运行Spark作业,安装和配置AWS CLI也没有帮助。将其添加到该文件中:
conf/core site.xml
this
conf/core site.xml
?如果有不同的s3帐户需要不同的密钥怎么办?@prometheus2305不幸的是,我无法解决该问题。不再支持s3n
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>
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()
<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>